From 8487318f117e786c2ba196ba050b29617ed6b80e Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 24 Jan 2026 12:14:37 -0500 Subject: [PATCH 1/9] i18n(de): Crowdin translations --- public/content/translations/de/about/index.md | 114 +- .../translations/de/ai-agents/index.md | 143 ++ .../content/translations/de/bridges/index.md | 78 +- .../de/community/code-of-conduct/index.md | 32 +- .../de/community/events/organizing/index.md | 221 ++ .../de/community/get-involved/index.md | 124 +- .../translations/de/community/grants/index.md | 73 +- .../de/community/language-resources/index.md | 138 +- .../translations/de/community/online/index.md | 73 +- .../de/community/research/index.md | 14 +- .../de/community/support/index.md | 39 +- .../adding-desci-projects/index.md | 38 +- .../adding-developer-tools/index.md | 10 +- .../de/contributing/adding-exchanges/index.md | 12 +- .../adding-glossary-terms/index.md | 8 +- .../de/contributing/adding-layer-2s/index.md | 24 +- .../de/contributing/adding-products/index.md | 56 +- .../de/contributing/adding-resources/index.md | 53 + .../adding-staking-products/index.md | 36 +- .../de/contributing/adding-wallets/index.md | 73 +- .../contributing/content-resources/index.md | 8 +- .../contributing/design-principles/index.md | 72 +- .../design/adding-design-resources/index.md | 4 +- .../de/contributing/design/index.md | 48 +- .../translations/de/contributing/index.md | 117 +- .../de/contributing/quizzes/index.md | 8 +- .../translation-program/faq/index.md | 42 +- .../how-to-translate/index.md | 34 +- .../contributing/translation-program/index.md | 49 +- .../translation-program/playbook/index.md | 317 +++ .../translation-program/resources/index.md | 47 +- .../translatathon/details/index.md | 90 + .../translatathon/index.md | 100 + .../translators-guide/index.md | 86 +- public/content/translations/de/dao/index.md | 101 +- .../de/decentralized-identity/index.md | 151 +- public/content/translations/de/defi/index.md | 140 +- public/content/translations/de/desci/index.md | 116 +- .../de/developers/docs/accounts/index.md | 57 +- .../de/developers/docs/apis/backend/index.md | 98 +- .../developers/docs/apis/javascript/index.md | 126 +- .../de/developers/docs/apis/json-rpc/index.md | 847 ++++--- .../de/developers/docs/blocks/index.md | 147 +- .../de/developers/docs/bridges/index.md | 138 ++ .../docs/consensus-mechanisms/index.md | 36 +- .../docs/consensus-mechanisms/poa/index.md | 3 +- .../pos/attack-and-defense/index.md | 89 +- .../pos/attestations/index.md | 48 +- .../pos/block-proposal/index.md | 28 +- .../consensus-mechanisms/pos/faqs/index.md | 52 +- .../consensus-mechanisms/pos/gasper/index.md | 12 +- .../docs/consensus-mechanisms/pos/index.md | 62 +- .../consensus-mechanisms/pos/keys/index.md | 54 +- .../pos/pos-vs-pow/index.md | 22 +- .../pos/rewards-and-penalties/index.md | 57 +- .../pos/weak-subjectivity/index.md | 20 +- .../docs/consensus-mechanisms/pow/index.md | 34 +- .../consensus-mechanisms/pow/mining/index.md | 32 +- .../dagger-hashimoto/index.md | 99 +- .../mining/mining-algorithms/ethash/index.md | 611 +++-- .../pow/mining/mining-algorithms/index.md | 22 +- .../de/developers/docs/dapps/index.md | 66 +- .../block-explorers/index.md | 56 +- .../docs/data-and-analytics/index.md | 64 +- .../index.md | 118 + .../docs/data-availability/index.md | 84 + .../data-structures-and-encoding/index.md | 32 + .../patricia-merkle-trie/index.md | 266 +++ .../data-structures-and-encoding/rlp/index.md | 163 ++ .../data-structures-and-encoding/ssz/index.md | 150 ++ .../web3-secret-storage/index.md | 195 ++ .../dex-design-best-practice/index.md | 220 ++ .../heuristics-for-web3/index.md | 138 ++ .../de/developers/docs/design-and-ux/index.md | 86 + .../docs/development-networks/index.md | 26 +- .../developers/docs/ethereum-stack/index.md | 24 +- .../de/developers/docs/evm/index.md | 58 +- .../de/developers/docs/evm/opcodes/index.md | 327 +-- .../de/developers/docs/frameworks/index.md | 74 +- .../de/developers/docs/gas/index.md | 117 +- .../de/developers/docs/ides/index.md | 37 +- .../translations/de/developers/docs/index.md | 6 +- .../developers/docs/intro-to-ether/index.md | 44 +- .../docs/intro-to-ethereum/index.md | 38 +- .../de/developers/docs/mev/index.md | 171 +- .../developers/docs/networking-layer/index.md | 163 ++ .../network-addresses/index.md | 39 + .../networking-layer/portal-network/index.md | 89 + .../de/developers/docs/networks/index.md | 159 +- .../nodes-and-clients/archive-nodes/index.md | 39 +- .../docs/nodes-and-clients/bootnodes/index.md | 12 +- .../client-diversity/index.md | 105 +- .../docs/nodes-and-clients/index.md | 174 +- .../nodes-and-clients/light-clients/index.md | 28 +- .../node-architecture/index.md | 38 +- .../nodes-as-a-service/index.md | 148 +- .../nodes-and-clients/run-a-node/index.md | 216 +- .../de/developers/docs/oracles/index.md | 294 +-- .../docs/programming-languages/dart/index.md | 32 +- .../programming-languages/delphi/index.md | 32 +- .../programming-languages/dot-net/index.md | 82 +- .../programming-languages/elixir/index.md | 55 + .../programming-languages/golang/index.md | 80 +- .../docs/programming-languages/index.md | 11 +- .../docs/programming-languages/java/index.md | 53 +- .../programming-languages/javascript/index.md | 43 +- .../programming-languages/python/index.md | 97 +- .../docs/programming-languages/ruby/index.md | 46 +- .../docs/programming-languages/rust/index.md | 58 +- .../de/developers/docs/scaling/index.md | 74 +- .../docs/scaling/optimistic-rollups/index.md | 263 ++- .../developers/docs/scaling/plasma/index.md | 171 +- .../docs/scaling/sidechains/index.md | 68 +- .../docs/scaling/state-channels/index.md | 259 ++- .../developers/docs/scaling/validium/index.md | 165 +- .../docs/scaling/zk-rollups/index.md | 255 ++- .../docs/smart-contracts/anatomy/index.md | 382 ++-- .../docs/smart-contracts/compiling/index.md | 20 +- .../smart-contracts/composability/index.md | 44 +- .../docs/smart-contracts/deploying/index.md | 46 +- .../formal-verification/index.md | 133 +- .../developers/docs/smart-contracts/index.md | 50 +- .../docs/smart-contracts/languages/index.md | 163 +- .../docs/smart-contracts/libraries/index.md | 52 +- .../docs/smart-contracts/naming/index.md | 101 + .../docs/smart-contracts/security/index.md | 322 ++- .../docs/smart-contracts/testing/index.md | 162 +- .../docs/smart-contracts/upgrading/index.md | 62 +- .../docs/smart-contracts/verifying/index.md | 58 +- .../de/developers/docs/standards/index.md | 55 +- .../docs/standards/tokens/erc-1155/index.md | 66 +- .../docs/standards/tokens/erc-1363/index.md | 203 ++ .../docs/standards/tokens/erc-20/index.md | 79 +- .../docs/standards/tokens/erc-223/index.md | 197 ++ .../docs/standards/tokens/erc-4626/index.md | 227 ++ .../docs/standards/tokens/erc-721/index.md | 134 +- .../docs/standards/tokens/erc-777/index.md | 22 +- .../developers/docs/standards/tokens/index.md | 32 +- .../de/developers/docs/storage/index.md | 103 +- .../de/developers/docs/transactions/index.md | 102 +- .../de/developers/docs/web2-vs-web3/index.md | 40 +- .../index.md | 199 +- .../tutorials/all-you-can-cache/index.md | 866 ++++++++ .../developers/tutorials/app-plasma/index.md | 1261 +++++++++++ .../index.md | 34 +- .../index.md | 585 +++++ .../index.md | 101 + .../index.md | 372 ++++ .../index.md | 144 ++ .../index.md | 129 ++ .../erc-721-vyper-annotated-code/index.md | 715 ++++++ .../tutorials/erc20-annotated-code/index.md | 930 ++++++++ .../erc20-with-safety-rails/index.md | 217 ++ .../tutorials/ethereum-for-web2-auth/index.md | 886 ++++++++ .../index.md | 156 ++ .../index.md | 102 + .../index.md | 1543 +++++++++++++ .../hello-world-smart-contract/index.md | 231 +- .../index.md | 145 ++ .../tutorials/how-to-mint-an-nft/index.md | 189 +- .../index.md | 108 + .../index.md | 709 ++++++ .../index.md | 522 +++++ .../index.md | 239 ++ .../how-to-use-tellor-as-your-oracle/index.md | 81 + .../how-to-view-nft-in-metamask/index.md | 35 +- .../how-to-write-and-deploy-an-nft/index.md | 195 +- .../index.md | 179 ++ .../tutorials/ipfs-decentralized-ui/index.md | 73 + .../index.md | 111 + .../index.md | 269 +++ .../logging-events-smart-contracts/index.md | 68 + .../index.md | 249 +++ .../index.md | 151 ++ .../developers/tutorials/nft-minter/index.md | 876 ++++++++ .../index.md | 1357 ++++++++++++ .../reverse-engineering-a-contract/index.md | 744 +++++++ .../tutorials/run-node-raspberry-pi/index.md | 311 +-- .../tutorials/scam-token-tricks/index.md | 470 ++++ .../tutorials/secret-state/index.md | 741 +++++++ .../secure-development-workflow/index.md | 52 + .../tutorials/send-token-ethersjs/index.md | 210 ++ .../index.md | 208 ++ .../tutorials/server-components/index.md | 295 +++ .../index.md | 92 + .../developers/tutorials/short-abi/index.md | 585 +++++ .../index.md | 91 + .../tutorials/stealth-addr/index.md | 443 ++++ .../index.md | 314 +++ .../token-integration-checklist/index.md | 86 + .../index.md | 99 +- .../index.md | 43 +- .../uniswap-v2-annotated-code/index.md | 1971 +++++++++++++++++ .../tutorials/using-websockets/index.md | 245 ++ .../index.md | 300 +++ .../index.md | 204 ++ .../index.md | 205 ++ .../tutorials/yellow-paper-evm/index.md | 278 +++ public/content/translations/de/eips/index.md | 41 +- .../de/energy-consumption/index.md | 65 +- .../translations/de/eth/supply/index.md | 80 + .../translations/de/ethereum-forks/index.md | 326 ++- .../translations/de/foundation/index.md | 16 +- .../content/translations/de/gaming/index.md | 70 + .../content/translations/de/glossary/index.md | 1034 ++------- .../translations/de/governance/index.md | 100 +- .../index.md | 15 +- .../de/guides/how-to-id-scam-tokens/index.md | 52 +- .../how-to-revoke-token-access/index.md | 24 +- .../de/guides/how-to-swap-tokens/index.md | 20 +- .../de/guides/how-to-use-a-bridge/index.md | 25 +- .../de/guides/how-to-use-a-wallet/index.md | 20 +- .../content/translations/de/guides/index.md | 12 +- public/content/translations/de/nft/index.md | 60 +- .../content/translations/de/payments/index.md | 208 ++ .../de/prediction-markets/index.md | 85 + .../content/translations/de/privacy/index.md | 97 + .../de/real-world-assets/index.md | 93 + public/content/translations/de/refi/index.md | 40 +- .../translations/de/restaking/index.md | 188 ++ .../de/roadmap/account-abstraction/index.md | 109 +- .../de/roadmap/beacon-chain/index.md | 39 +- .../de/roadmap/danksharding/index.md | 48 +- .../translations/de/roadmap/dencun/index.md | 14 +- .../translations/de/roadmap/fusaka/index.md | 300 +++ .../de/roadmap/fusaka/peerdas/index.md | 88 + .../de/roadmap/future-proofing/index.md | 37 +- .../translations/de/roadmap/merge/index.md | 94 +- .../de/roadmap/merge/issuance/index.md | 122 +- .../translations/de/roadmap/pbs/index.md | 29 +- .../de/roadmap/pectra/7702/index.md | 149 ++ .../translations/de/roadmap/pectra/index.md | 127 ++ .../de/roadmap/pectra/maxeb/index.md | 204 ++ .../translations/de/roadmap/scaling/index.md | 22 +- .../roadmap/secret-leader-election/index.md | 16 +- .../translations/de/roadmap/security/index.md | 32 +- .../de/roadmap/single-slot-finality/index.md | 35 +- .../de/roadmap/statelessness/index.md | 59 +- .../de/roadmap/user-experience/index.md | 16 +- .../de/roadmap/verkle-trees/index.md | 44 +- .../content/translations/de/security/index.md | 145 +- .../translations/de/smart-contracts/index.md | 32 +- .../translations/de/social-networks/index.md | 110 +- .../translations/de/staking/dvt/index.md | 50 +- .../translations/de/staking/pools/index.md | 45 +- .../translations/de/staking/saas/index.md | 38 +- .../translations/de/staking/solo/index.md | 169 +- .../de/staking/withdrawals/index.md | 106 +- public/content/translations/de/web3/index.md | 82 +- .../translations/de/what-are-apps/index.md | 81 + .../translations/de/whitepaper/index.md | 240 +- .../translations/de/wrapped-eth/index.md | 70 + .../de/zero-knowledge-proofs/index.md | 153 +- src/intl/de/common.json | 8 +- src/intl/de/glossary-tooltip.json | 164 ++ src/intl/de/glossary.json | 408 ++++ src/intl/de/learn-quizzes.json | 321 ++- src/intl/de/page-10-year-anniversary.json | 131 ++ src/intl/de/page-about.json | 29 +- src/intl/de/page-apps.json | 348 +-- src/intl/de/page-assets.json | 13 +- src/intl/de/page-bug-bounty.json | 174 +- src/intl/de/page-collectibles.json | 67 + src/intl/de/page-community-events.json | 1 - src/intl/de/page-community.json | 22 +- ...-translation-program-acknowledgements.json | 16 +- ...ting-translation-program-contributors.json | 2 +- src/intl/de/page-developers-docs.json | 9 +- src/intl/de/page-developers-index.json | 101 +- .../de/page-developers-learning-tools.json | 4 +- .../de/page-developers-local-environment.json | 4 +- src/intl/de/page-developers-tutorials.json | 13 +- src/intl/de/page-energy-consumption.json | 21 + ...thereum-history-founder-and-ownership.json | 65 + src/intl/de/page-ethereum-vs-bitcoin.json | 101 + src/intl/de/page-founders.json | 65 + src/intl/de/page-gas.json | 6 +- src/intl/de/page-get-eth.json | 4 +- src/intl/de/page-history.json | 4 +- src/intl/de/page-layer-2-learn.json | 55 + src/intl/de/page-layer-2-networks.json | 85 + src/intl/de/page-layer-2.json | 61 + src/intl/de/page-learn.json | 20 +- src/intl/de/page-resources.json | 97 + src/intl/de/page-roadmap-vision.json | 4 +- src/intl/de/page-roadmap.json | 102 + src/intl/de/page-run-a-node.json | 1 + src/intl/de/page-stablecoins.json | 76 +- .../de/page-staking-deposit-contract.json | 2 +- src/intl/de/page-staking.json | 24 +- src/intl/de/page-start.json | 38 + .../de/page-trillion-dollar-security.json | 196 ++ src/intl/de/page-upgrades-get-involved.json | 6 +- src/intl/de/page-upgrades-index.json | 14 +- src/intl/de/page-wallets-find-wallet.json | 5 +- src/intl/de/page-wallets.json | 4 +- src/intl/de/page-what-is-ether.json | 100 + src/intl/de/page-what-is-ethereum.json | 309 +-- .../de/page-what-is-the-ethereum-network.json | 89 + src/intl/de/table.json | 4 +- src/intl/de/template-usecase.json | 11 +- 301 files changed, 37317 insertions(+), 8023 deletions(-) create mode 100644 public/content/translations/de/ai-agents/index.md create mode 100644 public/content/translations/de/community/events/organizing/index.md create mode 100644 public/content/translations/de/contributing/adding-resources/index.md create mode 100644 public/content/translations/de/contributing/translation-program/playbook/index.md create mode 100644 public/content/translations/de/contributing/translation-program/translatathon/details/index.md create mode 100644 public/content/translations/de/contributing/translation-program/translatathon/index.md create mode 100644 public/content/translations/de/developers/docs/bridges/index.md create mode 100644 public/content/translations/de/developers/docs/data-availability/blockchain-data-storage-strategies/index.md create mode 100644 public/content/translations/de/developers/docs/data-availability/index.md create mode 100644 public/content/translations/de/developers/docs/data-structures-and-encoding/index.md create mode 100644 public/content/translations/de/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md create mode 100644 public/content/translations/de/developers/docs/data-structures-and-encoding/rlp/index.md create mode 100644 public/content/translations/de/developers/docs/data-structures-and-encoding/ssz/index.md create mode 100644 public/content/translations/de/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md create mode 100644 public/content/translations/de/developers/docs/design-and-ux/dex-design-best-practice/index.md create mode 100644 public/content/translations/de/developers/docs/design-and-ux/heuristics-for-web3/index.md create mode 100644 public/content/translations/de/developers/docs/design-and-ux/index.md create mode 100644 public/content/translations/de/developers/docs/networking-layer/index.md create mode 100644 public/content/translations/de/developers/docs/networking-layer/network-addresses/index.md create mode 100644 public/content/translations/de/developers/docs/networking-layer/portal-network/index.md create mode 100644 public/content/translations/de/developers/docs/programming-languages/elixir/index.md create mode 100644 public/content/translations/de/developers/docs/smart-contracts/naming/index.md create mode 100644 public/content/translations/de/developers/docs/standards/tokens/erc-1363/index.md create mode 100644 public/content/translations/de/developers/docs/standards/tokens/erc-223/index.md create mode 100644 public/content/translations/de/developers/docs/standards/tokens/erc-4626/index.md create mode 100644 public/content/translations/de/developers/tutorials/all-you-can-cache/index.md create mode 100644 public/content/translations/de/developers/tutorials/app-plasma/index.md create mode 100644 public/content/translations/de/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md create mode 100644 public/content/translations/de/developers/tutorials/deploying-your-first-smart-contract/index.md create mode 100644 public/content/translations/de/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md create mode 100644 public/content/translations/de/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md create mode 100644 public/content/translations/de/developers/tutorials/eip-1271-smart-contract-signatures/index.md create mode 100644 public/content/translations/de/developers/tutorials/erc-721-vyper-annotated-code/index.md create mode 100644 public/content/translations/de/developers/tutorials/erc20-annotated-code/index.md create mode 100644 public/content/translations/de/developers/tutorials/erc20-with-safety-rails/index.md create mode 100644 public/content/translations/de/developers/tutorials/ethereum-for-web2-auth/index.md create mode 100644 public/content/translations/de/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md create mode 100644 public/content/translations/de/developers/tutorials/guide-to-smart-contract-security-tools/index.md create mode 100644 public/content/translations/de/developers/tutorials/hello-world-smart-contract-fullstack/index.md create mode 100644 public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md create mode 100644 public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md create mode 100644 public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md create mode 100644 public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md create mode 100644 public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md create mode 100644 public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md create mode 100644 public/content/translations/de/developers/tutorials/interact-with-other-contracts-from-solidity/index.md create mode 100644 public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md create mode 100644 public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md create mode 100644 public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md create mode 100644 public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md create mode 100644 public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md create mode 100644 public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md create mode 100644 public/content/translations/de/developers/tutorials/nft-minter/index.md create mode 100644 public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md create mode 100644 public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md create mode 100644 public/content/translations/de/developers/tutorials/scam-token-tricks/index.md create mode 100644 public/content/translations/de/developers/tutorials/secret-state/index.md create mode 100644 public/content/translations/de/developers/tutorials/secure-development-workflow/index.md create mode 100644 public/content/translations/de/developers/tutorials/send-token-ethersjs/index.md create mode 100644 public/content/translations/de/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md create mode 100644 public/content/translations/de/developers/tutorials/server-components/index.md create mode 100644 public/content/translations/de/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md create mode 100644 public/content/translations/de/developers/tutorials/short-abi/index.md create mode 100644 public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md create mode 100644 public/content/translations/de/developers/tutorials/stealth-addr/index.md create mode 100644 public/content/translations/de/developers/tutorials/the-graph-fixing-web3-data-querying/index.md create mode 100644 public/content/translations/de/developers/tutorials/token-integration-checklist/index.md create mode 100644 public/content/translations/de/developers/tutorials/uniswap-v2-annotated-code/index.md create mode 100644 public/content/translations/de/developers/tutorials/using-websockets/index.md create mode 100644 public/content/translations/de/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md create mode 100644 public/content/translations/de/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md create mode 100644 public/content/translations/de/developers/tutorials/waffle-test-simple-smart-contract/index.md create mode 100644 public/content/translations/de/developers/tutorials/yellow-paper-evm/index.md create mode 100644 public/content/translations/de/eth/supply/index.md create mode 100644 public/content/translations/de/gaming/index.md create mode 100644 public/content/translations/de/payments/index.md create mode 100644 public/content/translations/de/prediction-markets/index.md create mode 100644 public/content/translations/de/privacy/index.md create mode 100644 public/content/translations/de/real-world-assets/index.md create mode 100644 public/content/translations/de/restaking/index.md create mode 100644 public/content/translations/de/roadmap/fusaka/index.md create mode 100644 public/content/translations/de/roadmap/fusaka/peerdas/index.md create mode 100644 public/content/translations/de/roadmap/pectra/7702/index.md create mode 100644 public/content/translations/de/roadmap/pectra/index.md create mode 100644 public/content/translations/de/roadmap/pectra/maxeb/index.md create mode 100644 public/content/translations/de/what-are-apps/index.md create mode 100644 public/content/translations/de/wrapped-eth/index.md create mode 100644 src/intl/de/glossary-tooltip.json create mode 100644 src/intl/de/glossary.json create mode 100644 src/intl/de/page-10-year-anniversary.json create mode 100644 src/intl/de/page-collectibles.json create mode 100644 src/intl/de/page-energy-consumption.json create mode 100644 src/intl/de/page-ethereum-history-founder-and-ownership.json create mode 100644 src/intl/de/page-ethereum-vs-bitcoin.json create mode 100644 src/intl/de/page-founders.json create mode 100644 src/intl/de/page-layer-2-learn.json create mode 100644 src/intl/de/page-layer-2-networks.json create mode 100644 src/intl/de/page-layer-2.json create mode 100644 src/intl/de/page-resources.json create mode 100644 src/intl/de/page-roadmap.json create mode 100644 src/intl/de/page-start.json create mode 100644 src/intl/de/page-trillion-dollar-security.json create mode 100644 src/intl/de/page-what-is-ether.json create mode 100644 src/intl/de/page-what-is-the-ethereum-network.json diff --git a/public/content/translations/de/about/index.md b/public/content/translations/de/about/index.md index 04755506c11..d076295981a 100644 --- a/public/content/translations/de/about/index.md +++ b/public/content/translations/de/about/index.md @@ -4,15 +4,49 @@ description: Über das Team, die Community und die Mission von ethereum.org lang: de --- -# Über Ethereum.org {#about-ethereumorg} +# Über ethereum.org {#about-ethereumorg} -ethereum.org ist eine öffentliche Open-Source-Ressource für die Ethereum-Community, zu der jeder beitragen kann. Wir haben ein kleines Team, dass sich der Pflege und Entwicklung der Seite widmet, die von der [Ethereum Foundation](/foundation/) finanziert wird. +ethereum.org ist eine öffentliche Open-Source-Ressource für die Ethereum-Community, zu der jeder beitragen kann. Wir haben ein kleines Kernteam, das sich der Pflege und Weiterentwicklung der Site widmet – mit Beiträgen von Tausenden Community-Mitgliedern rund um den Globus. -## Unsere Vision {#our-vision} +**Niemand von ethereum.org wird Sie jemals kontaktieren. Antworte nicht.** -### ethereum.orgs Mission ist es, das beste Portal für die wachsende Ethereum-Community zu sein {#mission} +## Ein Hinweis zu Namen {#a-note-on-names} -Wir sind eine Wissensdatenbank, die mit dem Gedanken der Wissensvermittlung rund um Ethereum und seine Kernkonzepte gebaut wurde. Unsere Ziele: +Häufig verwechseln Menschen Bezeichnungen im Ethereum-Ökosystem, was zu Fehlinterpretationen der Funktionsweise von Ethereum führen kann. Hier eine kurze Erläuterung zur Klarstellung: + +### Ethereum {#ethereum} + +Ethereum ist ein öffentliches Netzwerk, eine Blockchain und ein Open-Source-Protokoll, das von einer globalen Community aus Zehntausenden Entwicklern, Knotenbetreibern, ETH-Inhabern und Benutzern betrieben, geregelt und verwaltet wird und sich in deren Besitz befindet. + +[Mehr über Ethereum](/what-is-ethereum/) + +[Mehr über Ethereum-Governance](/governance/) + +### Ether (ETH) {#ether-or-eth} + +Ether (auch bekannt unter seinem Tickersymbol ETH) ist die native Währung, die auf Ethereum versendet wird. ETH wird zur Bezahlung für die Nutzung des Ethereum-Netzwerks benötigt (in Form von Transaktionsgebühren). ETH wird auch zur Sicherung des Netzwerks mit Staking verwendet. Wenn über den Preis von Ethereum gesprochen wird, ist damit ETH als Vermögenswert gemeint. + +[Mehr über ETH](/what-is-ether/) + +[Mehr zum Staking von ETH](/staking/) + +### Ethereum Foundation {#ethereum-foundation} + +Eine gemeinnützige Organisation, ursprünglich durch den Crowdsale von ETH finanziert, der Unterstützung des Netzwerks und Ökosystems von Ethereum verschrieben. + +[Mehr über die Ethereum Foundation](/foundation/) + +### ethereum.org {#ethereum-org} + +Eine öffentliche Open-Source-Website und Bildungsressource für die Ethereum-Community. ethereum.org wird von einem kleinen Kernteam betrieben und von der Ethereum Foundation finanziert. Hinzu kommen die Beiträge Tausender Community-Mitglieder rund um den Globus. + +Diese Seite enthält weitere Informationen über ethereum.org. + +## Unsere Mission {#our-mission} + +**Die Misson von ethereum.org ist es, das beste Portal für die wachsende Ethereum-Community zu sein** + +Wir möchten eine einfach zu verstehende Bildungsressource zu allen Themen rund um Ethereum bieten, die neuen Benutzern dabei helfen soll, sich mit Ethereum und seinen wichtigsten Konzepten vertraut zu machen. Unsere Ziele: - jedem Einsteiger Ethereum erklären - neuen Benutzern den Einstieg mit ETH und Ethereum erleichtern @@ -21,46 +55,80 @@ Wir sind eine Wissensdatenbank, die mit dem Gedanken der Wissensvermittlung rund - von der Community erstellte Ressourcen teilen - in so vielen Sprachen wie möglich über Ethereum informieren -Wir haben einige Kernprinzipien, die uns dabei helfen. +Um diese Aufgabe zu erfüllen, konzentriert sich unser Team auf zwei Hauptziele auf ethereum.org: -## Kernprinzipien {#core-principles} +### 1. Nutzererlebnis für Besucher von ethereum.org verbessern {#visitors} -### 1. ethereum.org ist ein Portal zu Ethereum 🌏 {#core-principles-1} +- Inhalte erweitern, verbessern und stets aktuell halten +- Benutzerfreundlichkeit und Zugänglichkeit durch Lokalisierung und Anwendung von Best Practices in der Webentwicklung verbessern +- Benutzerinteraktion durch Features wie Umfragen, Quiz und Web3-Integrationen steigern +- Die Website übersichtlich und leistungsstark halten + +### 2. Unsere Community von Mitwirkenden vergrößern, stärken und befähigen {#community} -Wir möchten, dass das Interesse unserer Nutzer geweckt und ihre Fragen beantwortet werden. Deshalb muss unser Portal Informationen, "magische Momente" und Links zu den genialen Community-Ressourcen, die es dort draußen gibt, kombinieren. Der Zweck unseres Inhalts ist es, ein Onboarding-Portal und kein Ersatz für die bereits vorhandenen, umfangreichen Ressourcen zu sein. Wir sind sehr daran interessiert, die Ressourcen der Community zu unterstützen und zu integrieren, um diese sichtbarer und besser auffindbar zu machen. +- Die Gesamtzahl der Mitwirkenden auf der Website erhöhen +- Die Bindung der Mitwirkenden durch Engagement, Anerkennung und Belohnungen verbessern +- Community-Mitglieder dabei unterstützen, immer bedeutendere Beiträge zu leisten +- Eine größere Diversität der Beiträge ermöglichen: in den Bereichen Codierung, Inhalt, Design, Übersetzung und Moderation +- Die Codebasis modern, sauber und gut dokumentiert halten -Die [ Ethereum Community](/community/) steht für uns dabei im Mittelpunkt: Wir wollen die Community nicht nur unterstützen, sondern auch im aktiven Austausch mit ihr stehen. Die Website ist nicht nur für die Community, die wir jetzt haben, sondern auch für die Community, in die wir hoffentlich hineinwachsen. Wir müssen uns daran erinnern, dass unsere Gemeinschaft global ist und Menschen mit vielen verschiedenen Sprachen, aus unterschiedlichen Regionen und Kulturen umfasst. +## Grundprinzipien {#core-principles} -### 2. ethereum.org entwickelt sich ständig weiter 🛠 {#core-principles-2} +Wir verfolgen einige Leitprinzipien zur Erfüllung unserer Mission. -Ethereum und die Community entwickeln sich stetig weiter, was sich auch hier, auf ethereum.org, zeigen soll. Aus diesem Grund hat die Website auch ein einfaches Designsystem und eine modulare Struktur. Wir machen interaktive Änderungen, während wir mehr darüber lernen, wie Besucher die Website nutzen und was die Community von ihr erwartet. +### 1. ethereum.org ist ein Portal zu Ethereum 🌏 {#core-principles-1} + +Wir möchten, dass das Interesse unserer Nutzer geweckt und ihre Fragen beantwortet werden. Deshalb muss unser Portal Informationen, „magische Momente“ und Links zu den genialen verfügbaren Community-Ressourcen kombinieren. Der Zweck unseres Inhalts ist es, ein „Onboarding-Portal“ und kein Ersatz für die bereits vorhandenen umfangreichen Ressourcen zu sein. Uns ist es wichtig, die Ressourcen der Community zu unterstützen und zu integrieren, um diese sichtbarer und besser auffindbar zu machen. +[Die Community von Ethereum](/community/) ist das Herzstück von alledem: Wir wollen der Community nicht nur dienen, sondern mit ihr zusammenarbeiten und ihr Feedback berücksichtigen. Die Website steht nicht nur für die Community bereit, die wir jetzt haben, sondern auch für die Community, in die wir hoffentlich hineinwachsen. Wir müssen bedenken, dass unsere Community global ist und Menschen mit vielen verschiedenen Sprachen und aus diversen Regionen und Kulturen umfasst. -Wir sind Open Source, mit einer Gemeinschaft von Mitwirkenden, so dass jeder Änderungen vorschlagen oder uns auch helfen kann. +### 2. ethereum.org entwickelt sich stetig weiter 🛠 {#core-principles-2} -[Erfahre, wie du einen Beitrag leisten kannst](/contributing/) +Ethereum und die Community entwickeln sich stetig weiter – und das wird auch ethereum.org tun. Deshalb hat die Seite ein einfaches Designsystem und eine modulare Struktur. Wir nehmen wiederholt Änderungen vor, während wir mehr darüber lernen, wie Besucher die Site nutzen und was die Community von ihr erwartet. +Wir sind Open Source und haben eine Community aus Mitwirkenden – auch du kannst Änderungen vorschlagen oder uns helfen. +[Mehr zu Beiträgen erfahren](/contributing/) ### 3. ethereum.org ist keine typische Produktwebsite 🦄 {#core-principles-3} -Ethereum ist eine große Sache: Es beinhaltet eine Community, eine Technologie, eine Reihe von Ideen und Ideologien und vieles mehr. Das bedeutet, dass die Website mit vielen verschiedene Anforderungen umgehen muss, von “einem Entwickler, der ein bestimmtes Tool sucht” bis zu “einem Neuankömmling, der gerade ein paar ETH gekauft hat und nicht weiß, was ein 'Wallet' ist”. +Ethereum ist eine große Sache: Es umfasst eine Community, eine Technologie, eine Reihe von Ideen und Ideologien und vieles mehr. +Das bedeutet, dass die Website viele verschiedene Nutzerreisen abdecken muss, von "einem Entwickler, der ein bestimmtes Tool sucht" bis hin zu "einem Neuling, der gerade etwas ETH gekauft hat und nicht weiß, was eine Wallet ist". +"Was ist die beste Website für eine Blockchain-Plattform?" Dies bleibt eine offene Frage – wir sind Pioniere. Um dies aufzubauen, müssen wir experimentieren. + +## Produktfahrplan {#roadmap} + +Um unsere Arbeit zugänglicher zu machen und die Zusammenarbeit in der Community zu fördern, veröffentlicht das Kernteam von ethereum.org eine Übersicht über unsere Fahrplanziele für den [Shape-Up-Zyklus](https://www.productplan.com/glossary/shape-up-method/). -"Was ist die beste Website für eine Blockchain-Plattform?" Dies bleibt eine offene Frage – wir sind Pioniere. Um dies herauszufinden, müssen wir experimentieren. +[Unseren Produktfahrplan für Zyklus 1 2025 ansehen](https://github.com/ethereum/ethereum-org-website/issues/14726) + +**Wie klingt das?** Wir freuen uns immer über Feedback zu unserem Fahrplan – wenn es etwas gibt, an dem wir deiner Meinung nach arbeiten sollten, lass es uns bitte wissen! Wir nehmen Ideen und PRs von allen Community-Mitgliedern dankend an. + +**Möchtest du dich einbringen?** [Erfahre mehr über das Mitwirken](/contributing/), [kontaktiere uns auf X](https://x.com/ethdotorg) oder nimm an den Community-Diskussionen auf [unserem Discord-Server](https://discord.gg/ethereum-org) teil. ## Designprinzipien {#design-principles} -Wir verwenden eine Reihe von [Designprinzipien](/contributing/design-principles/), um unsere Inhalte zu strukturieren und Entscheidungen auf unserer Website zu entwerfen. +Wir verwenden eine Reihe von [Designprinzipien](/contributing/design-principles/), die unsere Entscheidungen zu Inhalten und Design auf der Website leiten. + +## Designsystem {#design-system} + +Wir haben ein [Designsystem](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System?node-id=0%3A1&t=QBt9RkhpPqzE3Aa6-1) entwickelt und veröffentlicht, um Features schneller bereitzustellen und Community-Mitgliedern die Teilnahme am offenen Design von ethereum.org zu ermöglichen. + +Sie möchten mitmachen?[In Figma mitverfolgen](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System), dem [GitHub-Issue](https://github.com/ethereum/ethereum-org-website/issues/6284) folgen und an der Unterhaltung in unserem [#design-Discord-Kanal](https://discord.gg/ethereum-org) teilnehmen. ## Styleguide {#style-guide} -Wir haben einen [Styleguide](/contributing/style-guide/), um bestimmte Aspekte des Schreibens von Inhalten zu standardisieren und den Beitragsprozess so reibungsloser zu gestalten. +Wir haben einen [Styleguide](/contributing/style-guide/), um bestimmte Aspekte des Schreibens von Inhalten zu standardisieren und den Prozess des Mitwirkens reibungsloser zu gestalten. + +Lies unbedingt [unsere Prinzipien](/contributing/design-principles/) und [unseren Styleguide](/contributing/style-guide/), wenn du [zur Seite beitragen](/contributing/) möchtest. + +Wir freuen uns über Feedback zu unseren Design-Prinzipien, dem Design-System und dem Styleguide. Bedenken Sie: ethereum.org ist für die Community, von der Community. -Wir freuen uns über Feedback sowohl zu den Designprinzipien als auch zum Styleguide. Denke daran: ethereum.org ist für die Community, von der Community. +## Lizenz {#license} -Stelle sicher, dass du [unsere Prinzipien](/contributing/design-principles/) und [unseren Styleguide](/contributing/style-guide/) durchgehst, wenn du [zur Website](/contributing/) beitragen möchten. +Die Website ethereum.org ist Open Source und wird unter einer [MIT-Lizenz](https://github.com/ethereum/ethereum-org-website/blob/dev/LICENSE) veröffentlicht, sofern nicht anders angegeben. Mehr zu den [Nutzungsbedingungen](/terms-of-use/) von ethereum.org. ## Offene Stellen {#open-jobs} -Auch wenn dies eine Open-Source-Website ist und jeder daran arbeiten kann, haben wir ein Team, das sich speziell mit ethereum.org und anderen Ethereum-Foundation-Webprojekten befasst. +Auch wenn dies eine Open-Source-Website ist und jeder daran arbeiten kann, haben wir ein Team, das sich speziell mit ethereum.org und anderen Webprojekten der Ethereum Foundation befasst. -Wir werden alle Stellenangebote hier veröffentlichen. Wenn dir keine dieser Rollen zusagt, gehe zu [Discord](https://discord.gg/ethereum-org) und lass uns wissen, wie du mit uns arbeiten möchtest! +Wir werden alle Stellenangebote hier veröffentlichen. Wenn du hier keine Rolle für dich siehst, dann schau auf [unserem Discord-Server](https://discord.gg/ethereum-org) vorbei und lass uns wissen, wie du gerne mit uns zusammenarbeiten würdest! -Siehst du über das ethereum.org-Team hinaus? [Schau dir andere Jobs im Zusammenhang mit Ethereum an](/community/get-involved/#ethereum-jobs/). +Sie sehen über das ethereum.org-Team hinaus? [Sieh dir andere Jobs mit Ethereum-Bezug an](/community/get-involved/#ethereum-jobs/). diff --git a/public/content/translations/de/ai-agents/index.md b/public/content/translations/de/ai-agents/index.md new file mode 100644 index 00000000000..4606aef4bd4 --- /dev/null +++ b/public/content/translations/de/ai-agents/index.md @@ -0,0 +1,143 @@ +--- +title: KI-Agenten +metaTitle: KI-Agenten | KI-Agenten auf Ethereum +description: Ein Überblick über KI-Agenten auf Ethereum +lang: de +template: use-cases +emoji: ":robot:" +sidebarDepth: 2 +image: /images/ai-agents/hero-image.png +alt: An einem Terminaltisch versammelte Menschen +summaryPoint1: KI, die mit der Blockchain interagiert und eigenständig handelt +summaryPoint2: Kontrolliert On-Chain-Wallets und Guthaben +summaryPoint3: Stellt Menschen oder andere Agenten für Arbeit ein +buttons: + - content: Was sind KI-Agenten? + toId: what-are-ai-agents + - content: Agenten erkunden + toId: ai-agents-on-ethereum + isSecondary: false +--- + +Stellen Sie sich vor, Sie könnten Ethereum mit einem KI-Assistenten nutzen, der rund um die Uhr On-Chain-Markttrends analysiert, Fragen beantwortet und sogar Transaktionen in Ihrem Namen ausführt. Willkommen in der Welt der KI-Agenten – intelligente Systeme, die Ihr digitales Leben vereinfachen sollen. + +Auf Ethereum sehen wir Innovationen bei KI-Agenten, die von virtuellen Influencern und autonomen Content-Erstellern bis hin zu Echtzeit-Marktanalyseplattformen reichen. Diese ermächtigen Nutzer, indem sie Erkenntnisse, Unterhaltung und operative Effizienz liefern. + +## Was sind KI-Agenten? {#what-are-ai-agents} + +KI-Agenten sind Softwareprogramme, die künstliche Intelligenz nutzen, um Aufgaben zu erfüllen oder eigene Entscheidungen zu treffen. Sie lernen aus Daten, passen sich Veränderungen an und bewältigen komplexe Aufgaben. Sie arbeiten ohne Unterbrechung und können Chancen sofort erkennen. + +### Wie KI-Agenten mit Blockchains zusammenarbeiten {#how-ai-agents-work-with-blockchains} + +Im traditionellen Finanzwesen arbeiten KI-Agenten oft in zentralisierten Umgebungen mit begrenzten Dateneingaben. Dies behindert ihre Fähigkeit, autonom zu lernen oder Vermögenswerte zu verwalten. + +Im Gegensatz dazu bietet das dezentrale Ökosystem von Ethereum mehrere entscheidende Vorteile: + +- Transparente Daten: Zugang zu Blockchain-Informationen in Echtzeit. +- Echter Besitz von Vermögenswerten: Digitale Vermögenswerte sind vollständig im Besitz von KI-Agenten. +- Robuste On-Chain-Funktionalität: Ermöglicht es KI-Agenten, Transaktionen auszuführen, mit Smart Contracts zu interagieren, Liquidität bereitzustellen und protokollübergreifend zusammenzuarbeiten. + +Diese Faktoren verwandeln KI-Agenten von einfachen Bots in dynamische, sich selbst verbessernde Systeme, die in verschiedenen Sektoren einen erheblichen Mehrwert bieten: + + + + + + + +## Verifizierbare KI {#verifiable-ai} + +KI-Agenten, die off-chain laufen, verhalten sich oft wie „Black Boxes“ – ihre Argumentation, Eingaben und Ausgaben können nicht unabhängig verifiziert werden. Ethereum ändert das. Durch die Verankerung des Agentenverhaltens on-chain können Entwickler Agenten bauen, die _trustless_, _transparent_ und _wirtschaftlich autonom_ sind. Die Aktionen solcher Agenten können geprüft, eingeschränkt und nachgewiesen werden. + +### Verifizierbare Inferenz {#verifiable-inference} + +KI-Inferenz findet traditionell off-chain statt, wo die Ausführung billig ist, die Modellausführung aber intransparent ist. Auf Ethereum können Entwickler Agenten mit verifizierbarer Berechnung unter Verwendung verschiedener Techniken koppeln: + +- [**zkML (Zero-Knowledge Machine Learning)**](https://opengradient.medium.com/a-gentle-introduction-to-zkml-8049a0e10a04) ermöglicht es Agenten zu beweisen, dass ein Modell korrekt ausgeführt wurde, ohne das Modell oder die Eingaben preiszugeben +- [**TEE (Trusted Execution Environment)-Attestierungen**](https://en.wikipedia.org/wiki/Trusted_execution_environment) ermöglichen hardwaregestützte Nachweise, dass ein Agent ein bestimmtes Modell oder einen bestimmten Codepfad ausgeführt hat +- **On-Chain-Unveränderlichkeit** stellt sicher, dass diese Nachweise und Attestierungen von jedem Vertrag oder Agenten referenziert, wiederholt und als vertrauenswürdig eingestuft werden können + +## Zahlungen und Handel mit x402 {#x402} + +Das auf Ethereum und L2s bereitgestellte [x402-Protokoll](https://www.x402.org/) gibt Agenten eine native Möglichkeit, für Ressourcen zu bezahlen und wirtschaftlich ohne menschliches Eingreifen zu interagieren. Agenten können: + +- Für Rechenleistung, Daten und API-Aufrufe mit Stablecoins bezahlen +- Attestierungen von anderen Agenten oder Diensten anfordern oder verifizieren +- Am Agent-zu-Agent-Handel teilnehmen, indem sie Rechenleistung, Daten oder Modellausgaben kaufen und verkaufen + +x402 macht Ethereum zu einer programmierbaren wirtschaftlichen Ebene für autonome Agenten und ermöglicht Pay-per-Use-Interaktionen anstelle von Konten, Abonnements oder zentralisierter Abrechnung. + +### Sicherheit für agentenbasierte Finanzen {#agentic-finance-security} + +Autonome Agenten benötigen Leitplanken. Ethereum stellt sie auf Wallet- und Vertragsebene bereit: + +- [Smart Accounts (EIP-4337)](https://eips.ethereum.org/EIPS/eip-4337) ermöglichen es Entwicklern, Ausgabenlimits, Whitelists, Sitzungsschlüssel und granulare Berechtigungen durchzusetzen +- Programmierte Einschränkungen in Smart Contracts können einschränken, was ein Agent tun darf +- Inferenzbasierte Limits (z. B. das Erfordern eines zkML-Beweises vor der Ausführung einer risikoreichen Aktion) fügen eine weitere Sicherheitsebene hinzu + +Diese Kontrollen ermöglichen den Einsatz von autonomen Agenten, die nicht unbegrenzt sind. + +### On-Chain-Register: ERC-8004 {#erc-8004} + +[ERC-8004](https://eips.ethereum.org/EIPS/eip-8004) ist ein neuer Standard (derzeit im Peer-Review), der On-Chain-Register für Agentenidentität, -fähigkeiten und -attestierungen vorschlägt. + +Wenn er angenommen wird, könnte er Folgendes bereitstellen: + +- Ein gemeinsames, Trustless-Verzeichnis von Agenten +- Standardisierte Attestierungsformate +- Eine Grundlage für "Trustless Agenten-Infrastruktur" direkt auf dem Ethereum-Mainnet + +Dies würde es Agenten erleichtern, sich gegenseitig in einer vollständig dezentralisierten Umgebung zu entdecken, zu verifizieren und miteinander zu handeln. + +## KI-Agenten auf Ethereum {#ai-agents-on-ethereum} + +Wir fangen gerade an, das volle Potenzial von KI-Agenten zu erforschen, und Projekte nutzen bereits die Synergie zwischen KI und Blockchain – insbesondere bei Transparenz und Monetarisierung. + + + +Lunas erster Auftritt als Podcast-Gast + + + +## Von Agenten kontrollierte Wallets {#agent-controlled-wallets} + +Agenten wie Luna oder AIXBT kontrollieren ihre eigene On-Chain-Wallet ([AIXBTs Wallet](https://clusters.xyz/aixbt), [Lunas Wallet](https://zapper.xyz/account/0x0d177181e3763b20d47dc3a72dd584368bd8bf43)), was es ihnen ermöglicht, Fans Trinkgelder zu geben und an wirtschaftlichen Aktivitäten teilzunehmen. + +Während Lunas Social-Media-Kampagne #LunaMuralChallenge auf X wählte Luna die Gewinner aus und belohnte sie über ihre Base-Wallet – was den ersten Fall darstellt, in dem eine KI Menschen für eine Krypto-Belohnung engagiert hat. + + + + +

Gut zu wissen

+

KI-Agenten und zugehörige Tools befinden sich noch in der frühen Entwicklung und sind sehr experimentell – verwenden Sie sie mit Vorsicht.

+
+
+ +## Kontrollieren Sie Ihre Wallet mit Chat-Befehlen {#control-your-wallet-using-chat-commands} + +Sie können die komplizierten Benutzeroberflächen von DeFi umgehen und Ihre Kryptowerte mit einfachen Chat-Befehlen verwalten. + +Dieser intuitive Ansatz macht Transaktionen schneller, einfacher und weniger anfällig für Fehler, wie das Senden von Mitteln an eine falsche Adresse oder das Überbezahlen von Gebühren. + + + +## KI-Agenten vs. KI-Bots {#ai-agents-vs-ai-bots} + +Die Unterscheidung zwischen KI-Agenten und KI-Bots kann mitunter verwirrend sein, da beide automatisierte Aktionen auf Grundlage von Eingaben ausführen. + +- KI-Bots sind eher wie automatisierte Assistenten – Sie befolgen spezifische, vorprogrammierte Anweisungen, um Routineaufgaben auszuführen. +- KI-Agenten sind eher wie intelligente Begleiter – Sie lernen aus Erfahrung, passen sich neuen Informationen an und treffen eigene Entscheidungen. + +| | KI-Agenten | KI-Bots | +| ---------------------- | -------------------------------------------------------------------------------------- | ---------------------------------------------------- | +| **Interaktionen** | Komplex, anpassungsfähig, autonom | Einfach, vordefinierter Umfang, fest codiert | +| **Lernen** | Lernt kontinuierlich, kann experimentieren und sich in Echtzeit an neue Daten anpassen | Arbeitet mit vortrainierten Daten oder festen Regeln | +| **Aufgabenerledigung** | Zielt darauf ab, umfassendere Ziele zu erreichen | Konzentriert sich nur auf bestimmte Aufgaben | + +## Tiefer eintauchen {#dive-deeper} + + + +## Sie können Ihren eigenen KI-Agenten bauen {#you-can-build-your-own-ai-agent} + + diff --git a/public/content/translations/de/bridges/index.md b/public/content/translations/de/bridges/index.md index b297e44adcb..1cbc5d4dd65 100644 --- a/public/content/translations/de/bridges/index.md +++ b/public/content/translations/de/bridges/index.md @@ -4,9 +4,9 @@ description: Brücken erlauben es Benutzern, ihr Guthaben über verschiedene Blo lang: de --- -# Blockchain-Brücken {#prerequisites} +# Blockchain-kettenübergreifende Brücken {#prerequisites} -_Web3 hat sich zu einem Ökosystem von L1 Blockchains und L2 Skalierungslösungen entwickelt, die jeweils mit einzigartigen Fähigkeiten und Gegenleistungen entwickelt wurden. Mit zunehmender Zahl der Blockchain-Protokolle steigt auch das Bedürfnis danach, Assets über Blockchains hinweg zu verschieben. Um diesem Bedürfnis gerecht zu werden, brauchen wir Brücken._ +_Web3 hat sich zu einem Ökosystem von L1 Blockchains und L2 Skalierungslösungen entwickelt, die jeweils mit einzigartigen Fähigkeiten und Gegenleistungen entwickelt wurden. Mit zunehmender Zahl der Blockchain-Protokolle steigt auch das Bedürfnis danach, Assets über Blockchains hinweg zu verschieben.Um diesem Bedürfnis gerecht zu werden, brauchen wir Brücken._ @@ -18,28 +18,28 @@ Sehen wir uns ein Beispiel an: Sie kommen aus den USA und planen eine Reise nach Europa. Sie haben USD aber benötigen zum Bezahlen EUR. Um Ihre USD in EUR umzutauschen, können Sie gegen eine geringe Gebühr einen Währungstausch durchführen. -Aber was tun Sie, wenn Sie einen ähnlichen Austausch durchführen möchten, um eine andere [Blockchain](/glossary/#blockchain) zu benutzen? Angenommen, Sie möchten [ETH](/glossary/#ether) auf dem Ethereum Mainnet gegen ETH auf [Arbitrum](https://arbitrum.io/) tauschen. Genau wie der Währungstausch, den wir bei EUR durchgeführt haben, brauchen wir einen Mechanismus, um ETH von Ethereum zu Arbitrum umzutauschen. Brücken machen so eine Transaktion möglich. In diesem Fall hat [Arbitrum eine lokale Brücke](https://bridge.arbitrum.io/), welche ETH vom Hauptnetzwerk zu Arbitrum transferieren kann. +Aber was machen Sie, wenn Sie einen ähnlichen Umtausch durchführen möchten, um eine andere [Blockchain](/glossary/#blockchain) zu benutzen? Angenommen, Sie möchten [ETH](/glossary/#ether) auf dem Ethereum Mainnet gegen ETH auf [Arbitrum](https://arbitrum.io/) tauschen. Genau wie der Währungstausch, den wir bei EUR durchgeführt haben, brauchen wir einen Mechanismus, um ETH von Ethereum zu Arbitrum umzutauschen. Brücken machen so eine Transaktion möglich. In diesem Fall hat [Arbitrum eine native kettenübergreifende Brücke](https://portal.arbitrum.io/bridge), die ETH vom Mainnet auf Arbitrum übertragen kann. ## Warum brauchen wir Brücken? {#why-do-we-need-bridges} -Alle Blockchains haben ihre Grenzen. Damit Ethereum mit der Nachfrage mithalten und skalieren kann, sind [Rollups](/glossary/#rollups) erforderlich. Alternativ sind L1s wie Solana und Avalanche anders konzipiert worden, um einen höheren Durchsatz zu ermöglichen. Dies geschieht aber auf Kosten der Dezentralität. +Alle Blockchains haben ihre Grenzen. Damit Ethereum skalieren und mit der Nachfrage Schritt halten kann, sind [Rollups](/glossary/#rollups) erforderlich. Alternativ sind L1s wie Solana und Avalanche anders konzipiert worden, um einen höheren Durchsatz zu ermöglichen. Dies geschieht aber auf Kosten der Dezentralität. -Jedoch entwickeln sich alle Blockchains in isolierten Umgebungen und haben verschiedene Regeln und [Konsens](/glossary/#consensus)-Mechanismen. Das bedeutet, dass sie in Ihrer Urform nicht miteinander kommunizieren können, und Token können sich nicht frei zwischen den Blockchains bewegen. +Allerdings werden alle Blockchains in isolierten Umgebungen entwickelt und haben unterschiedliche Regeln und [Konsens](/glossary/#consensus)mechanismen. Das bedeutet, dass sie in Ihrer Urform nicht miteinander kommunizieren können, und Token können sich nicht frei zwischen den Blockchains bewegen. Brücken existieren, um Blockchains miteinander zu verbinden. Sie erlauben den Transfer von Informationen und Token zwischen den Blockchains. **Brücken ermöglichen**: - der Chain-übergreifende Transfer von Assets und Informationen. -- den Zugriff auf die Stärken verschiedener Blockchains durch [DApps](/glossary/#dapp) – wodurch sich ihre Fähigkeiten verbessern (da Protokolle nun mehr Gestaltungsspielraum für Innovationen haben). +- Ermöglicht [Dapps](/glossary/#dapp) den Zugriff auf die Stärken verschiedener Blockchains – wodurch ihre Fähigkeiten erweitert werden (da Protokolle jetzt mehr Gestaltungsspielraum für Innovationen haben). - Benutzer können auf neue Plattformen zugreifen, und die Vorteile verschiedener Blockchains zu nutzen. - Entwickler aus verschiedenen Blockchain-Ökosystemen können zusammenarbeiten, um neue Plattformen für die Benutzer zu erschaffen. -[Wie man Token auf die Layer 2 überträgt](/guides/how-to-use-a-bridge/) +[Wie man Token auf Layer 2 überbrückt](/guides/how-to-use-a-bridge/) -## Anwendungsfälle für Brücken {#bridge-use-cases} +## Anwendungsfälle von kettenübergreifenden Brücken {#bridge-use-cases} Für die folgenden Szenarien können Brücken verwendet werden: @@ -47,43 +47,43 @@ Für die folgenden Szenarien können Brücken verwendet werden: Nehmen wir an, Sie haben ETH auf dem Ethereum-Hauptnetzwerk, wollen aber günstigere Transaktionsgebühren, um verschiedene dApps auszuprobieren. Wenn Sie Ihr ETH vom Hauptnetzwerk zu einem Ethereum L2 Rollup überbrücken, können Sie günstigere Transaktionsgebühren nutzen. -### dApps auf anderen Blockchains {#dapps-other-chains} +### Dapps auf anderen Blockchains {#dapps-other-chains} -Wenn Sie Aave auf dem Ethereum-Hauptnetzwerk verwenden, um USDT zu leihen, aber der Zinssatz für USDT mit Aave auf Polygon höher ist. +Wenn Sie Aave im Ethereum Mainnet verwendet haben, um USDT bereitzustellen, der Zinssatz, den Sie möglicherweise für die Bereitstellung von USDT mit Aave auf Polygon erhalten, jedoch höher ist. -### Entdecken Sie Blockchain-Ökosysteme {#explore-ecosystems} +### Blockchain-Ökosysteme erkunden {#explore-ecosystems} Wenn Sie ETH auf dem Ethereum-Hauptnetzwerk haben und ein alternatives L1 erkunden möchten, um dessen native dApps auszuprobieren. Sie können eine Brücke benutzen, um Ihr ETH vom Ethereum-Hauptnetzwerk auf die alternative L1 zu übertragen. -### Erhalten Sie native Krypto-Vermögenswerte {#own-native} +### Native Krypto-Vermögenswerte besitzen {#own-native} -Nehmen wir an, Sie möchten native Bitcoin (BTC) besitzen, aber Sie haben nur Geld auf dem Ethereum-Hauptnetzwerk. Um Bitcoin auf Ethereum zu besitzen, können Sie Wrapped Bitcoin (WBTC) kaufen. Jedoch ist WBTC ein [ERC-20](/glossary/#erc-20)-Token, das im Ethereum-Netzwerk nativ ist, d. h. es ist eine Ethereum-Version von Bitcoin und nicht das originale Asset auf der Bitcoin-Blockchain. Um ursprüngliche BTC zu besitzen, muss eine Brücke zwischen Ethereum und Bitcoin genutzt werden. Mit dieser Brücke lässt sich WBTC in ursprüngliche BTC umwandeln. Alternativ besitzen Sie vielleicht BTC und möchten diese in Ethereum-[DeFi](/glossary/#defi)-Protokollen nutzen. Dann müssten Sie Ihre BTC in WBTC umwandeln, welche Sie dann als Vermögenswert in Ethereum nutzen können. +Nehmen wir an, Sie möchten native Bitcoin (BTC) besitzen, aber Sie haben nur Geld auf dem Ethereum-Hauptnetzwerk. Um Bitcoin auf Ethereum zu besitzen, können Sie Wrapped Bitcoin (WBTC) kaufen. Allerdings ist WBTC ein [ERC-20](/glossary/#erc-20)-Token, der im Ethereum-Netzwerk heimisch ist, was bedeutet, dass es sich um eine Ethereum-Version von Bitcoin und nicht um den ursprünglichen Vermögenswert auf der Bitcoin-Blockchain handelt. Um ursprüngliche BTC zu besitzen, muss eine Brücke zwischen Ethereum und Bitcoin genutzt werden. Mit dieser Brücke lässt sich WBTC in ursprüngliche BTC umwandeln. Alternativ könnten Sie BTC besitzen und es in Ethereum-[DeFi](/glossary/#defi)-Protokollen verwenden wollen. Dann müssten Sie Ihre BTC in WBTC umwandeln, welche Sie dann als Vermögenswert in Ethereum nutzen können. - Sie können all dies auch mit [zentralisierten Krypto-Börsen](/get-eth/) tun. Wenn Ihr Guthaben jedoch nicht bereits auf einer Krypto-Börse ist, würde dies mehrere Schritte erfordern, und es wäre wahrscheinlich besser, eine Brücke zu benutzen. + Sie können all das oben Genannte auch mithilfe einer [zentralisierten Börse](/get-eth). Wenn Ihr Guthaben jedoch nicht bereits auf einer Krypto-Börse ist, würde dies mehrere Schritte erfordern, und es wäre wahrscheinlich besser, eine Brücke zu benutzen. -## Arten von Brücken {#types-of-bridge} +## Arten von kettenübergreifenden Brücken {#types-of-bridge} Brücken haben viele Arten von Entwürfen und Verkomplizierungen. Im Allgemeinen fallen Brücken in zwei Kategorien: vertrauenswürdige und vertrauenslose Brücken. -| Vertrauenswürdige Brücken | Vertrauenslose Brücken | -| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| Vertrauenswürdige Brücken sind für ihre Operationen von einer zentralen Einheit oder einem zentralen System abhängig. | Vertrauenslose Brücken arbeiten mit intelligenten Verträgen und Algorithmen. | -| Sie haben Vertrauen in die Verwahrung der Mittel und die Sicherheit der Brücke. Die Benutzer sind meist auf den Ruf des Brückenbetreibers angewiesen. | Sie sind vertrauenslos, d. h. die Sicherheit der Brücke ist die gleiche wie die der zugrunde liegenden Blockchain. | -| Benutzer müssen die Kontrolle über ihre Krypto-Assets aufgeben. | Vertrauenslose Brücken ermögliches es Nutzern via [Smart Contracts](/glossary/#smart-contract), die Kontrolle über ihre Finanzmittel zu behalten. | +| Vertrauenswürdige Brücken | Vertrauenslose Brücken | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Vertrauenswürdige Brücken sind für ihre Operationen von einer zentralen Einheit oder einem zentralen System abhängig. | Vertrauenslose Brücken arbeiten mit intelligenten Verträgen und Algorithmen. | +| Sie haben Vertrauen in die Verwahrung der Mittel und die Sicherheit der Brücke. Die Benutzer sind meist auf den Ruf des Brückenbetreibers angewiesen. | Sie sind vertrauenslos, d. h. die Sicherheit der Brücke ist die gleiche wie die der zugrunde liegenden Blockchain. | +| Benutzer müssen die Kontrolle über ihre Krypto-Assets aufgeben. | Durch [Smart Contracts](/glossary/#smart-contract) ermöglichen vertrauenslose kettenübergreifende Brücken den Nutzern, die Kontrolle über ihre Gelder zu behalten. | Kurz gesagt, wir können sagen, dass vertrauenswürdige Brücken auf Vertrauensannahmen beruhen, während vertrauenslose Brücken vertraulich minimiert werden und keine neuen Vertrauensannahmen treffen, die über die der zugrunde liegenden Domain hinausgehen. So können diese Begriffe beschrieben werden: -- **Vertrauenslos**: äquivalente Sicherheit zu den zugrunde liegenden Domains. Wie von [Arjun Bhuptani in diesem Artikel beschrieben.](https://medium.com/connext/the-interoperability-trilemma-657c2cf69f17) -- **Vertrauensannahmen:** weg von der Sicherheit der zugrunde liegenden Domains durch Hinzufügen externer Prüfer im System und somit weniger krypto-ökonomisch sicher. +- **Vertrauenslos**: gleiche Sicherheit wie die zugrunde liegenden Domains. Wie von [Arjun Bhuptani in diesem Artikel beschrieben.](https://medium.com/connext/the-interoperability-trilemma-657c2cf69f17) +- **Vertrauensannahmen:** Abkehr von der Sicherheit der zugrunde liegenden Domains durch Hinzufügen externer Prüfer zum System, wodurch es krypto-ökonomisch weniger sicher wird. Um ein besseres Verständnis der wichtigsten Unterschiede zwischen den beiden Ansätzen zu entwickeln, betrachten wir ein Beispiel: @@ -100,17 +100,26 @@ Viele Brückenlösungen übernehmen Modelle zwischen diesen beiden Extremen mit -## Risiken von Brücken {#bridge-risk} +## Kettenübergreifende Brücken verwenden {#use-bridge} + +Durch die Verwendung von Brücken können Sie Ihre Vermögenswerte über verschiedene Blockchains hinweg verschieben. Hier sind einige Ressourcen, die Ihnen beim Finden und Verwenden von Brücken helfen können: + +- **[L2BEAT Bridges Summary](https://l2beat.com/bridges/summary) & [L2BEAT Bridges Risk Analysis](https://l2beat.com/bridges/summary)**: Eine umfassende Zusammenfassung verschiedener kettenübergreifender Brücken, einschließlich Details zu Marktanteil, Typ der kettenübergreifenden Brücke und Zielketten. L2BEAT verfügt außerdem über eine Risikoanalyse für Brücken, die den Benutzern hilft, fundierte Entscheidungen bei der Auswahl einer Brücke zu treffen. +- **[DefiLlama Zusammenfassung der kettenübergreifenden Brücken](https://defillama.com/bridges/Ethereum)**: Eine Zusammenfassung der Volumen von kettenübergreifenden Brücken in den Ethereum-Netzwerken. + + + +## Risiken bei der Verwendung von kettenübergreifenden Brücken {#bridge-risk} Brücken befinden sich in der Anfangsphase der Entwicklung. Es ist wahrscheinlich, dass das optimale Brückenkonzept noch nicht entdeckt wurde. Die Interaktion mit jeder Art von Brücke birgt eine gewisse Gefahr: -- **Smart-Contract-Risiko —** das Risiko eines Fehlers im Code, sodass Benutzergelder verloren gehen könnten -- **Technologierisiko —** Softwarefehler, fehlerhafter Code, menschlicher Fehler, Spam und böswillige Angriffe können möglicherweise Benutzeroperationen stören +- **Smart-Contract-Risiko —** das Risiko eines Fehlers im Code, durch den Nutzergelder verloren gehen können. +- **Technologierisiko —** Softwarefehler, fehlerhafter Code, menschlicher Fehler, Spam und böswillige Angriffe können möglicherweise Benutzeroperationen stören. Und da vertrauenswürdige Brücken Vertrauensannahmen hinzufügen, tragen sie zusätzliche Risiken wie: -- **Zensurrisiko —** Brückenbetreiber können Benutzer theoretisch daran hindern, ihre Vermögenswerte über die Brücke zu übertragen -- **Verwahrungsrisiko —** Brückenbetreiber können sich zusammentun, um die Gelder der Benutzer zu stehlen +- **Zensurrisiko —** Betreiber von kettenübergreifenden Brücken können Nutzer theoretisch daran hindern, ihre Vermögenswerte über die kettenübergreifende Brücke zu übertragen. +- **Verwahrungsrisiko —** Betreiber von kettenübergreifenden Brücken können kollaborieren, um die Gelder der Nutzer zu stehlen. Das Guthaben des Benutzers ist gefährdet, wenn: @@ -120,14 +129,17 @@ Das Guthaben des Benutzers ist gefährdet, wenn: - die Brückenbetreiber böswillige Absichten in einer vertrauenswürdigen Brücke haben - die Brücke gehackt wird -Ein kürzlicher Hack war der von Solanas Wormhole-Brücke, [wo 120T wETH (325 Millionen USD) während des Angriffs gestolen wurden](https://rekt.news/wormhole-rekt/). Bei vielen der [größten Blockchain-Hacks waren Brücken involviert](https://rekt.news/leaderboard/). +Ein aktueller Hack war der der Wormhole-Brücke von Solana, [bei dem 120k wETH (325 Mio. USD) gestohlen wurden](https://rekt.news/wormhole-rekt/). Viele der [größten Hacks in Blockchains betrafen kettenübergreifende Brücken](https://rekt.news/leaderboard/). -Brücken sind von entscheidender Bedeutung für Benutzer, die Ethereum L2s und sogar verschiedene Ökosysteme erkunden wollen. Angesichts der Risiken, die mit der Interaktion mit Brücken verbunden sind, müssen die Benutzer jedoch verstehen, welche Kompromisse die Brücken eingehen. Dies sind einige [Strategien für die Crosschain-Sicherheit](https://blog.debridge.finance/10-strategies-for-cross-chain-security-8ed5f5879946). +Brücken sind von entscheidender Bedeutung für Benutzer, die Ethereum L2s und sogar verschiedene Ökosysteme erkunden wollen. Angesichts der Risiken, die mit der Interaktion mit Brücken verbunden sind, müssen die Benutzer jedoch verstehen, welche Kompromisse die Brücken eingehen. Dies sind einige [Strategien für die Cross-Chain-Sicherheit](https://debridge.com/learn/blog/10-strategies-for-cross-chain-security/). -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} + +- [EIP-5164: Cross-Chain Execution](https://ethereum-magicians.org/t/eip-5164-cross-chain-execution/9658) - _18. Juni 2022 - Brendan Asselstine_ +- [L2Bridge Risk Framework](https://gov.l2beat.com/t/l2bridge-risk-framework/31) - _5. Juli 2022 - Bartek Kiepuszewski_ +- ["Why the future will be multi-chain, but it will not be cross-chain."](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) - _8. Januar 2022 - Vitalik Buterin_ +- [Harnessing Shared Security For Secure Cross-Chain Interoperability: Lagrange State Committees And Beyond](https://web.archive.org/web/20250125035123/https://research.2077.xyz/harnessing-shared-security-for-secure-blockchain-interoperability) - _12. Juni 2024 - Emmanuel Awosika_ +- [The State Of Rollup Interoperability Solutions](https://web.archive.org/web/20250428015516/https://research.2077.xyz/the-state-of-rollup-interoperability) - _20. Juni 2024 - Alex Hook_ -- [EIP-5164: Cross-Chain-Ausführung](https://ethereum-magicians.org/t/eip-5164-cross-chain-execution/9658) _18. Juni 2022 - Brendan Asselstine_ -- [L2Bridge Risiko-Framework](https://gov.l2beat.com/t/l2bridge-risk-framework/31) _5. Juli 2022 - Bartek Kiepuszewski_ -- [„Warum die Zukunft eine Multi-Chain, aber keine Cross-Chain sein wird."](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) _8. Januar 2022 - Vitalik Buterin_ diff --git a/public/content/translations/de/community/code-of-conduct/index.md b/public/content/translations/de/community/code-of-conduct/index.md index 6de08c9fef4..65847054100 100644 --- a/public/content/translations/de/community/code-of-conduct/index.md +++ b/public/content/translations/de/community/code-of-conduct/index.md @@ -17,7 +17,7 @@ Die ethereum.org-Community strebt nach folgenden Werten: - Lehrreich, um jedem zu helfen, Ethereum zu verstehen - Inklusiv - Barrierefrei -- Community-basiert +- Community-gesteuert - Fokussiert auf die Ethereum zugrunde liegende Technologie und Anwendungsfälle - Fokussiert auf Ethereum-Konzepte und -Gestaltungsprinzipien @@ -31,29 +31,29 @@ Die ethereum.org-Community strebt nach folgenden Werten: ## Verhaltenskodex {#code-of-conduct} -### Versprechen {#pledge} +### Verpflichtung {#pledge} -Offene Beteiligung ist der Kern des Ethos von ethereum.org. Wir sind eine Website und eine Community, die von Tausenden von Mitwirkenden unterhalten wird. Und das ist nur möglich, wenn wir ein einladendes, partizipatives Umfeld aufrechterhalten. Zu diesem Zweck verpflichten sich die Mitwirkenden dieser Website, eine Umgebung frei von Belästigung für alle Teilnehmenden auf allen ethereum.org-Plattformen und den Community-Bereichen zu schaffen. Die ethereum.org-Community begrüßt und schätzt jeden, der sich konstruktiv und freundlich beteiligen möchte, unabhängig von Alter, Behinderung, ethnischer Zugehörigkeit, Geschlechtsmerkmalen, geschlechtlicher Identität, Erfahrungsstand, Fachgebiet, Bildung, sozioökonomischem Status, Nationalität, persönlichem Aussehen, Rasse, Religion oder anderen Aspekten der Vielfalt. +Offene Beteiligung ist der Kern des Ethos von ethereum.org. Wir sind eine Website und eine Community, die von Tausenden von Mitwirkenden unterhalten wird. Und das ist nur möglich, wenn wir ein einladendes, partizipatives Umfeld aufrechterhalten. Zu diesem Zweck verpflichten sich die Mitwirkenden dieser Website, eine belästigungsfreie Umgebung für alle Teilnehmenden auf allen Plattformen und in allen Community-Bereichen von ethereum.org aufrechtzuerhalten. Die ethereum.org-Community begrüßt und schätzt jeden, der sich konstruktiv und freundlich beteiligen möchte, unabhängig von Alter, Behinderung, ethnischer Zugehörigkeit, Geschlechtsmerkmalen, geschlechtlicher Identität, Erfahrungsstand, Fachgebiet, Bildung, sozioökonomischem Status, Nationalität, persönlichem Aussehen, Rasse, Religion oder anderen Aspekten der Vielfalt. ### Geltungsbereich {#scope} -Dieser Verhaltenskodex gilt für alle ethereum.org-Bereiche (wie z. B. GitHub, Discord, Figma Crowdin, Twitter und andere Online-Plattformen). Er gilt auch, wenn die Gemeinschaft in der realen Welt in der Öffentlichkeit vertreten ist, wie z. B. bei Meetings, Konferenzen und Veranstaltungen. +Dieser Verhaltenskodex gilt für alle ethereum.org-Bereiche (wie GitHub, Discord, Figma, Crowdin, X (ehemals Twitter) und andere Online-Plattformen) und er gilt auch, wenn die Community in realen öffentlichen Räumen wie bei Meetups, Konferenzen und Veranstaltungen vertreten ist. ### Unsere Standards {#our-standards} -Beispiele für Verhaltensweisen, die ein positives Umfeld fördern: +Beispiele für Verhaltensweisen, die zur Schaffung eines positiven Umfelds beitragen: -- Verwendung einer einladenden und integrativen Sprache -- Respekt gegenüber unterschiedlichen Standpunkten und Erfahrungen -- Konstruktive Kritik akzeptieren und/oder einfühlsam äußern +- Verwendung einer einladenden und inklusiven Sprache +- Respekt vor unterschiedlichen Standpunkten und Erfahrungen +- Konstruktive Kritik taktvoll annehmen und/oder einfühlsam äußern - Ruhiges und professionelles Verhalten bei der Lösung von Konflikten oder Meinungsverschiedenheiten - Einfühlungsvermögen und Toleranz gegenüber anderen Mitgliedern der Gemeinschaft zeigen - Ermutigung und Verstärkung neuer Stimmen in der Gemeinschaft Beispiele für inakzeptables Verhalten von Teilnehmenden: -- Körperliche Gewalt, Androhung körperlicher Gewalt oder Aufforderung zu körperlicher Gewalt jeglicher Art -- Verwendung einer sexualisierten Sprache oder Bildsprache oder Signalisierung unerwünschter sexueller Aufmerksamkeit +- Körperliche Gewalt, Androhung körperlicher Gewalt oder Anstiftung zu körperlicher Gewalt jeglicher Art +- Verwendung von sexualisierter Sprache oder Bildern oder unerwünschte sexuelle Annäherungen - Sich als eine andere Person auszugeben oder auf andere Weise unredlich zu behaupten, eine Verbindung zu einer Person oder Organisation zu haben - Trolling, beleidigende/abwertende Kommentare und persönliche oder politische Angriffe - Belästigung anderer Community-Mitglieder in öffentlichen oder privaten Kanälen @@ -62,16 +62,16 @@ Beispiele für inakzeptables Verhalten von Teilnehmenden: - Werbung für Investitionen, Token, Projekte oder andere Dinge zum persönlichen, finanziellen oder nicht-monetären Vorteil - Spamming von Servern mit themenfremden Inhalten - Missachtung von Aufforderungen oder Warnungen der Community-Moderatoren -- Anderes Verhalten, das in einem professionellen Umfeld als unangemessen angesehen werden könnte +- Anderes Verhalten, das in einem professionellen Umfeld vernünftigerweise als unangemessen angesehen werden könnte -### Meldung {#reporting} +### Meldung von Verstößen {#reporting} -Verstöße gegen den Verhaltenskodex werden in der Regel für die Community sichtbar, da wir versuchen, alles in offenen bzw. öffentlichen Kanälen zu kommunizieren, damit die Community-Mitglieder sich selbst überprüfen können. +Verstöße gegen den Verhaltenskodex sind in der Regel für die Community sichtbar, da wir versuchen, alles in offenen, öffentlichen Kanälen zu handhaben, was den Community-Mitgliedern eine Selbstregulierung ermöglicht. -Wenn jedoch etwas passiert, das Ihrer Meinung nach Aufmerksamkeit erfordert, können Sie es einer Person melden, die eine Moderationsrolle innehat (z. B. dem Discord-Guide), damit diese bei der Untersuchung helfen und die angemessene Reaktion ausführen kann. +Wenn jedoch etwas passiert, das Ihrer Meinung nach Aufmerksamkeit erfordert, können Sie es einer Person mit Moderationsrolle (z. B. einem Discord-Guide) melden, damit diese bei der Untersuchung helfen und die angemessene Reaktion einleiten kann. -Wenn Sie etwas melden, geben Sie bitte so viele Details wie möglich an, einschließlich spezifischer Beispiele und Zeitstempel. Das trägt dazu bei, ein faires Ergebnis zu gewährleisten. +Bitte geben Sie bei einer Meldung so viele Details wie möglich an, einschließlich konkreter Beispiele und Zeitstempel. Das trägt dazu bei, ein faires Ergebnis zu gewährleisten. ### Durchsetzung {#enforcement} -Je nach Schwere des Verstoßes können Personen, die gegen den Verhaltenskodex verstoßen, verwarnt bzw. vorübergehend oder dauerhaft aus der ethereum.org-Community verbannt werden. +Je nach Schwere des Verstoßes können Personen, die gegen den Verhaltenskodex verstoßen, Verwarnungen erhalten oder vorübergehend oder dauerhaft aus den ethereum.org-Communitys verbannt werden. diff --git a/public/content/translations/de/community/events/organizing/index.md b/public/content/translations/de/community/events/organizing/index.md new file mode 100644 index 00000000000..8a099c3b837 --- /dev/null +++ b/public/content/translations/de/community/events/organizing/index.md @@ -0,0 +1,221 @@ +--- +title: Organisation einer Ethereum-Veranstaltung +description: So organisieren Sie eine Ethereum-Veranstaltung +lang: de +hideEditButton: true +--- + +# So organisieren Sie eine Ethereum-Veranstaltung {#how-to-organize-an-ethereum-event} + +Der Aufbau einer starken und lebendigen Community ist der Kern des Wachstums des Ethereum-Ökosystems. Unabhängig davon, ob Sie Meetups, Workshops oder eine Konferenz in großem Umfang planen – der Erfolg Ihrer Veranstaltung hängt von den Verbindungen und dem Engagement innerhalb Ihres lokalen Netzwerks ab. Diese Anleitung unterstützt Sie dabei, eine aktive Ethereum-Community aufzubauen, und führt Sie Schritt für Schritt durch den Prozess der Organisation einer unvergesslichen und wirkungsvollen Konferenz. + +## Fragen Sie sich: Gibt es eine Ethereum-Community? {#ask-yourself-is-there-an-ethereum-community} + +Eine erfolgreiche Ethereum-Konferenz basiert auf einer aktiven und engagierten Community. Falls Sie bereits über eine solche verfügen, haben Sie bereits einen entscheidenden Vorsprung – andernfalls ist der wesentliche Vorarbeitsschritt der Aufbau dieser Grundlage. Dabei ist es wichtig, zwischen einer Szene und einer Community zu unterscheiden: Eine Szene umfasst zwar Unternehmen und Einzelpersonen, die in einem bestimmten Gebiet präsent sind, diese agieren jedoch oft unabhängig voneinander und verfolgen lediglich gelegentlich gemeinsame Initiativen – wie etwa im traditionellen Web2-Ökosystem vieler Regionen zu beobachten ist. Eine Community hingegen ist ein Netzwerk miteinander verbundener Personen und Organisationen, die aktiv zusammenarbeiten und sich gegenseitig unterstützen – ein Merkmal, das insbesondere in Web3-Ökosystemen häufig anzutreffen ist. + +**Ihre ersten Schritte sollten sein:** + +- Untersuchen Sie lokale Start-ups und Unternehmen: Das Vorhandensein starker, aktiver Unternehmen in Ihrer Stadt oder Ihrem Land ist oft die wichtigste Voraussetzung für den Aufbau einer lebendigen Community. +- Überprüfen Sie, ob es bereits Meetups gibt – ethereum.org [Veranstaltungsseite](https://ethereum.org/community/events/) +- [Die ethereum.org-Website](https://ethereum.org/community/events/) und der ethereum.org-Discord – um zu prüfen, ob es lokale Ethereum-Veranstaltungen, Entwickler:innen und Mitwirkende gibt. +- Luma und Meetup.com – um zu sehen, ob es Ethereum-bezogene Veranstaltungen oder allgemeinere Web3-Veranstaltungen in Ihrer Gegend gibt. +- X – Versuchen Sie, lokale Fürsprecher oder Influencer in diesem Bereich zu finden. + +Wenn Sie die meisten dieser Elemente finden, ist das ein starkes Zeichen dafür, dass die Bedingungen für den Aufbau einer Community gegeben sind – aber nicht unbedingt, dass bereits eine Community existiert. Der nächste Schritt ist die entscheidende Arbeit, diese Akteure zu organisieren, einzubinden und zu fördern, um Möglichkeiten für Zusammenarbeit und langfristiges Wachstum zu schaffen. + +### Wenn nicht, wie man sie aufbaut {#if-not-how-to-build-it} + +Wenn Sie feststellen, dass viele dieser Elemente fehlen, machen Sie sich keine Sorgen – der Aufbau einer Community von Grund auf ist ein herausfordernder, aber sehr lohnender Prozess. Eine starke Ethereum-Community entsteht nicht über Nacht; sie erfordert Geduld, Beständigkeit und eine klare Vision. So können Sie anfangen: + +- **Richten Sie einen Kommunikationskanal ein** – das kann Telegram, Signal, WhatsApp, WeChat oder ein Discord-Server sein, je nachdem, was bei Ihnen beliebter ist, damit sich die Leute vernetzen, Fragen stellen und Ressourcen teilen können. +- **Finden Sie Ihre Early Adopters.** Identifizieren Sie ein paar Leute, die sich für Ethereum und Web3 begeistern. Sie werden zu Ihren wichtigsten Unterstützer:innen und Mitstreiter:innen. +- **Veranstalten Sie kleine, regelmäßige Events.** Beginnen Sie mit informellen Meetups, Lerngruppen oder Workshops. Regelmäßigkeit ist der Schlüssel – auch wenn die Gruppe anfangs klein ist, schaffen regelmäßige Veranstaltungen Vertrauen und Dynamik. +- **Versuchen Sie, lokale Unternehmen**, Bildungseinrichtungen oder Coworking Spaces zu kontaktieren, damit diese Ihnen kostenlos Räumlichkeiten zur Verfügung stellen. Wenn Sie keine Redner:innen aus Ihrem Land finden können, laden Sie Online-Redner:innen ein, aber versammeln Sie die Leute physisch. Es ist entscheidend, Ihr Publikum physisch an einem Ort zu versammeln. +- **Arbeiten Sie mit bestehenden Tech-Communitys zusammen.** Wenn es bereits etablierte Entwickler:innengruppen, Startup-Ökosysteme oder Blockchain-Meetups gibt, arbeiten Sie mit ihnen zusammen, um Ethereum-Themen vorzustellen und Ihre Reichweite zu vergrößern. +- **Teilen Sie Bildungsinhalte** über das Potenzial von Ethereum. +- **Wenden Sie sich an globale Communitys.** Vernetzen Sie sich mit etablierten Ethereum-Gruppen und -Projekten weltweit, um Unterstützung, Mentoring und potenzielle Zusammenarbeit zu erhalten. Ethereum-Communitys auf der ganzen Welt haben mindestens eines gemeinsam: Sie alle sind bestrebt zu helfen. +- **Versuchen Sie, eine Finanzierung zu sichern** – sei es von lokalen Web3-Unternehmen oder durch ein Förderprogramm wie [ESP](https://esp.ethereum.foundation/). + +### Wenn ja, wie man sie pflegt und ausbaut {#if-yes-how-to-maintain-and-grow-it} + +Sobald Sie eine etablierte Community haben, hört die Arbeit nicht auf – tatsächlich fängt sie gerade erst an. Eine Community aktiv, engagiert und wachsend zu halten, erfordert kontinuierlichen Einsatz und Kreativität. Eines der Schlüsselelemente, um die Community einzubinden, ist, dass Sie ständig mit neuen Formaten und Ideen experimentieren sollten. + +Hier sind einige Strategien zur Aufrechterhaltung einer lebendigen Ethereum-Community: + +- **Diversifizieren Sie Ihre Veranstaltungsformate:** Beschränken Sie sich nicht nur auf eine Art von Treffen. Mischen Sie die Formate mit Meetups, kurzen Hackathons, Podiumsdiskussionen und Networking-Veranstaltungen. Sie können versuchen, Co-Working-Tage oder Bildungskurse zu organisieren. +- **Diversifizieren Sie die Themen:** Ethereum ist nicht nur eine Technologie, sondern auch eine Reihe von Werten, die Recht, Marketing und Wirtschaft umfassen. +- **Bitten Sie Ihre Community** um Rückmeldungen und Ideen. +- **Binden Sie verschiedene Zielgruppen** aktiv ein. Passen Sie Inhalte und Veranstaltungen an unterschiedliche Erfahrungsstufen an: von Einsteigenden, die Ethereum zum ersten Mal erkunden, bis hin zu erfahrenen Entwickler:innen und Unternehmer:innen. + +Indem Sie vielfältige Möglichkeiten zum Lernen, zur Zusammenarbeit und zur persönlichen sowie fachlichen Weiterentwicklung schaffen, stellen Sie sicher, dass Ihre Community aktiv bleibt und für größere Initiativen – wie die Organisation einer Konferenz – gerüstet ist. + +## Veranstaltung {#event} + +### Wann ist der richtige Zeitpunkt, eine Veranstaltung zu organisieren? {#when-is-the-right-time-to-organize-an-event} + +Die Organisation einer erfolgreichen Ethereum-Konferenz oder eines Community-Events erfordert sorgfältiges Timing und Überlegung. Der richtige Zeitpunkt hängt von einer Vielzahl von Faktoren ab, die zum Gesamterfolg der Veranstaltung beitragen. + +Sie sollten folgende Faktoren berücksichtigen: den Entwicklungsstand Ihrer Community, die aktuellen Marktbedingungen, ob Sie über ein Team verfügen sowie das Vorhandensein einer lokalen Szene (z. B. potenzielle Sponsoren). + +### KYC – Kennen Sie Ihre Community {#kyc-know-your-community} + +Einer der wichtigsten Schritte bei der Organisation einer Veranstaltung ist das Verständnis Ihrer Community. Ähnlich wie bei der „Know-Your-Customer“-Prüfung (KYC) im Finanzdienstleistungssektor bedeutet „Know Your Community“ (KYC), sich gezielt Zeit zu nehmen, um die konkreten Bedürfnisse, Vorlieben und Besonderheiten Ihrer lokalen Zielgruppe zu verstehen. Dieses Verständnis wird Ihnen helfen, die Konferenz so zu gestalten, dass ihr Erfolg und ihre Relevanz sichergestellt sind. + +Es ist verlockend, sofort eine große Veranstaltung anzustreben, aber klein anzufangen ist oft der beste Ansatz. Sie werden die für Sie beste Lösung finden, wenn Sie den aktuellen Stand Ihrer Community objektiv bewerten – und dabei auch Aspekte berücksichtigen, die Ihnen auf den ersten Blick möglicherweise irrelevant erscheinen, etwa ob Ihr Land ein beliebtes Reiseziel ist oder wie hoch die Unterkunftskosten sind. + +Im ersten Jahr wird der größte Teil Ihrer Zielgruppe aus der lokalen Community bestehen. Daher sollten alle Maßnahmen zur Organisation einer größeren Veranstaltung im ersten Jahr gezielt auf die Bedürfnisse und die Größe dieser Community ausgerichtet sein. + +### Wo man anfangen sollte {#where-to-start} + +Wenn es um die Organisation einer Konferenz geht, können die ersten Schritte überwältigend wirken. Aber mit einem klaren Plan und einer klaren Struktur können Sie den Prozess in überschaubare Aufgaben unterteilen. Wir werden jede einzelne davon aufschlüsseln. + +Ein strukturierter Ansatz hilft Ihnen, organisiert zu bleiben und Stress abzubauen, während Sie die verschiedenen Phasen der Organisation Ihrer Veranstaltung durchlaufen. Jede Entscheidung, die Sie treffen, sollte Sie dem Ziel näher bringen, ein Erlebnis zu schaffen, das den Bedürfnissen Ihrer Community entspricht. + +**Als Erstes müssen Sie ein Organisationsteam mit klaren Rollen und Verantwortlichkeiten zusammenstellen.** + +Ein weiterer wichtiger Schritt, bevor Sie mit der Erstellung eines Programms oder der Kontaktaufnahme mit Sponsoren beginnen, ist die Wahl eines Datums. Obwohl das wie ein einfacher Schritt klingt, gibt es einige wichtige Faktoren, die Sie im Voraus berücksichtigen sollten. Einige davon sind: + +- **Vermeiden Sie Terminkonflikte mit großen Konferenzen** oder Veranstaltungen +- **Berücksichtigen Sie lokale Bedingungen und Umstände** (wie Jahreszeit, wichtige Feiertage usw.) +- **Berücksichtigen Sie die Marktbedingungen** +- **Geben Sie sich genügend Zeit, um alles zu organisieren** – mindestens neun Monate + +### Wie man ein Team zusammenstellt {#how-to-assemble-a-team} + +Wählen Sie Leute aus, die Ihre Vision teilen und Ihre Fähigkeiten ergänzen. Manche Teams arbeiten als Kollektive, während andere definierte Rollen haben – finden Sie heraus, was für Sie am besten funktioniert. Regelmäßige Kommunikation und klare Erwartungen sind unerlässlich. Auch wenn es verlockend sein mag, für die Veranstaltungsplanung allein auf Kommunikationsplattformen zu setzen, empfehlen wir die Nutzung einer Aufgabenmanagement-Plattform (etwa Notion, Basecamp, Trello, Asana oder auch die bewährten Google Sheets), um anstehende Aufgaben übersichtlich zu organisieren und ihren Fortschritt nachvollziehbar zu verfolgen. Entscheidend ist ein gut funktionierendes und strukturiert arbeitendes Team. + +Verschiedene Ethereum-Organisationsteams verteilen die Verantwortlichkeiten unterschiedlich, doch gemeinsam ist ihnen stets das Vorhandensein von Personen, die sich gezielt um Logistik, Budgetplanung, Marketing, Programmgestaltung, Design sowie Partnerschaften kümmern. + +### Das Programm: Ein Schlüsselelement einer erfolgreichen Veranstaltung {#the-program-a-key-element-of-a-successful-event} + +Wenn es darum geht, eine wirklich wertvolle und unvergessliche Konferenz zu organisieren, **ist das Programm alles**. Dies ist kein Bereich, in dem Sie sich Kompromisse leisten können. Obwohl Sponsoren wichtig und oft entscheidend für die Finanzierung der Veranstaltung sind, müssen das Erlebnis des Publikums und der Wert, den es erhält, immer Vorrang haben. Ein mit Werbeinhalten und endlosen Sponsoren-Pitches überladenes Programm wird Ihre Teilnehmenden verprellen und die Glaubwürdigkeit Ihrer Veranstaltung untergraben. + +Jede Sitzung, jedes Panel und jeder Workshop sollte die Community informieren, inspirieren und einbeziehen. Hören Sie Ihrem Publikum zu – verstehen Sie seine Interessen, Bedürfnisse und Herausforderungen. Welche Themen finden bei ihnen Anklang? Gleichzeitig empfiehlt es sich, frische Perspektiven und innovative Formate einzubringen, um das Programm lebendig und ansprechend zu halten. Gestalten Sie das Programm ausgewogen, indem Sie etablierte und aktuelle Themen mit zukunftsweisenden Ideen kombinieren – so entsteht eine vielseitige Agenda, die unterschiedliche Aspekte des Ethereum-Ökosystems abdeckt: von technischen Vertiefungen und Sessions zum Community-Aufbau über politische Diskussionen bis hin zu praxisorientierten Workshops. Berücksichtigen Sie zudem die Konferenzsprache: Zwar ist Englisch bei den meisten Ethereum-Veranstaltungen die Standardauswahl, doch können Sessions in der jeweiligen Landessprache die Teilnahme für regionale Entwickler:innen und Enthusiast:innen deutlich zugänglicher machen. + +**Öffnen Sie die Ausschreibung für Vortragende mindestens sechs Monate vor der Konferenz**, um qualitativ hochwertige Einreichungen anzuziehen und ausreichend Zeit für die sorgfältige Gestaltung des Programms zu haben. Die für die Auswahl der Vortragenden verantwortliche Person sollte über umfassende Branchenerfahrung und ein tiefes Verständnis des Ökosystems verfügen. So wird sichergestellt, dass wertvolle und fundierte Beiträge erkannt sowie ein hohes inhaltliches Niveau gewahrt werden. + +### Wo man finanzielle Unterstützung findet {#where-to-find-financial-support} + +Die Organisation einer hochwertigen Konferenz ist mit erheblichen Kosten verbunden – darunter etwa die Anmietung eines Veranstaltungsorts, Werbematerialien, Verpflegung, technische Produktion sowie zahlreiche weitere Ausgaben. Die frühzeitige Sicherung finanzieller Unterstützung ist entscheidend, um sicherzustellen, dass Ihre Veranstaltung professionellen Standards entspricht und den Teilnehmenden ein herausragendes Erlebnis bietet. + +#### Wie erstellt man ein Sponsoring-Deck? {#how-to-create-a-sponsorship-deck} + +Zuerst benötigen Sie ein Deck. **Bitten Sie andere Konferenzveranstalter:innen um Rat**, etwa darum, ihre Unterlagen (z. B. Präsentationsdecks) mit Ihnen zu teilen, damit Sie Ihre Pakete darauf basierend gestalten können. Sie sollten bei der Preisgestaltung der Pakete realistisch bleiben und darauf abzielen, die Kosten zu decken – nicht Gewinn zu erwirtschaften, insbesondere zu Beginn. + +**Jedes Sponsoring-Deck sollte einen klaren und überzeugenden Überblick über die Veranstaltung bieten**, um sicherzustellen, dass potenzielle Sponsoren den Umfang, den Fokus und den Wert verstehen. Beginnen Sie mit den Grundlagen – Veranstaltungsort, Datum und Details zum Organisationsteam –, um Glaubwürdigkeit zu schaffen. Heben Sie dann den Hauptfokus der Veranstaltung hervor, da verschiedene Ethereum-Konferenzen auf unterschiedliche Zielgruppen ausgerichtet sind. Einige sind stark auf Builder ausgerichtet und bieten tiefgehende technische Diskussionen, während andere sich mehr auf DeFi, DAOs oder politische Themen konzentrieren. + +Setzen Sie über die reine Beschreibung der Veranstaltung hinaus klare Erwartungen. **Nennen Sie die erwartete Anzahl der Teilnehmenden und alle bereits bestätigten Hauptredner:innen**, da dies den Sponsoren hilft, ihre potenzielle Reichweite einzuschätzen. Am wichtigsten ist, dass Sie klar definieren, was sie als Gegenleistung für ihr Sponsoring erhalten – Standfläche, Redemöglichkeiten, Social-Media-Promotion, Markensichtbarkeit oder exklusiven Zugang zum Networking. Ein gut strukturiertes Deck informiert nicht nur, sondern begeistert potenzielle Sponsoren auch für die Möglichkeit, Teil Ihrer Veranstaltung zu sein. + +#### Wer könnte Ihre Veranstaltung unterstützen? {#who-might-support-your-event} + +Wenden Sie sich zunächst an Unternehmen innerhalb des Ethereum- und des breiteren Tech-Ökosystems in Ihrer Stadt oder Ihrem Land. Diese **Organisationen haben oft ein ureigenes Interesse an der Unterstützung lokaler Veranstaltungen**, die das Wachstum und die Innovation der Community fördern. Sie erkennen auch eher den Wert von Investitionen in das lokale Ökosystem und sehen Ihre Konferenz als eine Gelegenheit, mit Talenten, Partnern und Nutzenden in Kontakt zu treten. + +Sobald Sie lokale Unterstützung erschlossen haben, weiten Sie Ihre Kontaktaufnahme auf globale Akteure im Web3-Bereich aus. **Etablierte Protokolle, DAOs und Ökosystem-Fonds stellen oft Budgets für von der Community getragene Veranstaltungen bereit**. Für erstmalige Organisator:innen kann dies eine ziemliche Herausforderung sein, da sie noch keine Erfolgsbilanz vorweisen können. Versuchen Sie aber, ein überzeugendes Sponsoring-Paket zu schnüren, das die Vorteile der Unterstützung Ihrer Veranstaltung klar aufzeigt – Markensichtbarkeit, Redemöglichkeiten und eine sinnvolle Interaktion mit einer gezielten Zielgruppe. Versuchen Sie, Ihren einzigartigen Wert zu finden, den andere möglicherweise nicht haben. + +#### Alternative Finanzierungsformen für Ihre Veranstaltung {#alternative-forms-of-funding-your-event} + +Zuschüsse sind eine weitere potenzielle Finanzierungsquelle, die viele Organisator:innen übersehen. Programme wie das [Ecosystem Support Program](https://esp.ethereum.foundation/) (ESP) der Ethereum Foundation und [andere Förderinitiativen](https://ethereum.org/community/grants/#ethereum-grants) existieren, um von der Community getragene Veranstaltungen zu unterstützen. + +Ziehen Sie über finanzielle Sponsorings hinaus auch Sachpartnerschaften in Betracht, insbesondere für Speisen und Getränke. Marken, die zur lokalen Kultur oder zur Tech-Community passen, können großartige Partner für Ihre Veranstaltung sein. Kaffeemarken, Getränkehersteller oder sogar lokale Pizzerien sind möglicherweise bereit, Produkte im Austausch für Sichtbarkeit auf der Veranstaltung bereitzustellen. Diese Kooperationen können helfen, Kosten zu senken und gleichzeitig das Erlebnis der Teilnehmenden zu verbessern. + +Da wir gerade über Finanzen sprechen, denken Sie daran: Jeder Dollar, den Sie in die Schaffung eines außergewöhnlichen Erlebnisses für die Teilnehmenden investieren, wird sich exponentiell auszahlen. Eine hochwertige Produktion, komfortable Veranstaltungsorte, durchdachtes Swag und gut organisierte Nebenveranstaltungen tragen zu einem unvergesslichen Erlebnis bei, über das die Teilnehmenden noch lange nach Ende der Konferenz sprechen werden. Zufriedene Teilnehmende werden zu Ihren größten Befürwortern und sichern den langfristigen Erfolg Ihrer Veranstaltung. + +### Logistik {#logistics} + +Parallel zur Finanzierungssicherung sollte Ihr Hauptaugenmerk auf der Logistik liegen. Eine gut organisierte Konferenz erfordert eine sorgfältige Planung in mehreren Bereichen, vom Aufbau des Veranstaltungsortes bis zum Erlebnis der Teilnehmenden. Jemanden mit solider Erfahrung in der Veranstaltungsorganisation – nicht unbedingt Web3-Veranstaltungen, sondern Veranstaltungen im Allgemeinen – zu haben, kann einen großen Unterschied machen. Ein:e erfahrene:r Logistikverantwortliche:r kann potenzielle Probleme vorhersehen und lösen, bevor sie zu Problemen werden, und so Zeit, Geld und Stress sparen. + +Eine für die Logistik verantwortliche Person sollte einen Veranstaltungsort, eine Produktionsfirma und verschiedene Anbieter für Essen, Getränke und Merch auswählen sowie ein einfach zu bedienendes Online-Ticketing-System, das es den Teilnehmenden ermöglicht, sich zu registrieren und auch in Krypto zu bezahlen. + +### Standortinfrastruktur {#location-infrastructure} + +Bei der Wahl eines Standortes für Ihre Konferenz ist es wichtig, über den Veranstaltungsort selbst hinauszudenken und die umfassendere Infrastruktur von Stadt und Land zu berücksichtigen. Faktoren wie Wetter, Mobilität, Sicherheit und das politische Umfeld spielen eine große Rolle bei der Gestaltung des Erlebnisses der Teilnehmenden. + +Für weniger bekannte Orte wird dies besonders wichtig. Teilnehmende und Sponsoren aus der ganzen Welt müssen darauf vertrauen können, dass sie einfach und sicher reisen können. Untersuchen Sie Aspekte wie Flughafenanbindung, öffentliche Verkehrsmittel und Unterkunftsmöglichkeiten. Es ist auch ratsam, das kulturelle und politische Klima der Region zu berücksichtigen, um Komplikationen zu vermeiden, die internationale Teilnehmende abschrecken könnten, wie z. B. die Visapolitik. + +### Wie man die Veranstaltung bewirbt {#how-to-promote-the-event} + +Die effektive Bewerbung Ihrer Veranstaltung ist der Schlüssel, um das richtige Publikum anzuziehen und Begeisterung zu wecken. Eine gut durchdachte Werbestrategie stellt sicher, dass Ihre Konferenz die Sichtbarkeit und das Engagement erhält, die sie verdient. Design spielt auch eine wichtige Rolle für Ihre Marke, daher sollten Sie dafür ebenfalls ein Budget einplanen. + +#### Soziale Medien {#social-media} + +X.com wird das Rückgrat Ihrer Social-Media-Promotion sein. Versuchen Sie, dort aktiv und beständig zu posten, aber beteiligen Sie sich auch an verschiedenen Gesprächen, sowohl mit Ihrem persönlichen Konto als auch mit dem Konto Ihrer Organisation. + +Obwohl LinkedIn nicht wie die naheliegendste Wahl für Werbung klingt, können Sie dort ein völlig anderes Publikum oder sogar einige Sponsoren erreichen. + +#### Partnerschaften mit anderen Ethereum-Communitys {#partnerships-with-other-ethereum-communities} + +Partnerschaften mit verschiedenen Ethereum-Organisator:innen können helfen, Ihre Reichweite zu vergrößern, indem Sie auf bestehende Netzwerke zurückgreifen, insbesondere wenn Sie bei Null anfangen. Bieten Sie Community-Rabatte an, bewerben Sie Ihre Veranstaltung gegenseitig mit anderen Events und laden Sie Partner ein, Nebenveranstaltungen oder Workshops gemeinsam auszurichten. + +#### Hochschulkontakte {#university-outreach} + +Wenden Sie sich über Studentenclubs oder Professor:innen an technische und wirtschaftswissenschaftliche Fakultäten in der Stadt, um die Veranstaltung zu bewerben. Die Zusammenarbeit mit Universitäten kann dazu beitragen, junge Talente, Forschende und zukünftige Branchenfachleute zu gewinnen und eine stärkere Verbindung zwischen der akademischen Welt und dem Ethereum-Ökosystem zu fördern. Dies ist besonders gut, wenn Sie einen Hackathon organisieren, da Studierende oft frische Ideen, Begeisterung und eine starke technische Grundlage mitbringen. + +#### Medien {#media} + +Wenden Sie sich an auf Web3 ausgerichtete Medien und Newsletter, um über die Veranstaltung zu berichten. Obwohl Web3-Medien erwarten, für ihre PR-Artikel bezahlt zu werden, können Sie ihnen Freikarten oder Interviews mit einigen hochkarätigen Redner:innen und Sponsoren anbieten, wenn Sie kein Budget für bezahlte Werbung haben. Erstellen Sie ein PR-Paket mit einer Pressemitteilung und einigen visuellen Elementen, die für die Werbung in sozialen Medien oder auf einer Website in verschiedenen Formaten bereitstehen. Erweitern Sie außerdem den Kreis auf lokale Journalist:innen oder sogar Content Creators (sofern sie einen guten Ruf haben), die über Technik berichten können, da dies entscheidend sein kann, um die Veranstaltung einem größeren Publikum zu präsentieren. Dies hilft, die Lücke zwischen der Krypto-Branche und der breiteren Öffentlichkeit zu schließen und das Interesse von Mainstream-Tech- und Business-Communitys zu wecken. + +### Sollten Sie auch einen Hackathon organisieren? {#should-you-organize-a-hackathon-as-well} + +Die Organisation eines Hackathons kann von Vorteil sein, da Hackathons eine großartige Möglichkeit sind, die Entwickler:innen-Community einzubinden und Innovationen zu fördern. Es bietet auch praktische Möglichkeiten zur Zusammenarbeit und zum Aufbau von Projekten, was zu greifbaren Ergebnissen für das Ökosystem führen kann. Hackathons ziehen Entwickler:innen an, die normalerweise keine Konferenzen besuchen, aber die Herausforderung lieben, neue Ideen zu entwickeln und zu testen. Wenn Ihre Konferenz auf Entwickler:innen, Innovation und praktische Projekte abzielt, ist die Ausrichtung eines Hackathons eine naheliegende Ergänzung. + +Aber bevor Sie einen organisieren, überlegen Sie, ob Sie genügend Ressourcen und Zeit haben. **Ein Hackathon erfordert erhebliche Ressourcen in Bezug auf Zeit, Arbeitskräfte und finanzielle Investitionen**. Stellen Sie sicher, dass Sie ein engagiertes Team haben, das sich darum kümmert, insbesondere wenn Sie auch eine Konferenz leiten. Prüfen Sie auch, ob in Ihrer Community Interesse besteht. Wenn Ihre Community eher auf Builder ausgerichtet ist, ist es wahrscheinlich sinnvoll, einen zu organisieren. + +Obwohl es viele Vorteile hat, einen Hackathon zu organisieren, bedenken Sie, dass das Hinzufügen eines Hackathons je nach Größe der Konferenz überwältigend sein kann. Sie sollten abwägen, ob die Verwaltung von beidem die Qualität des einen oder des anderen beeinträchtigt. Sie können sich für einen kleineren, fokussierten Hackathon entscheiden oder die Veranstaltungen auf verschiedene Monate verteilen. + +### (Fast unvermeidliche) Herausforderungen, denen Sie sich stellen werden {#almost-inevitable-challenges-that-you-will-face} + +Eine der größten Herausforderungen bei der Organisation einer Konferenz, insbesondere im Ethereum-Bereich, ist die Sicherung einer ausreichenden Finanzierung. **Viele Veranstalter:innen haben Schwierigkeiten, das Kapital aufzubringen, das zur Deckung der Kosten für den Veranstaltungsort**, das Catering und andere logistische Ausgaben benötigt wird. Sponsoring ist oft unerlässlich, aber der Aufbau von Beziehungen und die Überzeugung von Unternehmen, in Ihre Veranstaltung zu investieren, kann Zeit in Anspruch nehmen. Darüber hinaus kann die Schwierigkeit, Sponsoren zu gewinnen, bei Marktabschwüngen zunehmen, da Unternehmen möglicherweise weniger bereit sind, in nicht zum Kerngeschäft gehörende Aktivitäten zu investieren. + +Eine effektive Budgetverwaltung ist der Schlüssel. **Unvorhergesehene Ausgaben**, wie kurzfristige Änderungen des Veranstaltungsortes und zusätzliche Anforderungen an die Veranstaltungstechnik, können Ihr Budget schnell sprengen. + +Bei neuen Veranstaltungen **kann es besonders schwierig sein, hochkarätige Redner:innen zu gewinnen**. Etablierte Vordenker:innen oder Influencer:innen im Ethereum-Bereich haben möglicherweise bereits volle Terminkalender und zögern vielleicht, sich für eine neue Veranstaltung ohne nachgewiesene Erfolgsbilanz zu verpflichten. Seien Sie darauf vorbereitet, lange vor der Veranstaltung Zeit mit Networking und der Kontaktaufnahme mit potenziellen Redner:innen zu verbringen. + +Was die Redner:innen betrifft, so sollten Sie eine klare und ständige Kommunikation mit ihnen pflegen – setzen Sie die Frist für die Zusendung von Präsentationen und vermeiden Sie kurzfristige Änderungen. + +Eine erfolgreiche Konferenz erfordert ein engagiertes Team, das sich um Logistik, Marketing, Sponsoring, technischen Support und die Verwaltung der Teilnehmenden kümmern kann. Personen mit Erfahrung in der Organisation von Tech-Veranstaltungen zu finden, kann eine Herausforderung sein, insbesondere wenn Sie mit einem kleinen Budget oder, in den meisten Fällen, ohne Budget, sondern auf freiwilliger Basis arbeiten. + +### Sie sollten es nicht alleine tun. Sie brauchen Freiwillige. {#you-shouldnt-do-it-alone-you-need-volunteers} + +Die Organisation einer Ethereum-Veranstaltung erfordert ein vielfältiges und engagiertes Team, das sich um Logistik, Anmeldungen, Koordination der Redner:innen, Unterstützung der Teilnehmenden und vieles mehr kümmert. Bei Teamgrößen von nur 3 bis 15 Personen wird deutlich, dass Freiwillige für den reibungslosen Ablauf der Veranstaltung unerlässlich sind. + +Freiwillige sind oft das Rückgrat vieler Konferenzen und leisten entscheidende Unterstützung, insbesondere wenn Sie mit einem begrenzten Budget arbeiten. Sie können alles übernehmen, von der Besetzung der Anmeldeschalter bis zur Unterstützung beim Aufbau der Veranstaltung, um sicherzustellen, dass die Veranstaltung so reibungslos wie möglich abläuft. + +Obwohl es schwierig ist, Freiwilligen eine finanzielle Vergütung anzubieten, ist es wichtig, ihnen etwas Wertvolles zu bieten, das ihre Erfahrung lohnenswert macht. Erwägen Sie, ihnen Networking-Möglichkeiten, Kompetenzentwicklung, einige exklusive Vergünstigungen, Zertifikate oder Empfehlungsschreiben anzubieten. + +### Wesentliche Compliance-Aspekte für Veranstalter:innen {#compliance-essentials-for-event-organizers} + +Bei der Organisation einer Veranstaltung gibt es mehrere wesentliche rechtliche und logistische Aspekte zu beachten: + +- **Sponsoring-Vertrag** – Stellen Sie sicher, dass Sie einen klaren Vertrag für Sponsoren haben, einschließlich einer klar definierten Stornierungsrichtlinie. +- **Verhaltenskodex** – Bereiten Sie einen Verhaltenskodex vor, der auf den jeweiligen Veranstaltungstyp zugeschnitten ist (Konferenz/Hackathon, Hacker Houses usw.). +- **Datenschutzrichtlinie** – Entwerfen Sie eine Datenschutzrichtlinie für Ihre Website, um den Datenschutzbestimmungen und Bildrechten zu entsprechen +- **Benachrichtigung der lokalen Behörden** – Auch wenn Ihre Veranstaltung eine geschlossene Versammlung ist, ist es ratsam, sie bei der örtlichen Polizeidienststelle zu melden. +- **Ticketing-Vertrag** – Schließen Sie einen formellen Vertrag mit Ihrem Ticketing-Dienstleister ab, um die Bedingungen und Verantwortlichkeiten zu klären. +- **Regulatorische Einhaltung** – Prüfen Sie im Voraus, ob das Land, in dem Sie die Konferenz veranstalten, spezifische Regelungen oder Einschränkungen für die Kryptoindustrie hat. +- **Zollabfertigung für Merchandise** – Wenn Sie Sponsor-Merchandise einführen, wird empfohlen, einen Zollagenten zu beauftragen, um den Prozess effizient abzuwickeln. +- **Fotografie- und Medienrichtlinie** – Legen Sie klare Richtlinien zur Fotografie und Medienberichterstattung fest und stellen Sie sicher, dass Teilnehmende über Zustimmungs- und Opt-out-Optionen informiert sind. + +## Nach der Veranstaltung: Wie geht es weiter? {#after-the-event-whats-next} + +Nach Abschluss der Veranstaltung ist es entscheidend, Feedback von Teilnehmenden, Redner:innen und Sponsoren einzuholen und einen internen Bericht zu erstellen, damit Sie für künftige Veranstaltungen besser vorbereitet sind. Dies hilft zu identifizieren, was gut gelaufen ist und wo Verbesserungen möglich sind. Nutzen Sie Umfragen oder Einzelgespräche, um wertvolle Erkenntnisse zu sammeln, die zukünftige Durchführungen leiten werden. Nehmen Sie sich die Zeit, Fehler oder Ineffizienzen zu überprüfen, da diese bei der nächsten Konferenz vermieden werden können, wodurch der Prozess reibungsloser verläuft. + +Entscheidend ist es, den Schwung aufrechtzuerhalten. Bleiben Sie weiterhin mit Ihrer Community in Kontakt, teilen Sie Updates über die auf Basis ihres Feedbacks erzielten Fortschritte und wecken Sie Vorfreude auf die nächste Veranstaltung. Durch die Aufrechterhaltung dieser Verbindung stellen Sie sicher, dass die Wirkung der Konferenz über das eigentliche Ereignis hinausreicht, Beziehungen gestärkt werden und die Grundlage für künftige Erfolge gelegt wird. + +## Danksagung {#acknowledgement} + +Ein herzlicher Dank gilt allen, die zu diesem Artikel beigetragen und ihre wertvollen Erkenntnisse geteilt haben: Slavo Fabisik von ETHBratislava; Lola von ETH Kipu und ETH Latam; Tanja Mladenovic von ETH Belgrade; Juan David von Ethereum Bogotá; Monika Zając von ETHWarsaw; Raffaele Orefice von NapulETH; Xiao Wu (Ling) von ETH Riyadh; Marco von urbe.eth; Caolán Walsh von ETH Dublin; Alex Males von ETHCluj sowie Stanko Devic von ETH Slovenia. + +## Ressourcen {#resources} + +Podcast: So organisieren und bewerben Sie eine Ethereum-Veranstaltung von A bis Z: + +- [Die ETHWarsaw-Fallstudie, von Out of Ordinary](https://www.youtube.com/watch?v=io2Dx1ouz8o) + +Twitter-Space: + +- [ETH Community AMA](https://x.com/NapulETH/status/1905732699094151623) + +Artikel: + +- [Building ETHKL, von Danny H.](https://sekto.tech/ethkl24) +- [POKT Events Playbook](https://docs.pokt.network/community/pokt-events-playbook) diff --git a/public/content/translations/de/community/get-involved/index.md b/public/content/translations/de/community/get-involved/index.md index a42599b8472..f1b063ff057 100644 --- a/public/content/translations/de/community/get-involved/index.md +++ b/public/content/translations/de/community/get-involved/index.md @@ -4,129 +4,129 @@ description: So können Sie sich in der Ethereum-Community engagieren lang: de --- -# Wie kann ich mich einbringen? {#get-involved} +# Wie kann ich mich einbringen? Beteiligen Sie sich {#get-involved} Die Ethereum-Community besteht aus vielen unterschiedlichen Menschen mit verschiedensten Hintergründen und Fähigkeiten. Egal, ob Programmierer, Künstler oder Buchhalter, es gibt immer Wege, sich zu beteiligen. Im Folgenden finden Sie eine Liste mit Vorschlägen, die Sie vielleicht dabei unterstützt, durchzustarten. -Machen Sie sich zunächst mit der Mission und den Grundsätze von ethereum.org in unserem [Verhaltenskodex](/community/code-of-conduct) vertraut. +Machen Sie sich zunächst mit der Mission und den Werten von ethereum.org in unserem [Verhaltenskodex](/community/code-of-conduct) vertraut. -## Entwickler {#developers} +## Entwickler ‍ {#developers} -- Erfahren Sie mehr über Ethereum auf [ethereum.org/developers/](/developers/) -- Besuchen Sie ein [ETHGlobal](http://ethglobal.co/)-Hakathon in Ihrer Nähe. -- Schauen Sie sich an, welche [Projekte im Zusammenhang mit Ihrem Fachgebiet oder der Programmiersprache Ihrer Wahl](/developers/docs/programming-languages/) es gibt -- Sehen Sie sich die [Konsens- und Ausführungsebenen-Anrufe](https://www.youtube.com/@EthereumProtocol/streams) an oder nehmen Sie an ihnen teil -- [Wunschliste des Ethereum Ecosystem-Supportprogramms](https://esp.ethereum.foundation/wishlist/) – Tools, Dokumentation und Infrastrukturbereiche, für die das Ethereum Ecosystem-Supportprogramm aktiv nach Förderern sucht -- [Web3Bridge](https://www.web3bridge.com/) – beteiligen Sie sich an der Initiative der aufstrebenden web3-Community, Hunderte von Entwicklern und Mitgliedern der Community in ganz Afrika zu finden, zu schulen und zu unterstützen +- Erfahren Sie mehr über Ethereum und probieren Sie es auf [ethereum.org/developers/](/developers/) aus +- Nehmen Sie an einem [ETHGlobal](http://ethglobal.co/)-Hackathon in Ihrer Nähe teil! +- Sehen Sie sich [Projekte an, die sich auf Ihr Fachgebiet oder die Programmiersprache Ihrer Wahl beziehen](/developers/docs/programming-languages/) +- Nehmen Sie an den [Calls der Konsens- und Ausführungsebene](https://www.youtube.com/@EthereumProtocol/streams) teil oder sehen Sie sich diese an. +- [Wunschliste des Ecosystem Support Program](https://esp.ethereum.foundation/wishlist/) – Bereiche für Tooling, Dokumentation und Infrastruktur, in denen das Ethereum Ecosystem Support Program aktiv nach Förderanträgen sucht +- [Web3Bridge](https://www.web3bridgeafrica.com) – schließen Sie sich der Initiative der aufstrebenden Web3-Community an, um Hunderte von Entwicklern und Community-Mitgliedern in ganz Afrika zu finden, zu schulen und zu unterstützen - Treten Sie dem [Eth R&D Discord](https://discord.com/invite/VmG7Uxc) bei - Treten Sie dem [Ethereum Cat Herders Discord](https://discord.com/invite/Nz6rtfJ8Cu) bei -## Wissenschaftler und Akademiker {#researchers-and-academics} +## Forscher und Akademiker ‍ {#researchers-and-academics} Haben Sie einen Hintergrund in Mathematik, Kryptographie oder Wirtschaftswissenschaften? Vielleicht interessieren Sie sich für einige der innovativen Arbeiten, die im Ethereum-Ökosystem durchgeführt werden: - Treten Sie dem [Eth R&D Discord](https://discord.com/invite/VmG7Uxc) bei - Ethereum-Verbesserungsvorschläge formulieren oder prüfen - Ein EIP schreiben - 1. Reichen Sie Ihre Idee auf [Ethereum Magicians](https://ethereum-magicians.org) ein. - 2. Lesen Sie [EIP-1](https://eips.ethereum.org/EIPS/eip-1) – **Ja, das ist das _ganze_ Dokument**. + 1. Reichen Sie Ihre Idee bei den [Ethereum Magicians](https://ethereum-magicians.org) ein + 2. Lesen Sie [EIP-1](https://eips.ethereum.org/EIPS/eip-1) – **Ja, das ist das _gesamte_ Dokument.** 3. Folgen Sie den Anweisungen in EIP-1. Beziehen Sie sich auf die darin enthaltenen Informationen, während Sie Ihren Entwurf schreiben. - - Erfahren Sie, wie Sie ein [EIP Editor](https://eips.ethereum.org/EIPS/eip-5069) werden. - - Sie können direkt in das Peer-Review von EIPs einsteigen. Sehen Sie [Öffnen von PRs mit dem `e-review`-Tag](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). Geben Sie technisches Feedback über den `discussion-to`-Link. - - Beteiligen Sie sich an der [EIP-Verwaltung](https://github.com/ethereum-cat-herders/EIPIP). + - Erfahren Sie, wie Sie ein [EIP-Editor](https://eips.ethereum.org/EIPS/eip-5069) werden + - Sie können direkt in das Peer-Review von EIPs einsteigen. Sehen Sie sich [offene PRs mit dem `e-review`-Tag](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review) an. Geben Sie technisches Feedback über den `discussion-to`-Link. + - Beteiligen Sie sich an der [EIP-Governance](https://github.com/ethereum-cat-herders/EIPIP) - Treten Sie dem [Ethereum Cat Herders Discord](https://discord.com/invite/Nz6rtfJ8Cu) bei - - [Mehr zu EIPs](/eips/) -- [Challenges.ethereum.org](https://challenges.ethereum.org/) – eine Reihe hochwertiger Forschungsprämien, bei denen Sie >100.000 USD verdienen können -- [Ethresear.ch](https://ethresear.ch) – Ethereums primäres Forum für Forschung und das weltweit einflussreichste Forum für Kryptoökonomie -- [EF Research AMA](https://old.reddit.com/r/ethereum/comments/vrx9xe/ama_we_are_ef_research_pt_8_07_july_2022) – Eine fortlaufende Q&A-Reihe mit Wissenschaftlern. Während sich die weiteren Teile öffnen, können alle Fragen stellen. -- [Wunschliste des Ethereum Ecosystem-Supportprogrramms](https://esp.ethereum.foundation/wishlist/) – Forschungsbereiche, für die das Ethereum Ecosystem-Supportprogramm aktiv Förderer sucht -- [AllWalletDevs](https://allwallet.dev) – ein Forum für Ethereum-Entwickler, -Designer und interessierte Benutzer, um regelmäßig zusammenzukommen und Wallets zu besprechen + - [Mehr über EIPs](/eips/) +- [Challenges.ethereum.org](https://challenges.ethereum.org/) – eine Reihe von hochwertigen Forschungsprämien, bei denen Sie >100.000 USD verdienen können +- [Ethresear.ch](https://ethresear.ch) – Das primäre Forschungsforum von Ethereum und das weltweit einflussreichste Forum für Kryptoökonomie +- [EF Research AMA](https://old.reddit.com/r/ethereum/comments/vrx9xe/ama_we_are_ef_research_pt_8_07_july_2022) – Eine fortlaufende F&A-Reihe mit Forschern. Während sich die weiteren Teile öffnen, können alle Fragen stellen. +- [Wunschliste des Ecosystem Support Program](https://esp.ethereum.foundation/wishlist/) – Forschungsbereiche, in denen das Ethereum Ecosystem Support Program aktiv nach Förderanträgen sucht +- [AllWalletDevs](https://allwallet.dev) – ein Forum für Ethereum-Entwickler, Designer und interessierte Benutzer, um regelmäßig zusammenzukommen und Wallets zu besprechen [Erkunden Sie weitere aktive Forschungsbereiche](/community/research/). -## Nicht-technische Kompetenzen {#non-technical} +## Nichttechnische Fähigkeiten ‍ {#non-technical} Wenn Sie kein Entwickler sind, ist es nicht ganz so einfach, herauszufinden, wo es bei Ethereum etwas für Sie zu tun gibt. Im Folgenden finden Sie einige Vorschläge sowie Ressourcen für bestimmte berufliche Hintergründe. -### Organisieren Sie ein Treffen in Ihrer Stadt {#meetups} +### Organisieren Sie ein Meetup in Ihrer Stadt {#meetups} -- Sie wissen nicht, wie Sie anfangen sollen? Das [BUIDL-Netz](https://consensys.net/developers/buidlnetwork/) kann helfen. +- Sie wissen nicht, wie Sie anfangen sollen? Das [BUIDL-Netzwerk](https://consensys.net/developers/buidlnetwork/) kann dabei helfen. -### Inhalte zu Ethereum verfassen {#write-content} +### Schreiben Sie Inhalte über Ethereum {#write-content} - Ethereum braucht gute Autoren, die seinen Wert in einfacher Sprache erklären können. -- Sie Sie noch nicht bereit, Ihre eigenen Artikel zu veröffentlichen? Sie könnten in Betracht ziehen, einen Beitrag zu den bestehenden Inhalten auf Community-Ressourcen zu leisten oder [neue Inhalte für ethereum.org vorzuschlagen](/contributing/). +- Sie Sie noch nicht bereit, Ihre eigenen Artikel zu veröffentlichen? Ziehen Sie in Erwägung, zu den bestehenden Inhalten auf Community-Ressourcen beizutragen oder [neue Inhalte für ethereum.org vorzuschlagen](/contributing/)! -### Protokollerstellung für Community-Gespräche anbieten {#take-notes} +### Bieten Sie an, bei Community-Calls Notizen zu machen {#take-notes} -- Es gibt viele Open-Source-Community-Calls. Dabei Notizen zu machen, ist eine große Hilfe. Wenn Sie interessiert sind, treten Sie dem [Ethereum Cat Herders-Discord](https://discord.com/invite/Nz6rtfJ8Cu) bei und stellen Sie sich vor. +- Es gibt viele Open-Source-Community-Calls. Dabei Notizen zu machen, ist eine große Hilfe. Wenn Sie interessiert sind, treten Sie dem [Ethereum Cat Herders Discord](https://discord.com/invite/Nz6rtfJ8Cu) bei und stellen Sie sich vor! -### Ethereum-Inhalte in Ihre Muttersprache übersetzen {#translate-ethereum} +### Übersetzen Sie Ethereum-Inhalte in Ihre Muttersprache {#translate-ethereum} - ethereum.org unterhält ein Übersetzungsprogramm, über das die Website und andere Ressourcen in viele verschiedene Sprachen übersetzt werden. -- Wie Sie sich beteiligen können, erfahren Sie [hier](/Beitrag/Übersetzungsprogramm). +- Erfahren Sie [hier](/contributing/translation-program), wie Sie sich beteiligen können -### Einen Knoten ausführen {#run-a-node} +### Betreiben Sie einen Node {#run-a-node} Schließen Sie sich Tausenden von Knotenbetreibern an und leisten Sie einen Beitrag zur weiteren Dezentralisierung von Ethereum. -- [Mehr zum Betrieb eines Knotens](/developers/docs/nodes-and-clients/run-a-node/) +- [Mehr zum Betreiben eines Nodes](/developers/docs/nodes-and-clients/run-a-node/) -### Eigene ETH staken {#staking} +### Staken Sie Ihre ETH {#staking} Durch das Staking Ihrer eigenen ETH können Sie Belohnungen verdienen und gleichzeitig dazu beitragen, das Ethereum-Netzwerk zu sichern. -- [Mehr zum Staking](/staking/) +- [Mehr über Staking](/staking/) -### Projekte unterstützen {#support-projects} +### Unterstützen Sie Projekte {#support-projects} Das Ethereum-Ökosystem hat es sich zur Aufgabe gemacht, das Allgemeinwohl und wirkungsvolle Projekte zu finanzieren. Mit sehr kleinen Spenden können Sie Ihre Unterstützung zeigen und wichtige Arbeiten ermöglichen. - [Gitcoin](https://gitcoin.co/fund) - [clr.fund](https://clr.fund/#/about) -## Finanzfachleute und Buchhalter:innen {#financial-professionals} +## Finanzexperten und Buchhalter ‍ {#financial-professionals} -- Ethereum beherbergt das Ökosystem „Decentralized Finance“ – ein Netzwerk aus Protokollen und Anwendungen, die ein alternatives Finanzsystem bieten. Finanzexperten legen wir einige DeFi-Apps ans Herz: [DeFi Llama](https://defillama.com/) oder [DeFiPrime](https://defiprime.com) -- Fit in Buchhaltung? Ethereum-Vermögenswerte – ETH, Token, DeFi usw. – bringen viele neue Buchhaltungsprobleme mit sich. Sie könnten sich einige Projekte anzusehen, die darauf abzielen, den Nutzern von Kryptowährungen bei der Lösung ihrer Buchhaltungs- und Rechnungslegungsprobleme zu helfen, wie [Rotki](https://rotki.com/). +- Ethereum beherbergt das Ökosystem „Decentralized Finance“ – ein Netzwerk aus Protokollen und Anwendungen, die ein alternatives Finanzsystem bieten. Wenn Sie ein Finanzexperte sind, sehen Sie sich einige DeFi-Apps auf [DeFi Llama](https://defillama.com/) oder [DeFiPrime](https://defiprime.com) an +- Fit in Buchhaltung? Ethereum-Vermögenswerte – ETH, Token, DeFi usw. – bringen viele neue Buchhaltungsprobleme mit sich. Sie könnten damit beginnen, sich einige Projekte anzusehen, die Nutzern von Kryptowährungen helfen sollen, ihre Herausforderungen in der Buchführung und im Rechnungswesen zu lösen, wie zum Beispiel [Rotki](https://rotki.com/) -## Produktmanager {#product-managers} +## Produktmanager ‍ {#product-managers} -- Das Ethereum-Ökosystem braucht Ihr Talent. Viele Unternehmen stellen Produktmanager ein. Wenn Sie anfangen möchten, indem Sie zu einem Open-Source-Projekt beitragen, dann kontaktieren Sie die [Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) oder [RaidGuild](https://www.raidguild.org/) +- Das Ethereum-Ökosystem braucht Ihr Talent. Viele Unternehmen stellen Produktmanager ein. Wenn Sie damit beginnen möchten, zu einem Open-Source-Projekt beizutragen, wenden Sie sich an die [Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) oder die [RaidGuild](https://www.raidguild.org/) -## Marketing {#marketing} +## Marketing ‍ {#marketing} - Im Ethereum-Ökosystem gibt es viele Marketing- und Kommunikationspositionen. -## Arbeitsplätze bei Ethereum {#ethereum-jobs} +## Ethereum-Jobs {#ethereum-jobs} **Möchten Sie einen Job bei Ethereum finden?** -- [Jobs auf ethereum.org](/about/#open-jobs) -- [Ethereum Foundation-Stellenportal](https://jobs.ashbyhq.com/ethereum-foundation) +- [Jobs bei ethereum.org](/about/#open-jobs) +- [Jobbörse der Ethereum Foundation](https://jobs.ashbyhq.com/ethereum-foundation) - [JobStash](https://jobstash.xyz) -- [Jobs im Zusammenhang mit Kryptowährung](https://cryptocurrencyjobs.co/ethereum/) +- [Ethereum Jobbörse](https://www.ethereumjobboard.com/) +- [Jobs für Kryptowährungen](https://cryptocurrencyjobs.co/ethereum/) - [Karriere bei ConsenSys](https://consensys.net/careers/) -- [Liste mit Jobs in der Krypto-Welt](https://cryptojobslist.com/ethereum-jobs) -- [Stellenportal für Jobs ohne Bankbezug](https://pallet.xyz/list/bankless/jobs) -- [Jobs bei Web3](https://web3.career) +- [Crypto-Jobs-Liste](https://cryptojobslist.com/ethereum-jobs) +- [Bankless-Jobbörse](https://pallet.xyz/list/bankless/jobs) +- [Web3-Jobs](https://web3.career) - [Web3 Army](https://web3army.xyz/) - [Jobs im Crypto Valley](https://cryptovalley.jobs/) -- [Arbeitsplätze bei Ethereum](https://startup.jobs/ethereum-jobs) +- [Ethereum-Jobs](https://startup.jobs/ethereum-jobs) -## Einer DAO beitreten {#decentralized-autonomous-organizations-daos} +## Treten Sie einer DAO bei {#decentralized-autonomous-organizations-daos} -„DAOs" sind dezentralisierte, autonome Organisationen. Diese Gruppen nutzen die Ethereum-Technologie, um die Organisation und Zusammenarbeit zu erleichtern. Zum Beispiel für die Kontrolle der Mitgliedschaft, die Abstimmung über Vorschläge oder die Verwaltung von gepooltem Vermögen. DAOs befinden sich zwar noch im Experimentierstadium, aber sie bieten viele Möglichkeiten, Gruppen und Gleichgesinnte zu finden, mit denen Sie sich identifizieren und über die Sie Ihren Einfluss auf die Ethereum-Community vergrößern können. [Mehr zu DAOs](/dao/) +„DAOs" sind dezentralisierte, autonome Organisationen. Diese Gruppen nutzen die Ethereum-Technologie, um die Organisation und Zusammenarbeit zu erleichtern. Zum Beispiel für die Kontrolle der Mitgliedschaft, die Abstimmung über Vorschläge oder die Verwaltung von gepooltem Vermögen. DAOs befinden sich zwar noch im Experimentierstadium, aber sie bieten viele Möglichkeiten, Gruppen und Gleichgesinnte zu finden, mit denen Sie sich identifizieren und über die Sie Ihren Einfluss auf die Ethereum-Community vergrößern können. [Mehr über DAOs](/dao/) -- [DAOSquare](https://daosquare.io/) [@DAOSquare](https://twitter.com/DAOSquare) – _verbreiten Sie das DAO-Konzept in nichttechnischen Bereichen und helfen Sie anderen bei der Wertschöpfung durch DAO_ -- [Entwickler-DAO](https://www.developerdao.com/) [@entwickler_dao](https://twitter.com/developer_dao) – _Gemeinschaft aus Erstellern, die an das kollektive Eigentum am Internet glauben_ -- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) – _Web3-Entwicklungskollektiv aus Freiberuflern, das als DAO arbeitet_ -- [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit) - _Gemeinschaftsverwaltung von DAOHaus_ -- [LexDAO](https://lexdao.org) [@lex_DAO](https://twitter.com/lex_DAO) – _Rechtstechnik_ -- [MetaCartel Ventures](https://metacartel.xyz) [@VENTURE_DAO](https://twitter.com/VENTURE_DAO) – _Venture für vorinstallierte Kryptoprojekte_ -- [MetaGame](https://metagame.wtf) [@MetaFam](https://twitter.com/MetaFam) – _MMORPG-Spielmechanismen für das echte Leben_ -- [MetaFactory](https://metafactory.ai) [@TheMetaFactory](https://twitter.com/TheMetaFactory) – _Digi-physische Modemarken_ -- [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) – _Gemeinschaft zur Finanzierung der Entwicklung von Ethereum_ -- [Raid-Gilde](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) – _Kollektiv von Web3-Erstellern_ +- [DAOSquare](https://daosquare.io/) [@DAOSquare](https://twitter.com/DAOSquare) – _Das DAO-Konzept im nicht-technischen Bereich fördern und Menschen helfen, durch eine DAO Werte zu schaffen_ +- [Developer DAO](https://www.developerdao.com/) [@developer_dao](https://twitter.com/developer_dao) – _Eine Gemeinschaft von Buildern, die an das kollektive Eigentum des Internets glauben_ +- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) – _Kollektiv von freiberuflichen Web3-Entwicklern, die als DAO arbeiten_ +- [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit) – _Community-Governance von DAOhaus_ +- [LexDAO](https://lexdao.org) [@lex_DAO](https://twitter.com/lex_DAO) – _Legal Engineering_ +- [MetaCartel Ventures](https://metacartel.xyz) [@VENTURE_DAO](https://twitter.com/VENTURE_DAO) – _Venture für Krypto-Projekte in der Pre-Seed-Phase_ +- [MetaFactory](https://metafactory.ai) [@TheMetaFactory](https://twitter.com/TheMetaFactory) – _Digiphysische Bekleidungsmarken_ +- [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) – _Community, die sich auf die Finanzierung der Ethereum-Entwicklung konzentriert_ +- [Raid Guild](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) – _Kollektiv von Web3-Buildern_ -Denken Sie daran, sich an den [Verhaltenskodex](/community/code-of-conduct) von ethereum.org zu halten, wann und wie auch immer Sie zu ethereum.org beitragen. +Bitte denken Sie daran, den [Verhaltenskodex](/community/code-of-conduct) von ethereum.org einzuhalten, wann und wie auch immer Sie zu ethereum.org beitragen! diff --git a/public/content/translations/de/community/grants/index.md b/public/content/translations/de/community/grants/index.md index 188fd8f32f7..48597216382 100644 --- a/public/content/translations/de/community/grants/index.md +++ b/public/content/translations/de/community/grants/index.md @@ -1,47 +1,68 @@ --- -title: Ethereum Foundation und Förderprogramme der Community +title: Ethereum Foundation & Förderprogramme der Community description: Eine Auflistung der Förderprogramme im gesamten Ethereum-Ökosystem. lang: de --- -# Ethereum-Finanzierungshilfen {#ethereum-grants} +# Ethereum-Förderungen {#ethereum-grants} Die unten aufgelisteten Programme bieten eine Vielzahl von Finanzierungshilfen für Projekte, die den Erfolg und das Wachstum des Ethereum-Ökosystems fördern. Nutzen Sie die Liste als Leitfaden, um Finanzierungsmöglichkeiten zu finden und zu beantragen, die Ihr nächstes Ethereum-Projekt zu einem Erfolg machen. Diese Liste wird von unserer Community verwaltet. Wenn Informationen fehlen oder falsch sind, bearbeiten Sie diese Seite gerne. -## Das weitere Ethereum-Ökosystem {#broad-ethereum-ecosystem} + + +
Gründer, benötigen Sie Hilfe, um Ihr Unternehmen zu beschleunigen? [Besuchen Sie die Gründerunterstützung](/founders/)
+
+ +## Breites Ethereum-Ökosystem {#broad-ethereum-ecosystem} Diese Programme unterstützen das breit gefächerte Ethereum-Ökosystem, indem sie Finanzierungen für zahlreiche Projekte bereitstellen. Dazu gehören unter anderem Lösungen zu Skalierbarkeit, Community-Aufbau, Sicherheit und Privatsphäre. Diese Fördermaßnahmen sind nicht spezifisch für eine bestimmte Ethereum-Plattform und sind ein guter Ausgangspunkt, wenn Sie unsicher sind. -- [EF-Ökosystem Unterstützungsprogramm](https://esp.ethereum.foundation) - _Finanzierung von Open-Source-Projekten, die Ethereum zugutekommen, mit besonderem Fokus auf universelle Werkzeuge, Infrastruktur, Forschung und öffentliche Güter_ -- [Moloch DAO](https://www.molochdao.com/) – _Datenschutz, Layer-2-Skalierung, Client-Sicherheit und mehr_ -- [DAO-Zuschüsse](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) – _Google-Tabelle der Organisationen, die Zuschüsse anbieten_ -- [Akademische Stipendien](https://esp.ethereum.foundation/academic-grants) – _Stipendien zur Untstützung akademischer Arbeiten in Bezug auf Ethereum_ -- [Blockworks Grantfarm](https://blockworks.co/grants/programs) - _Blockworks hat ein umfassendes Verzeichnis aller Zuschüsse, Ausschreibungen und Bug-Bounties zusammengestellt._ +- [EF Ecosystem Support Program](https://esp.ethereum.foundation) – _Finanzierung von Open-Source-Projekten, die Ethereum zugutekommen, mit besonderem Fokus auf universelle Werkzeuge, Infrastruktur, Forschung und öffentliche Güter_ +- [Akademische Förderungen](https://esp.ethereum.foundation/academic-grants) – _Förderungen zur Unterstützung von akademischer Arbeit im Zusammenhang mit Ethereum_ + +## Aggregatoren und Plattformen für Förderungslisten {#grant-list-aggregators} + +Diese Ressourcen sammeln und organisieren diverse Fördermöglichkeiten aus dem Ethereum-Ökosystem, was es einfacher macht, passende Finanzierungen für die Anforderungen deines Projekts zu finden. Wir haben sie nach Personas geordnet, damit du basierend auf deinem spezifischen Finanzierungsbedarf einfacher die relevantesten Ressourcen findest. + +### Für alle Förderungssuchenden: Umfassende Verzeichnisse {#comprehensive-directories} + +Diese allgemeinen Plattformen bieten eine breite Abdeckung von Fördermitteln im gesamten Web3-Bereich und sind nützliche Anlaufstellen für jeden, der eine Finanzierung sucht: + +- [Blockworks Grantfarm](https://blockworks.co/grants/programs) – _Blockworks hat ein umfassendes Verzeichnis aller Zuschüsse, Ausschreibungen und Bug-Bounties zusammengestellt._ +- [Blockchain Grants](https://www.blockchaingrants.org/) – _Verzeichnis von Blockchain- und Krypto-Förderungen_ +- [Karma Funding Map](https://gap.karmahq.xyz/funding-map) – Verzeichnis aller Web3-Förderprogramme, wöchentlich aktualisiert + +### Für Entwickler und Builder {#for-developers-and-builders} + +- [Grant Programs Viewer](https://airtable.com/shr86elKgWTSCP4AY) – _Öffentliche Airtable-Datenbank von Förderprogrammen_ +- [Web3 Grants Spreadsheet](https://docs.google.com/spreadsheets/d/1c8koZCI-GLnD8MG-eFcXPOBCNu1v8-aXIfwAAvc7AMc/edit#gid=0) – _Google-Tabelle mit Web3-Fördermöglichkeiten_ +- [Arbitrum Grants](https://arbitrum.foundation/grants) — Arbitrum DAO und [The Arbitrum Foundation](https://arbitrum.foundation/) + +### Für DeFi-Projekte und Finanzanwendungen {#for-defi-projects} + +- [LlamaoGrants](https://wiki.defillama.com/wiki/LlamaoGrants) – _Verzeichnis der Förderprogramme von DeFi Llama_ +- [AlphaGrowth Grants](https://alphagrowth.io/crypto-web3-grants-list) – _Umfassende Liste von Krypto- und Web3-Förderungen_ +- [Uniswap Foundation Grants](https://www.uniswapfoundation.org/build) – _Unichain- und Uniswap-v4-Förderungen und Unterstützung für DeFi-Builder_ -## Projektspezifisch {#project-specific} +### Für DAO-Mitwirkende und Governance-Innovatoren {#for-dao-contributors} -Diese Projekte haben ihre eigenen Zuschüsse für Projektvorhaben zur Entwicklung und Erprobung ihrer eigenen Technologie geschaffen. +Unterstützung für Community-Projekte und Experimente im Bereich Governance: -- [Aave-Zuschussprogramm](https://aavegrants.org/) – _[Aave](https://aave.com/) Grants DAO_ -- [Balancer](https://grants.balancer.community/) – _[Balancer](https://balancer.fi/)-Ökosystemfonds_ -- [Chainlink-Förderprogramm](https://chain.link/community/grants) - _[Chainlink](https://chain.link/) Gemeinschaftsförderungen_ -- [Decentraland-Zuschussprogramm](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/)-DAO-Metaverse_ -- [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/)-Finanzökosystem_ -- [MetaMask-Programm](https://metamaskgrants.org/) – _Mitarbeitergeleitete DAO für[MetaMask](https://metamask.io/)-Zuschüsse_ -- [SKALE-Network-Förderprogramm](https://skale.space/developers#grants) – _[SKALE-Network](https://skale.space/)-Ökosystem_ -- [Swarm Foundation-Förderprogramm](https://my.ethswarm.org) – _[Swarm Foundation](https://www.ethswarm.org/)-Ökosystem_ -- [The Graph](https://thegraph.com/ecosystem/grants/) – _[The Graph](https://thegraph.com/)-Ökosystem_ -- [Uniswap-Förderprogramm](https://www.uniswapfoundation.org/approach) – _[Uniswap](https://uniswap.org/)-Community_ +- [DAO Grants](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) – _Google-Tabelle von Organisationen, die Förderungen anbieten_ +- [MetaGov Database](https://docs.google.com/spreadsheets/d/1e5g-dlWWsK2DZoZGBgfxyfGNSddLk-V7sLEgfPjEhbA/edit#gid=780420708) – _Umfassende Karte von Web3-Förderungen_ -## Quadratische Finanzierung {#quadratic-funding} +### Öffentliche Güter und Auswirkungen {#public-goods-and-impact} -Die Open-Source-Wurzeln von Ethereum haben zur Entwicklung eines interessanten neuen Finanzierungsmodells geführt: die quadratische Finanzierung. Dieses Modell hat das Potenzial die Art und Weise zu verbessern, wie wir in Zukunft alle Arten von öffentlichen Gütern finanzieren. Die quadratische Finanzierung stellt sicher, dass die Projekte mit dem größten individuellen Bedarf auch die meisten Mittel erhalten. Mit anderen Worten: Projekte, die das Leben der meisten Menschen verbessern können. [Mehr zur quadratischen Finanzierung.](/defi/#quadratic-funding) +Diese Programme konzentrieren sich auf die Finanzierung von Projekten, die der breiteren Gemeinschaft, öffentlichen Gütern und wirkungsvollen Initiativen zugutekommen. Dazu gehören Förderungsanbieter sowie Spendenplattformen, die On-Chain-Mechanismen zur Mittelzuweisung nutzen, einschließlich [quadratischer Finanzierung](/defi/#quadratic-funding): -- [Gitcoin](https://gitcoin.co/grants) -- [clr.fund](https://clr.fund/) +- [Gitcoin](https://www.gitcoin.co/program) – _Gitcoin Grants nutzt mehrere Mechanismen zur Kapitalallokation, um Open-Source-Projekte und öffentliche Güter im Ethereum-Ökosystem zu finanzieren_ +- [Octant](https://octant.app/home) – _Ökosystem zur Finanzierung öffentlicher Güter, das das Gemeinwohl und die individuelle finanzielle Selbstbestimmung in Einklang bringt_ +- [Giveth](https://giveth.io/) – _Krypto-Spendenplattform, die direkte Spenden für gemeinnützige Projekte ohne zusätzliche Gebühren ermöglicht_ +- [Artizen](https://artizen.fund/) – _Unterstützt Kreative bei der Gegenfinanzierung neuer Projekte an der Schnittstelle von Kunst, Wissenschaft, Technologie und Kultur_ +- [Quadratic Accelerator](https://qacc.giveth.io/) – _Ein Start-up-Beschleunigerprogramm, das quadratische Finanzierung nutzt, um Projekte zu unterstützen, die dem Gemeinwohl dienen_ -## Arbeiten in Ethereum {#work-in-ethereum} +## Arbeiten mit Ethereum {#work-in-ethereum} -Sind Sie noch nicht bereit, Ihr eigenes Projekt zu starten? Es gibt Hunderte von Unternehmen, die aktiv nach engagierten Personen suchen, die im Ethereum-Ökosystem arbeiten und einen Beitrag dazu leisten wollen. Sind Sie an weiteren Informationen interessiert? [Suche nach Jobs mit Bezug zu Ethereum](/community/get-involved/#ethereum-jobs) +Sind Sie noch nicht bereit, Ihr eigenes Projekt zu starten? Es gibt Hunderte von Unternehmen, die aktiv nach engagierten Personen suchen, die im Ethereum-Ökosystem arbeiten und einen Beitrag dazu leisten wollen. Sind Sie an weiteren Informationen interessiert? [Entdecken Sie Jobs rund um Ethereum](/community/get-involved/#ethereum-jobs) diff --git a/public/content/translations/de/community/language-resources/index.md b/public/content/translations/de/community/language-resources/index.md index 4ead0bcd9a4..20dd73754a1 100644 --- a/public/content/translations/de/community/language-resources/index.md +++ b/public/content/translations/de/community/language-resources/index.md @@ -12,15 +12,15 @@ Unser Ziel ist es, Bildungsinhalte in allen Sprachen bereitzustellen und die Spr Wenn Sie Inhalte lieber in Ihrer Muttersprache lesen oder jemanden kennen, der kein Englisch spricht, finden Sie unten eine Liste nützlicher Ressourcen, die nicht in Englisch sind. Hunderttausende von Ethereum-Enthusiasten treffen sich in diesen Online-Foren, um Neuigkeiten auszutauschen, über aktuelle Entwicklungen zu sprechen, technische Fragen zu diskutieren und Bilder der Zukunft zu zeichnen. -Kennen Sie eine Bildungsressource in Ihrer Sprache? [Eröffnen Sie ein Ticket](https://github.com/ethereum/ethereum-org-website/issues/new/choose), um die Ressource in die Liste aufzunehmen. +Kennen Sie eine Bildungsressource in Ihrer Sprache? [Eröffne ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new/choose), um es zur Liste hinzuzufügen! -## Ressourcen von Ethereum.org {#ethereum-org} +## Ethereum.org-Ressourcen {#ethereum-org} Ethereum.org wird muttersprachlich in über 40 Sprachen übersetzt. Diese können Sie in unserem Sprachauswahlmenü am oberen Rand auf jeder Seite finden. ![Sprachauswahlmenü](./language-selector-menu.png) -Wenn Sie zweisprachig sind und uns helfen möchten, mehr Menschen zu erreichen, können Sie sich auch am [Übersetzungprogramm von ethereum.org](/contributing/translation-program/#translation-program) beteiligen und uns bei der Übersetzung der Website helfen. +Wenn Sie zweisprachig sind und uns helfen möchten, mehr Menschen zu erreichen, können Sie sich auch am [Übersetzungsprogramm von ethereum.org](/contributing/translation-program/#translation-program) beteiligen und uns bei der Übersetzung der Website helfen. ## Community-Ressourcen {#community} @@ -28,126 +28,126 @@ Wenn Sie zweisprachig sind und uns helfen möchten, mehr Menschen zu erreichen, **Nachrichten** -- [BeInCrypto](http://www.beincrypto.com.br) – Nachrichten und Artikel über Kryptowährungen, einschließlich einer Liste von verfügbaren Handelsplätzen in Brasilien -- [Cointelegraph](http://cointelegraph.com.br/category/analysis) – brasilianische Version von Cointelegraph, einer wichtigen Nachrichtenquelle für Kryptowährungen -- [Livecoins](http://www.livecoins.com.br/ethereum) – Nachrichten zu Kryptowährungen und Tools -- [Seudinheiro](http://www.seudinheiro.com/criptomoedas/) – Nachrichten und Berichte über Kryptowährungen -- [Modular Crypto](https://modularcrypto.xyz/) – Nachrichten und informative Artikel über Kryptowährungen +- [BeInCrypto](http://www.beincrypto.com.br) – Nachrichten und Artikel über Kryptowährungen, einschließlich einer Liste von in Brasilien verfügbaren Börsen +- [Cointelegraph](http://cointelegraph.com.br/category/analysis) – brasilianische Version von Cointelegraph, einem wichtigen Nachrichtenportal für Kryptowährungen +- [Livecoins](http://www.livecoins.com.br/ethereum) – Nachrichten und Tools zu Kryptowährungen +- [Seudinheiro](http://www.seudinheiro.com/criptomoedas/) – Nachrichten und Berichte zu Kryptowährungen +- [Modular Crypto](https://modularcrypto.xyz/) – Nachrichten und Bildungsartikel zu Kryptowährungen **Bildung** -- [web3dev](https://www.web3dev.com.br/) – Inhalts-Hub und Discord-Community für Web3-Entwickler +- [web3dev](https://www.web3dev.com.br/) – Content-Hub und Discord-Community für Web3-Entwickler. - [Web3Brasil](https://github.com/web3brasil/web3brasil) – Ressourcen zum Erlernen von Web3 und DeFi -- [CriptoFacil](http://www.criptofacil.com/ultimas-noticias/) – Nachrichten zu Kryptowährungen und Bildung, einschließlich „Ethereum für Einsteiger“ und „DeFi für Einsteiger“ -- [CriptoAtivos](http://www.criptoativos.wiki.br/) – Einblicke in die Welt der Kryptowährungen, Bildung und Blog -- [Cointimes](http://www.cointimes.com.br/) – Nachrichten zu Kryptowährungen und Bildung -- [Web3-Starterpaket](https://docs.google.com/document/d/1X8PSTFH7FTw9J-gbKWM6Y430SWCBT8d4t4pJgFQHJ8E/) – ein Leitfaden mit Antworten auf die am häufigsten gestellten und grundlegenden Kryptofragen +- [CriptoFacil](http://www.criptofacil.com/ultimas-noticias/) – Nachrichten und Bildungsinhalte zu Kryptowährungen, einschließlich ‚Ethereum für Einsteiger‘ und ‚DeFi für Einsteiger‘ +- [CriptoAtivos](http://www.criptoativos.wiki.br/) – Einblicke in die Welt der Kryptowährungen, Bildungsinhalte und Blog +- [Cointimes](http://www.cointimes.com.br/) – Nachrichten und Bildungsinhalte zu Kryptowährungen +- [Web3 Starter Pack](https://docs.google.com/document/d/1X8PSTFH7FTw9J-gbKWM6Y430SWCBT8d4t4pJgFQHJ8E/) – ein Leitfaden, der die am häufigsten gestellten und grundlegendsten Krypto-Fragen beantwortet ### Chinesisch {#zh} **Allgemeine Ressourcen** -- [Ethereum.cn](https://www.ethereum.cn/) – von der Community gepflegte Inhalte, die das Upgrade der Konsensschicht, alle Notizen zu den Kernentwicklungssitzungen, Layer 2 usw. umfassen -- [EthFans](https://github.com/editor-Ajian/EthFans.org-annual-collected-works/) – Lernen Sie alles von den Grundlagen bis zu Ethereum-Themen für Fortgeschrittene -- [Unitimes](https://mp.weixin.qq.com/s/tvloZSDBSOQN9zDQj_91kA) – von der Community gepflegte Inhalte, die Ethereum, DeFi, NFT, Web3-bezogenes Wissen abdecken -- [123ETH](https://123eth.org/) – ein Portal für das Ethereum-Ökosystem +- [Ethereum.cn](https://www.ethereum.cn/) – von der Community gepflegte Inhalte, die das Upgrade der Konsensebene, alle Notizen zu den Core-Dev-Meetings, Layer 2 usw. umfassen. +- [EthFans](https://github.com/editor-Ajian/EthFans.org-annual-collected-works/) – lernen Sie alles von den Grundlagen bis zu fortgeschrittenen Ethereum-Themen +- [Unitimes](https://mp.weixin.qq.com/s/tvloZSDBSOQN9zDQj_91kA) – von der Community gepflegte Inhalte, die Wissen zu Ethereum, DeFi, NFT und Web3 abdecken +- [123ETH](https://123eth.org/) – ein Portal zum Ethereum-Ökosystem - [Zhen Xiao](http://zhenxiao.com/blockchain/) – kostenlose Online-Kurse über Kryptowährungen und ihre Anwendungen -- [Ethereum Whitepaper](https://github.com/ethereum/wiki/wiki/[%E4%B8%AD%E6%96%87]-%E4%BB%A5%E5%A4%AA%E5%9D%8A%E7%99%BD%E7%9A%AE%E4%B9%A6) – Chinesische Version des Ethereum-Whitepapers +- [Ethereum-Whitepaper](/zh/whitepaper/) – chinesische Version des Ethereum-Whitepapers **Ethereum-Ökosystem** -- [ETHPlanet](https://www.ethplanet.org/) – Online- und persönliche Hackathons, die Schulungen für Universitätsstudenten anbieten -- [PrimitivesLane](https://www.primitiveslane.org/) – eine gemeinnützige Forschungsgruppe, die sich mit der Blockchain-Technologie beschäftigt -- [Ethereum Translation Community CN](https://www.notion.so/Ethereum-Translation-Community-CN-05375fe0a94c4214acaf90f42ba40171) – eine Community, die sich der Übersetzung von Ethereum-Bildungsinhalten widmet +- [ETHPlanet](https://www.ethplanet.org/) – Online- und Präsenz-Hackathons, die Schulungen für Universitätsstudenten anbieten +- [PrimitivesLane](https://www.primitiveslane.org/) – eine gemeinnützige Forschungsgruppe, die sich auf die Blockchain-Technologie konzentriert +- [Ethereum Translation Community CN](https://www.notion.so/Ethereum-Translation-Community-CN-05375fe0a94c4214acaf90f42ba40171) – eine Community, die sich der Übersetzung von lehrreichen Ethereum-Inhalten widmet **Für Entwickler** -- [DappLearning](https://github.com/Dapp-Learning-DAO/Dapp-Learning) - eine Lerngruppe, um Mainstream-Dapp-Projekte zu studieren und jede Woche Gedanken und Anmerkungen auszutauschen -- [LearnBlockchain](https://learnblockchain.cn/) – eine Community für Entwickler, die Informationen über die Blockchain-Technologie austauschen +- [DappLearning](https://github.com/Dapp-Learning-DAO/Dapp-Learning) – eine Lerngruppe, die Mainstream-Dapp-Projekte studiert und wöchentlich Gedanken und Kommentare austauscht +- [LearnBlockchain](https://learnblockchain.cn/) – eine Community für Entwickler, die Informationen über die Blockchain-Technologie austauscht **Für Kryptographieforscher** -- [SecbitLabs](https://mp.weixin.qq.com/s/69_tqBJpr_sbaKtR1sBRMw) – ein WeChat-Account, in dem Kryptographie, Sicherheit usw. erklärt werden -- [Sparkbyte](https://mp.weixin.qq.com/s/9KgKTc_jtJ7bWKdbNPoqvQ) – ein WeChat-Account, in dem die zk-Technologie erklärt wird +- [SecbitLabs](https://mp.weixin.qq.com/s/69_tqBJpr_sbaKtR1sBRMw) – ein WeChat-Account, der Kryptografie, Sicherheit usw. erklärt. +- [Sparkbyte](https://mp.weixin.qq.com/s/9KgKTc_jtJ7bWKdbNPoqvQ) – ein WeChat-Account, der die ZK-Technologie erklärt ### Tschechisch {#cs} -- [Gwei.cz](https://gwei.cz) - Lokale Gemeinschaft für Web3, die akademische Inhalte erstellt und Veranstaltungen organisiert, sowohl online als auch persönlich -- [Gwei.cz Leitfaden](https://prirucka.gwei.cz/) - Ethereum Leitfaden für Anfänger -- [DAO Leitfaden](https://dao.gwei.cz/) - Leitfaden über DAOs für Anfänger -- [Ethereum meistern](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) – Ethereum meistern auf Tschechisch +- [Gwei.cz](https://gwei.cz) – lokale Community rund um Web3, die Bildungsinhalte erstellt und Online- und Präsenzveranstaltungen organisiert +- [Gwei.cz Příručka](https://prirucka.gwei.cz/) – Ethereum-Leitfaden für Anfänger +- [DAO Příručka](https://dao.gwei.cz/) – Leitfaden für Anfänger zu DAOs +- [Mastering Ethereum](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) – „Mastering Ethereum“ auf Tschechisch ### Französisch {#fr} -- [Ethereum Frankreich](https://www.ethereum-france.com/) – Ethereum Frankreich organisiert Veranstaltungen, erstellt Inhalte und fördert Diskussionen rund um Ethereum -- [Ethereum.fr](https://ethereum.fr/) – Ethereum-Nachrichten und -Bildung +- [Ethereum France](https://www.ethereum-france.com/) – Ethereum France organisiert Veranstaltungen, erstellt Inhalte und fördert Diskussionen rund um Ethereum +- [Ethereum.fr](https://ethereum.fr/) – Nachrichten und Bildungsinhalte zu Ethereum - [BanklessFR](https://banklessfr.substack.com/) – Bankless-Newsletter auf Französisch - [CryptoFR](https://cryptofr.com/category/44/ethereum-general) – Kryptowährungsforum mit einer Ethereum-Unterseite ### Deutsch {#de} -- [Microsoft Learn (Solidity)](https://docs.microsoft.com/de-de/learn/modules/blockchain-learning-solidity/) – Solidity nutzen -- [Microsoft Learn (Intelligente Verträge)](https://docs.microsoft.com/de-de/learn/modules/blockchain-solidity-ethereum-smart-contracts/) – Intelligente Verträge von Ethereum mit Solidity schreiben -- [Microsoft Learn (Ethereum-Netzwerke)](https://docs.microsoft.com/de-de/learn/modules/blockchain-ethereum-networks/) – Verbindung zu Ethereum-Netzwerken herstellen und diese einsetzen +- [Microsoft Learn (Solidity)](https://docs.microsoft.com/de-de/learn/modules/blockchain-learning-solidity/) – Verwendung von Solidity +- [Microsoft Learn (Smart Contracts)](https://docs.microsoft.com/de-de/learn/modules/blockchain-solidity-ethereum-smart-contracts/) – Schreiben von Ethereum Smart Contracts mit Solidity +- [Microsoft Learn (Ethereum-Netzwerke)](https://docs.microsoft.com/de-de/learn/modules/blockchain-ethereum-networks/) – Verbinden mit und Bereitstellen von Ethereum-Netzwerken - [Microsoft Learn (Blockchains)](https://docs.microsoft.com/de-de/learn/paths/ethereum-blockchain-development/) – Einstieg in die Blockchain-Entwicklung ### Hebräisch {#he} -- [Udi Wertheimer: Was Bitcoiner von Ethereum lernen können](https://www.cryptojungle.co.il/udi-wertheimer-what-bitcoiners-can-learn-from-ethereum/) -- [Omer Greismen (OpenZeppelin): Wie wir einen 15-Milliarden-Dollar-Smart-Contract-Hack verhindert haben](https://www.cryptojungle.co.il/omer-greisman-openzeppelin/) -- [Shy Datika (INX): Tokenisierung und die Zukunft von Sicherheiten – und ob Ethereum eine Sicherheit ist](https://www.cryptojungle.co.il/shy-datika-tokenization/) -- [Roy Confino (Lemonade): Versicherung bei Ethereum](https://www.cryptojungle.co.il/roy-confino-insurance/) -- [Idan Ofrat (Fireblocks): Institutionelle Einführung](https://www.cryptojungle.co.il/idan-ofrat-fireblocks/) -- [Gal Weizman (MetaMask): Was ist MetaMask](https://www.cryptojungle.co.il/gal-weizman-metamask/) -- [Dror Aviely (Consensys): Das Zentrum von Ethereum](https://www.cryptojungle.co.il/dror-aviely-ethereum-center/) -- [Nir Rozin: Was es bedeutet, ein Cryptopunk zu sein](https://www.cryptojungle.co.il/nir-rozin-cryptopunk/) -- [Adan Kedem: Gaming & Metaversum](https://www.cryptojungle.co.il/adan-kedem-web3-gaming/) -- [Uri Kolodny (Starkware): Ethereum- und Blockchainebenen](https://www.cryptojungle.co.il/uri-kolodny-starkware/) -- [Udi Wertheimer: Ethereum 2.0 und seine Konkurrenz](https://www.cryptojungle.co.il/udi-on-eth2/) -- [Ben Samocha (ich selbst): Ethereum 2.0 – eine Gelegenheit?](https://www.cryptojungle.co.il/etherurm2-week-summary/) -- [Alon Muroch (Bloxstaking): Was ist Ethereum 2.0?](https://www.cryptojungle.co.il/alon-moroch-eth2/) -- [Eilon Aviv (Collider Ventures): Was mit Ethereum 2.0 schiefgehen kann](https://www.cryptojungle.co.il/eilon-aviv-eth2-0/) -- [Eilon Aviv (Collider Ventures): Warum wir Ethereum 2.0 brauchen](https://www.cryptojungle.co.il/eilon-aviv-ethereum-2-0/) +- [Udi Wertheimer – Was Bitcoiner von Ethereum lernen können](https://www.cryptojungle.co.il/udi-wertheimer-what-bitcoiners-can-learn-from-ethereum/) +- [Omer Greismen (OpenZeppelin) – Wie wir einen 15-Milliarden-Dollar-Hack eines Smart Contracts verhindert haben](https://www.cryptojungle.co.il/omer-greisman-openzeppelin/) +- [Shy Datika (INX) – Tokenisierung und die Zukunft von Wertpapieren, einschließlich der Frage, ob Ethereum ein Wertpapier ist](https://www.cryptojungle.co.il/shy-datika-tokenization/) +- [Roy Confino (Lemonade) – Versicherung @ Ethereum](https://www.cryptojungle.co.il/roy-confino-insurance/) +- [Idan Ofrat (Fireblocks) – Institutionelle Akzeptanz](https://www.cryptojungle.co.il/idan-ofrat-fireblocks/) +- [Gal Weizman (MetaMask) – Was ist MetaMask](https://www.cryptojungle.co.il/gal-weizman-metamask/) +- [Dror Aviely (Consensys) – Das Zentrum von Ethereum](https://www.cryptojungle.co.il/dror-aviely-ethereum-center/) +- [Nir Rozin – Ein Cryptopunk sein](https://www.cryptojungle.co.il/nir-rozin-cryptopunk/) +- [Adan Kedem – Gaming & Metaverse](https://www.cryptojungle.co.il/adan-kedem-web3-gaming/) +- [Uri Kolodny (Starkware) – Ethereum- und Blockchain-Ebenen](https://www.cryptojungle.co.il/uri-kolodny-starkware/) +- [Udi Wertheimer – Ethereum 2.0 vs. Konkurrenz](https://www.cryptojungle.co.il/udi-on-eth2/) +- [Ben Samocha (ich selbst) – Ethereum 2.0 – eine Chance?](https://www.cryptojungle.co.il/etherurm2-week-summary/) +- [Alon Muroch (Bloxstaking) – Was ist Ethereum 2.0?](https://www.cryptojungle.co.il/alon-moroch-eth2/) +- [Eilon Aviv (Collider Ventures) – Was bei Ethereum 2.0 schiefgehen kann](https://www.cryptojungle.co.il/eilon-aviv-eth2-0/) +- [Eilon Aviv (Collider Ventures) – Warum wir Ethereum 2.0 brauchen](https://www.cryptojungle.co.il/eilon-aviv-ethereum-2-0/) ### Italienisch {#it} -- [Ethereum Italia](https://www.ethereum-italia.it/) – Ethereum-Ausbildung, Veranstaltungen und Nachrichten mit Schwerpunkt auf intelligente Verträge und Blockchain-Technologie +- [Ethereum Italia](https://www.ethereum-italia.it/) – Bildungsinhalte, Veranstaltungen und Nachrichten zu Ethereum mit Schwerpunkt auf Smart Contracts und Blockchain-Technologie - [Ethereum Italia Podcast](https://www.ethereum-italia.it/podcast/) – Ethereum-Podcast auf Italienisch -- [Microsoft Learn (Solidity)](https://docs.microsoft.com/it-it/learn/modules/blockchain-learning-solidity/) – Lernen, wie man Solidity verwendet -- [Microsoft Learn (Intelligente Verträge)](https://docs.microsoft.com/it-it/learn/modules/blockchain-solidity-ethereum-smart-contracts/) – Lernen, wie man mit Solidity intelligente Verträge schreibt -- [Microsoft Learn (dApps)](https://docs.microsoft.com/it-it/learn/modules/blockchain-create-ui-decentralized-apps/) - Erstelle eine Benutzeroberfläche mit dezentralen Anwendungen +- [Microsoft Learn (Solidity)](https://docs.microsoft.com/it-it/learn/modules/blockchain-learning-solidity/) – lernen Sie, wie man Solidity verwendet +- [Microsoft Learn (Smart Contracts)](https://docs.microsoft.com/it-it/learn/modules/blockchain-solidity-ethereum-smart-contracts/) – lernen Sie mehr über das Schreiben von Smart Contracts mit Solidity +- [Microsoft Learn (Dapps)](https://docs.microsoft.com/it-it/learn/modules/blockchain-create-ui-decentralized-apps/) – eine Benutzeroberfläche mit dezentralisierten Anwendungen erstellen ### Japanisch {#ja} -- [Japan Virtual and Crypto Assets Exchange Association](https://jvcea.or.jp/) -- [Japan Crypto Asset Business Association](https://cryptocurrency-association.org/) +- [Japan Virtual and Crypto assets Exchange Association](https://jvcea.or.jp/) +- [Japan Cryptoasset Business Association](https://cryptocurrency-association.org/) - [Einstieg in die Blockchain-Entwicklung – Mehr erfahren | Microsoft Docs](https://docs.microsoft.com/ja-jp/learn/paths/ethereum-blockchain-development/) – Dieser Lernpfad führt Sie in die Blockchain und die Entwicklung auf der Ethereum-Plattform ein -- [Ethereum meistern](https://www.oreilly.co.jp/books/9784873118963/) – „Ethereum meistern" auf Japanisch -- [Ethereum meistern](https://www.oreilly.co.jp/books/9784873118963/) – „Ethereum meistern" auf Japanisch +- [Mastering Ethereum](https://www.oreilly.co.jp/books/9784873118963/) – „Mastering Ethereum“ auf Japanisch +- [Hands-On Smart Contract Development with Solidity and Ethereum](https://www.oreilly.co.jp/books/9784873119342/) – „Hands-On Smart Contract Development with Solidity and Ethereum“ auf Japanisch ### Russisch {#ru} - [Cyber Academy](https://cyberacademy.dev) – Bildungsbereich für Web3-Entwickler -- [Forklog](https://forklog.com) – Nachrichten und informative Artikel über Krypto im Allgemeinen, vorhandene Technologien und zukünftige Upgrades verschiedener Blockchains -- [BeInCrypto](https://ru.beincrypto.com) – Nachrichten, Kryptopreisanalyse und nichttechnische Artikel mit einfachen Erklärungen zu allen Aspekten von Krypto +- [Forklog](https://forklog.com) – Nachrichten und Bildungsartikel über Krypto im Allgemeinen, bestehende Technologien und zukünftige Upgrades verschiedener Blockchains +- [BeInCrypto](https://ru.beincrypto.com) – Nachrichten, Krypto-Preisanalyse und nicht-technische Artikel mit einfachen Erklärungen zu allen Aspekten von Krypto ### Spanisch {#es} -- [Ethereum Madrid](https://ethereummadrid.com/) – Blockchain-, DeFi- und Verwaltungskurse, Veranstaltungen und Blog +- [Ethereum Madrid](https://ethereummadrid.com/) – Kurse, Veranstaltungen und Blog zu Blockchain, DeFi und Governance - [Cointelegraph](https://es.cointelegraph.com/ethereum-for-beginners) – Ethereum-Leitfaden für Anfänger auf Spanisch -- [Online-Tutorials](https://tutoriales.online/curso/solidity) – Solidity und Programmieren auf Ethereum lernen -- [Einführungskurs zur Ethereum-Entwicklung](https://youtube.com/playlist?list=PLTqiwJDd_R8y9pfUBjhkVa1IDMwyQz-fU) – Solidity-Grundlagen, Testen und Einsatz Ihres ersten intelligenten Vertrags -- [Einführungskurs in Sicherheit und Hacking bei Ethereum](https://youtube.com/playlist?list=PLTqiwJDd_R8yHOvteko_DmUxUTMHnlfci) – Allgemeine Schwachstellen und Sicherheitsprobleme in echten intelligenten Verträgen verstehen -- [Einführungskurs zur DeFi-Entwicklung](https://youtube.com/playlist?list=PLTqiwJDd_R8zZiP9_jNdaPqA3HqoW2lrS) – Lernen, wie intelligente Verträge von DeFi in Solidity funktionieren und einen eigenen Automated Market Maker erstellen -- [Krypto-Universität](https://www.youtube.com/c/Cryptoversidad) – Nicht-technische Blockchain Bildung vom Anfänger bis zum Fortgeschrittenen. Lernen Sie alles über Krypto und Ethereum. +- [Tutoriales online](https://tutoriales.online/curso/solidity) – lernen Sie Solidity und die Programmierung auf Ethereum +- [Curso Introducción a Ethereum Development](https://youtube.com/playlist?list=PLTqiwJDd_R8y9pfUBjhkVa1IDMwyQz-fU) – Solidity-Grundlagen, Testen und Bereitstellung Ihres ersten Smart Contracts +- [Curso Introducción a Seguridad y Hacking en Ethereum](https://youtube.com/playlist?list=PLTqiwJDd_R8yHOvteko_DmUxUTMHnlfci) – Verständnis für gängige Schwachstellen und Sicherheitsprobleme in echten Smart Contracts +- [Curso Introducción a DeFi Development](https://youtube.com/playlist?list=PLTqiwJDd_R8zZiP9_jNdaPqA3HqoW2lrS) – lernen Sie, wie DeFi Smart Contracts in Solidity funktionieren, und erstellen Sie Ihren eigenen Automated Market Maker +- [Cryptoversidad](https://www.youtube.com/c/Cryptoversidad) – Nicht-technische Blockchain-Bildung für Anfänger bis Fortgeschrittene. Lernen Sie alles über Krypto und Ethereum. ### Türkisch {#tr} -- [BTK-Akademie](https://www.btkakademi.gov.tr/portal/course/blokzincir-ve-kripto-paralar-10569#!/about) – Kurs mit Schwerpunkt auf Blockchain und Kryptowährungen -- [Die große Umbenennung: Was ist mit Eth2 passiert?](https://miningturkiye.org/konu/ethereum-madenciligi-bitiyor-mu-onemli-gelisme.655/) – Türkische Übersetzung des großen Umbenennungs-Blogeintrags, erklärt die Abkehr von der Terminologie „Eth2“ +- [BTK Akademi](https://www.btkakademi.gov.tr/portal/course/blokzincir-ve-kripto-paralar-10569#!/about) – Kurs mit Schwerpunkt auf Blockchain und Kryptowährungen +- [Die große Umbenennung: Was ist mit Eth2 passiert?](https://miningturkiye.org/konu/ethereum-madenciligi-bitiyor-mu-onemli-gelisme.655/) – Türkische Übersetzung des Blogbeitrags „Die große Umbenennung“, in der die Abkehr von der Terminologie „Eth2“ erläutert wird ### Vietnamesisch {#vi} -- [Tino Gruppe](https://wiki.tino.org/ethereum-la-gi/) – Übersicht zu Ethereum, dApps, Wallets und häufig gestellte Fragen -- [Tap Chi Bitcoin](https://tapchibitcoin.io/tap-chi/tin-tuc-ethereum-eth) – Webplattform mit Unterseiten für Ethereum-Nachrichten und -Bildung +- [Tino Group](https://wiki.tino.org/ethereum-la-gi/) – Übersicht über Ethereum, Dapps, Wallets und FAQs +- [Tap Chi Bitcoin](https://tapchibitcoin.io/tap-chi/tin-tuc-ethereum-eth) – Webplattform mit Unterseiten für Ethereum-Nachrichten und Bildungsinhalte - [Coin68](https://coin68.com/ethereum-tieu-diem/) – Kryptowährungsportal mit Ethereum-Nachrichten und Bildungsinhalten diff --git a/public/content/translations/de/community/online/index.md b/public/content/translations/de/community/online/index.md index c68a8a15238..b3b1f158368 100644 --- a/public/content/translations/de/community/online/index.md +++ b/public/content/translations/de/community/online/index.md @@ -1,50 +1,55 @@ --- -title: Online-Gemeinschaften -description: Eine Auflistung der Förderprogramme im gesamten Ethereum-Ökosystem. +title: Online-Communitys +description: Entdecken Sie Online Foren, Chatrooms und Social Media Communitys, in denen sich Ethereum-Enthusiasten zum Diskutieren und Zusammenarbeiten treffen. lang: de --- -# Online-Gemeinschaften {#online-communities} +# Online-Communitys {#online-communities} Hunderttausende von Ethereum-Enthusiasten treffen sich in diesen Online-Foren, um Neuigkeiten auszutauschen, über aktuelle Entwicklungen zu sprechen, technische Fragen zu diskutieren und Bilder der Zukunft zu zeichnen. -## Foren {#forums} - -r/ethereum - Alles über Ethereum -r/ethfinance - Die finanzielle Seite von Ethereum, einschließlich DeFi -r/ethdev - Fokus auf die Entwicklung von Ethereum -r/ethtrader - Trends & Marktanalyse -r/ethstaker - Ein herzliches Willkommen an alle Interessierten, die auf Ethereum setzen möchten -Gemeinschaft der Ethereum-Zauberer - gemeinschaftsorientiert über technische Standards bei Ethereum -Ethereum Stackexchange - Diskussionen und Hilfe für Ethereum-Entwickler -Ethereum-Research - die einflussreichste Nachrichtentafel für kryptoökonomische Forschung - -## Chat-Räume {#chat-rooms} - -Ethereum Cat Herders - Gemeinschaft orientiert am Angebot von Projekt-Management-Unterstützung für Ethereum-Entwickler -Ethereum-Hacker - Von ETHGlobal geführter Discord Chat: Eine Online-Gemeinschaft für Ethereum-Hacker auf der ganzen Welt -CryptoDevs - Auf Ethereum Entwicklung fokussierte Discord-Community -EthStaker Discord – Beratung, Bildung, Unterstützung und Ressourcen für bestehende und potenzielle Staker auf Community-Ebene -Ethereum.org Website-Team - Kommen Sie vorbei and schreiben Sie mit dem Team und anderen aus der Gemeinschaft über Ethereum.org Web-Entwicklung und Design -Matos Discord - Web3-Creator-Community, wo sich Entwickler, industrielle Führer, und Ethereum Enthusiasten aufhalten. Wir sind begeistert von Web3-Entwicklung, Design und Kultur. Kommen Sie mit uns bauen. -Solidity-Gitter - Unterhaltungen über Solidity-Entwicklung (Gitter) -Solidity-Matrix - Unterhaltungen über Solidity-Entwicklung (Matrix) -Ethereum Stack Exchange *– Forum für Fragen und Antworten* -Peeranha *– dezentrales Forum für Fragen und Antworten* - -## YouTube und Twitter {#youtube-and-twitter} - -Ethereum Foundation - Bleiben Sie auf dem Laufenden mit den neuesten Informationen der Ethereum Foundation -@ethereum – offizielles Konto der Ethereum Foundation -@ethdotorg - Das Portal zu Ethereum, für unsere wachsende globale Gemeinschaft geschaffen -Liste von einflussreichen Ethereum Twitter-Accounts +## Richtlinie für die Aufnahme {#listing-policy} + +Um die Integrität und den Wert der gelisteten Communities zu wahren, verfolgt ethereum.org eine strenge Richtlinie zur Feststellung der Berechtigung: + +### Aufnahmekriterien {#eligibility-criteria} + +- **Relevanz**: Die Community muss in direktem Zusammenhang mit Ethereum und seinem Ökosystem stehen. +- **Aktivitätsniveau**: Die Community sollte aktiv sein und regelmäßige Interaktionen, Beiträge oder Diskussionen aufweisen. Ruhende oder inaktive Communities können entfernt werden. +- **Inklusivität**: Die Community sollte ein einladendes Umfeld fördern, das Vielfalt respektiert und die Teilnahme von Menschen jeglicher Herkunft fördert. +- **Nicht-kommerzieller Fokus**: Die Einträge sind für von der Community betriebene Räume und nicht für kommerzielle oder werbliche Plattformen gedacht. + +### Inhaltsrichtlinien {#content-guidelines} + +- **Angemessene Inhalte**: Communitys müssen ihre eigenen Moderationsrichtlinien haben und Spam, Hassreden, Belästigung oder jegliche Inhalte, die illegale Aktivitäten fördern, vermeiden. +- **Sprache**: Obwohl Englisch die Hauptsprache ist, können auch Communitys in anderen Sprachen eingereicht werden, solange sie eine integrative und respektvolle Atmosphäre wahren. +- **Transparenz**: Klare Informationen über den Zweck, die Regeln und die Moderatoren der Community sollten den Mitgliedern zur Verfügung stehen. + +### Weitere Empfehlungen {#other-recommendations} + +- **Barrierefreiheit**: Community-Foren sollten für alle zugänglich sein, ohne dass eine Anmeldung oder Registrierung erforderlich ist. +- **Discord-Server-Einladungen**: Es wird empfohlen, dass nur zuverlässige Discord-Server-Einladungen zu ethereum.org hinzugefügt werden. Idealerweise sollten diese Einladungen auf eine Community-Seite auf der Website verweisen (z. B. [ethglobal.com/discord](https://ethglobal.com/discord)) oder von einer offiziellen URL stammen (z. B. [discord.gg/ethstaker](https://discord.gg/ethstaker) oder [discord.com/invite/ethstaker](https://discord.com/invite/ethstaker)). + +Wenn Sie der Meinung sind, dass eine Community auf Grundlage dieser Richtlinien hinzugefügt oder entfernt werden sollte, [eröffnen Sie bitte ein Issue in unserem GitHub-Repository](https://github.com/ethereum/ethereum-org-website/issues). + +## Foren {#foren} + +r/ethereum - alles rund um Ethereum r/ethfinance - die finanzielle Seite von Ethereum, einschließlich DeFi r/ethdev - konzentriert auf die Ethereum-Entwicklung r/ethtrader - Trends & Marktanalyse r/ethstaker - willkommen für alle, die am Staking auf Ethereum interessiert sind Fellowship of Ethereum Magicians - eine Community, die sich auf technische Standards in Ethereum konzentriert Ethereum Stackexchange - Diskussion und Hilfe für Ethereum-Entwickler Ethereum Research - das einflussreichste Forum für kryptökonomische Forschung + +## Chaträume {#chat-rooms} + +Ethereum Cat Herders - eine Community, die Projektmanagement-Unterstützung für die Ethereum-Entwicklung anbietet Ethereum Hackers - von ETHGlobal betriebener Discord-Chat: eine Online-Community für Ethereum-Hacker aus der ganzen Welt CryptoDevs - auf die Ethereum-Entwicklung ausgerichtete Discord-Community EthStaker Discord - von der Community geführte Anleitung, Bildung, Unterstützung und Ressourcen für bestehende und potenzielle Staker Ethereum.org-Website-Team - schauen Sie vorbei und chatten Sie mit dem Team und Leuten aus der Community über die Webentwicklung und das Design von ethereum.org Matos Discord - Web3-Creator-Community, in der sich Builder, Branchengrößen und Ethereum-Enthusiasten treffen. Wir sind begeistert von Web3-Entwicklung, Design und Kultur. Bauen Sie mit uns. Solidity Gitter - Chat für die Solidity-Entwicklung (Gitter) Solidity Matrix - Chat für die Solidity-Entwicklung (Matrix) Ethereum Stack Exchange - Frage-und-Antwort-Forum Peera Community Forum - dezentralisiertes Frage-und-Antwort-Forum + +## YouTube und X (ehemals Twitter) {#youtube-and-twitter} + +Ethereum Foundation - Bleiben Sie auf dem Laufenden über die neuesten Entwicklungen der Ethereum Foundation @ethereum - Haupt-Ethereum-Account für die Community @ethereumfndn - Offizieller Account der Ethereum Foundation @ethdotorg - Das Portal zu Ethereum, für unsere wachsende globale Community entwickelt
- Erfahren Sie mehr über DAO's + Erfahren Sie mehr über DAOs
diff --git a/public/content/translations/de/community/research/index.md b/public/content/translations/de/community/research/index.md index c897a4e6d22..12672d7863a 100644 --- a/public/content/translations/de/community/research/index.md +++ b/public/content/translations/de/community/research/index.md @@ -57,7 +57,7 @@ Die Ausführungsebene beschäftigt sich damit, Transaktionen auszuführen, die [ - Unterstützung von leichten Clients etablieren - Gas-Limits untersuchen -- Neue Datenstrukturen (z. B. Verkle-Bäume) etablieren +- und die Einbindung neuer Datenstrukturen (z. B. Verkle-Tries). #### Hintergrundlektüre {#background-reading-1} @@ -111,7 +111,7 @@ Es gibt jetzt mehrere Ebene-2-Protokolle, die Ethereum skalieren und dabei versc #### Aktuelle Forschung {#recent-research-2} - [Das Fair-Ordering für Sequencer von Arbitrum](https://eprint.iacr.org/2021/1465) -- [ethresear.ch – Ebene 2](https://ethresear.ch/c/layer-2/32) +- [Ethresear.ch Layer 2](https://ethresear.ch/c/layer-2/32) - [Rollup-zentrierte Roadmap](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) - [L2Beat](https://l2beat.com/) @@ -189,7 +189,7 @@ Ethereum-Wallets können Browsererweiterungen, Desktop- und Handyapps oder Smart - [Einführung in Wallets](/wallets/) - [Einführung in die Sicherheit von Wallets](/security/) -- [ethresear.ch – Sicherheit](https://ethresear.ch/tag/security) +- [Ethresear.ch Sicherheit](https://ethresear.ch/tag/security) - [EIP-2938 Kontoabstraktion](https://eips.ethereum.org/EIPS/eip-2938) - [EIP-4337 Kontoabstraktion](https://eips.ethereum.org/EIPS/eip-4337) @@ -266,7 +266,7 @@ Validatoren nutzen Ethereums natives Asset (Ether) als Sicherheit vor unehrliche ### Liquid Staking und Derivate {#liquid-staking-and-derivatives} -Liquid Staking erlaubt Benutzern mit weniger als 32 ETH Stakingerträge zu erhalten, indem sie Ether für einen Token austauschen, der gestaktes Ether darstellt und in DeFi verwendet werden kann. Jedoch müssen die Anreize und Marktdynamiken, die mit Liquid Staking verbunden sind, noch erkundet werden. Es müssen zudem noch die Effekte, die Liquid Staking auf Ethereums Sicherheit hat (z. B. Zentralisierungsrisiken), gefunden werden. +Liquid Staking erlaubt Benutzern mit weniger als 32 ETH Stakingerträge zu erhalten, indem sie Ether für einen Token austauschen, der gestaktes Ether darstellt und in DeFi verwendet werden kann. Allerdings werden die mit Liquid Staking verbundenen Anreize und Marktdynamiken sowie dessen Auswirkungen auf die Sicherheit von Ethereum (z. B. Zentralisierungsrisiken) noch erforscht. #### Hintergrundlektüre {#background-reading-12} @@ -358,7 +358,7 @@ Die Tools für Ethereum-Entwickler verbessern sich rasant. Dieser Bereich bietet ### Orakel {#oracles} -Orakel importieren Off-Chain-Daten in die Blockchain auf eine genehmigungsfreie und dezentrale Art. Diese Daten auf die Chain zu bekommen, schafft für dApps die Grundlage, auf Phänomene aus der realen Welt zu reagieren. Dazu gehören Preisveränderungen von Assets der echten Welt, Ereignisse in Off-Chain-Apps und sogar Wetterveränderungen. +Orakel importieren Offchain-Daten genehmigungsfrei und dezentral auf die Blockchain. Diese Onchain-Daten ermöglichen es Dapps, auf reale Phänomene wie Preisschwankungen von realen Vermögenswerten, Ereignisse in Offchain-Apps oder sogar Wetteränderungen zu reagieren. #### Hintergrundlektüre {#background-reading-18} @@ -377,11 +377,11 @@ Bei Angriffen auf Ethereum werden meist Schwachstellen von bestimmten Anwendunge - [Bericht zur Wormhole-Sicherheitslücke](https://blog.chainalysis.com/reports/wormhole-hack-february-2022/) - [Liste der Nachbetrachtungen von Ethereum-Vertrags-Hacks](https://forum.openzeppelin.com/t/list-of-ethereum-smart-contracts-post-mortems/1191) -- [Rekt News](https://twitter.com/RektHQ?s=20\&t=3otjYQdM9Bqk8k3n1a1Adg) +- [Rekt News](https://x.com/RektHQ?s=20&t=3otjYQdM9Bqk8k3n1a1Adg) #### Aktuelle Forschung {#recent-research-19} -- [ethresear.ch – Anwendungen](https://ethresear.ch/c/applications/18) +- [Ethresear.ch Anwendungen](https://ethresear.ch/c/applications/18) ### Technologie-Stack {#technology-stack} diff --git a/public/content/translations/de/community/support/index.md b/public/content/translations/de/community/support/index.md index 8582753ee8b..5c959335b8b 100644 --- a/public/content/translations/de/community/support/index.md +++ b/public/content/translations/de/community/support/index.md @@ -10,17 +10,17 @@ lang: de Sind Sie auf der Suche nach dem offiziellen Ethereum-Support? Es ist wichtig, zu wissen, dass Ethereum dezentralisiert ist. Das bedeutet, dass Ethereum keiner zentralen Organisation, Entität oder Person gehört. Daher existieren auch keine offiziellen Supportkanäle. -Es ist wichtig, die dezentrale Gestaltung von Ethereum zu verstehen, denn jeder, der behauptet, offizieller Support für Ethereum zu sein, versucht wahrscheinlich, Sie zu betrügen. Der beste Schutz vor Betrug ist, sich zu informieren und Sicherheit ernst zu nehmen. +Das Verständnis der dezentralen Natur von Ethereum ist von entscheidender Bedeutung, denn **jeder, der behauptet, offizieller Support für Ethereum zu sein, versucht wahrscheinlich, Sie zu betrügen!** Der beste Schutz vor Betrügern ist, sich zu informieren und die Sicherheit ernst zu nehmen. - Ethereum – Sicherheits- und Betrugsvorbeugung + Ethereum-Sicherheit und Betrugsprävention - Mehr erfahren über die Grundlagen von Ethereum + Ethereum-Grundlagen lernen -Trotz des Mangels an offizieller Unterstützung sind viele Gruppen, Communitys und Projekte im gesamten Ethereum-Ökosystem gern bereit, zu helfen, und Sie können auf dieser Seite viele nützliche Informationen und Ressourcen finden. Haben Sie noch Fragen? Treten Sie dem [ethereum.org Discord](https://discord.gg/ethereum-org) bei und wir versuchen, Ihnen weiterzuhelfen. +Trotz des Mangels an offizieller Unterstützung sind viele Gruppen, Communitys und Projekte im gesamten Ethereum-Ökosystem gern bereit, zu helfen, und Sie können auf dieser Seite viele nützliche Informationen und Ressourcen finden. Haben Sie noch Fragen? Treten Sie dem [ethereum.org Discord](https://discord.gg/ethereum-org) bei, und wir werden versuchen, Ihnen zu helfen. ## Häufig gestellte Fragen {#faq} @@ -32,37 +32,37 @@ Eine auf Ethereum gesendete Transaktion ist unumkehrbar. Wenn Sie ETH an die fal Ethereum-Giveaways sind Betrugsmaschen, die darauf abzielen, Ihr ETH zu stehlen. Lassen Sie sich nicht von Angeboten verleiten, die zu schön sind, um wahr zu sein. Wenn Sie ETH an eine Giveaway-Adresse schicken, erhalten Sie kein Giveaway und Sie können Ihr Geld nicht zurückfordern. -[Mehr zum Thema Betrugsprävention](/security/#common-scams) +[Mehr zur Betrugsprävention](/security/#common-scams) -### Meine Transaktion steckt fest {#stuck-transaction} +### Meine Transaktion hängt fest {#stuck-transaction} Transaktionen auf Ethereum können manchmal stecken bleiben, wenn Sie eine niedrigere Transaktionsgebühr eingereicht haben, als aufgrund der Netzwerknachfrage erforderlich ist. Viele Wallets bieten die Möglichkeit, dieselbe Transaktion mit einer höheren Transaktionsgebühr erneut zu übermitteln, damit die Transaktion bearbeitet werden kann. Alternativ können Sie eine ausstehende Transaktion abbrechen. Senden Sie dafür eine Transaktion an Ihre eigene Adresse und verwenden Sie dieselbe Nonce wie für die ausstehende Transaktion. -[So beschleunigen Sie ausstehenden Transaktionen auf MetaMask oder brechen sie ab](https://metamask.zendesk.com/hc/en-us/articles/360015489251-How-to-speed-up-or-cancel-a-pending-transaction) +[Wie man eine ausstehende Transaktion auf MetaMask beschleunigt oder abbricht](https://metamask.zendesk.com/hc/en-us/articles/360015489251-How-to-speed-up-or-cancel-a-pending-transaction) -[So stornieren Sie ausstehende Ethereum-Transaktionen](https://info.etherscan.com/how-to-cancel-ethereum-pending-transactions/) +[Wie man ausstehende Ethereum-Transaktionen abbricht](https://info.etherscan.com/how-to-cancel-ethereum-pending-transactions/) ### Wie kann ich Ethereum minen? {#mining-ethereum} -Ethereum-Mining ist nicht mehr möglich. Das Mining wurde abgeschaltet, als Ethereum von [Proof-of-Work](/glossary/#pow) auf [Proof-of-Stake](/glossary/#pos) umstieg. Anstatt Miner hat Ethereum jetzt Validatoren. Jeder kann ETH [staken](/glossary/#staking) und Staking-Belohnungen für das Ausführen einer Validator-Software zur Sicherung des Netzwerks erhalten. +Ethereum-Mining ist nicht mehr möglich. Das Mining wurde abgeschaltet, als Ethereum von [Proof-of-Work](/glossary/#pow) auf [Proof-of-Stake](/glossary/#pos) umgestellt wurde. Anstatt Miner hat Ethereum jetzt Validatoren. Jeder kann ETH [staken](/glossary/#staking) und Staking-Belohnungen für das Ausführen von Validator-Software zur Sicherung des Netzwerks erhalten. ### Wie werde ich Staker bzw. wie betreibe ich einen Validator? {#how-to-stake} -Um ein Validator zu werden, müssen Sie 32 ETH in den Einlagenvertrag von Ethereum einzahlen und einen Validator-Knoten aufbauen. Weitere Informationen dazu finden Sie auf den [Staking-Seiten](/staking) und [dem Staking-Launchpad](https://launchpad.ethereum.org/). +Um ein Validator zu werden, müssen Sie 32 ETH in den Einlagenvertrag von Ethereum einzahlen und einen Validator-Knoten aufbauen. Weitere Informationen finden Sie auf unseren [Staking-Seiten](/staking) und im [Staking-Launchpad](https://launchpad.ethereum.org/). -## dApps erstellen {#building-support} +## Dapps entwickeln {#building-support} Erstellen kann durchaus schwer sein. Hier finden Sie einige Breiche mit Schwerpunkt auf Entwicklung mit erfahrenen Ethereum-Entwicklern, die Ihnen gerne helfen. - [Alchemy University](https://university.alchemy.com/#starter_code) -- [CryptoDevs-Discord](https://discord.com/invite/5W5tVb3) +- [CryptoDevs Discord](https://discord.com/invite/5W5tVb3) - [Ethereum StackExchange](https://ethereum.stackexchange.com/) - [Web3 University](https://www.web3.university/) - [LearnWeb3](https://discord.com/invite/learnweb3) -In unserem Bereich mit [Ethereum-Entwicklerressourcen](/developers/) finden Sie auch Dokumentationen und Entwicklungsleitfäden. +Sie können auch Dokumentationen und Entwicklungsleitfäden in unserem Bereich [Ethereum-Entwicklerressourcen](/developers/) finden. -### Tools {#dapp-tooling} +### Werkzeuge {#dapp-tooling} Bezieht sich Ihre Frage auf ein bestimmtes Tool, Projekt oder eine Bibliothek? Die meisten Projekte haben Chat-Server oder Foren, die Unterstützung bieten. @@ -75,16 +75,16 @@ Hier sind einige beliebte Beispiele: - [Alchemy](http://alchemy.com/discord) - [Tenderly](https://discord.gg/fBvDJYR) -## Einen Knoten betreiben {#node-support} +## Einen Node betreiben {#node-support} Wenn Sie einen Knoten oder Validator betreiben, finden Sie hier einige Communitys, die Ihnen den Einstieg erleichtern. -- [EthStaker-Discord](https://discord.gg/ethstaker) -- [EthStaker-Reddit](https://www.reddit.com/r/ethstaker) +- [EthStaker Discord](https://discord.gg/ethstaker) +- [EthStaker Reddit](https://www.reddit.com/r/ethstaker) Die meisten Teams, die Ethereum-Clients entwickeln, haben auch eigene, öffentlich zugängliche Bereiche, in denen Sie Unterstützung erhalten und Fragen stellen können. -### Ausführende Clients {#execution-clients} +### Ausführungs-Clients {#execution-clients} - [Geth](https://discord.gg/FqDzupGyYf) - [Nethermind](https://discord.gg/YJx3pm8z5C) @@ -99,5 +99,6 @@ Die meisten Teams, die Ethereum-Clients entwickeln, haben auch eigene, öffentli - [Lighthouse](https://discord.gg/cyAszAh) - [Teku](https://discord.gg/7hPv2T6) - [Lodestar](https://discord.gg/aMxzVcr) +- [Grandine](https://discord.gg/H9XCdUSyZd) -Sie können hier auch [lernen, wie ein Knoten betrieben wird](/developers/docs/nodes-and-clients/run-a-node/). +Sie können auch [hier erfahren, wie Sie einen Node betreiben](/developers/docs/nodes-and-clients/run-a-node/). diff --git a/public/content/translations/de/contributing/adding-desci-projects/index.md b/public/content/translations/de/contributing/adding-desci-projects/index.md index 2d5091c7a30..6f779ad60df 100644 --- a/public/content/translations/de/contributing/adding-desci-projects/index.md +++ b/public/content/translations/de/contributing/adding-desci-projects/index.md @@ -1,6 +1,6 @@ --- title: DeSci-Projekte hinzufügen -description: Richtlinien, die wir beim Hinzufügen von Links zu Projekten auf der DeSci-Seite auf ethereum.org verwenden +description: Unsere Kriterien für das Hinzufügen von Projekt-Links auf der DeSci-Seite von ethereum.org lang: de --- @@ -8,37 +8,37 @@ lang: de Wir möchten sicherstellen, dass wir eine Vielzahl von Projekten zeigen und einen guten Überblick über die DeSci-Landschaft geben. -Es steht jedem frei, ein Projekt vorzuschlagen, das auf der DeSci-Seite auf ethereum.org gelistet werden soll. Ebenso kann jeder, dem ein Projekt auffällt, das nicht mehr relevant ist oder unsere Auswahlkriterien nicht mehr erfüllt, vorschlagen, dass es entfernt wird. +Es steht jedem frei, ein Projekt vorzuschlagen, das auf der DeSci-Seite auf ethereum.org gelistet werden soll. Genauso kannst du, wenn du ein Projekt entdeckst, das nicht mehr relevant ist oder unsere Kriterien nicht mehr erfüllt, jederzeit vorschlagen, es zu entfernen. -## Der Entscheidungsrahmen {#the-decision-framework} +## Das Entscheidungs-Framework {#the-decision-framework} ### Aufnahmekriterien: die Must-haves {#the-must-haves} -- **Open Source Code/data** – Die Transparenz von Code und Daten ist ein zentrales DeSci-Prinzip, daher dürfen DeSci-Projekte grundsätzlich nicht Closed Source sein. Die Codebasis sollte zugänglich und idealerweise offen für PRs sein. -- **DeSci-Projekte sollten nachweislich dezentralisiert sein** – Das könnte bedeuten, dass sie von einer DAO verwaltet werden oder dass sie mit einem dezentralen Tech-Stack einschließlich nicht-pfändbarer Wallets aufgebaut werden. Dabei handelt es sich höchstwahrscheinlich um prüfbare Smart Contracts auf Ethereum. -- **Ehrliche und genaue Angaben**: Es wird erwartet, dass alle vorgeschlagenen Projektangebote ehrliche und genaue Angaben enthalten. Produkte, die falsche Angaben machen, z. B. Ihr Produkt als "Open Source" deklarieren, obwohl es das nicht ist, werden entfernt. -- **Nachweisliches Engagement für die Erweiterung des Zugangs zur Wissenschaft** – Ein DeSci-Projekt sollte in der Lage sein, darzulegen, wie es die Teilnahme an der Wissenschaft auf die breite Öffentlichkeit ausweitet, nicht nur auf Inhaber von Token/NFT. -- **Global zugänglich** – Ihr Projekt hat keine geografischen Einschränkungen oder KYC-Anforderungen, die bestimmte Personen vom Zugang zu Ihrer Dienstleistung ausschließen. -- **Informative Website und Dokumentation** – Es ist wichtig, dass die Besucher der Projektwebsite verstehen können, was das Projekt eigentlich tut, wie es zur Dezentralisierung der wissenschaftlichen Infrastruktur beiträgt und wie sie sich beteiligen können. -- **Das Projekt sollte Teil des Ethereum-Ökosystems sein** – Bei ethereum.org glauben wir, dass Ethereum (und seine Layer 2) die geeignete Basis für die DeSci-Bewegung ist. -- **Das Projekt ist relativ gut etabliert** – Das Projekt hat echte Nutzer, die seit einigen Monaten auf die Dienste des Projekts zugreifen können. +- **Open-Source-Code/-Daten** – Die Offenheit von Code und Daten ist ein Kernprinzip von DeSci, daher dürfen DeSci-Projekte nicht Closed-Source sein. Die Codebasis sollte zugänglich und idealerweise offen für PRs sein. +- **DeSci-Projekte sollten nachweislich dezentralisiert sein** – Dies könnte bedeuten, dass sie von einer DAO verwaltet werden oder mit einem dezentralen Tech-Stack, einschließlich Wallets ohne Fremdverwahrung, aufgebaut werden. Dabei handelt es sich höchstwahrscheinlich um prüfbare Smart Contracts auf Ethereum. +- **Ehrliche und korrekte Listing-Informationen** – Es wird erwartet, dass alle von Projekten vorgeschlagenen Listings ehrliche und korrekte Informationen enthalten. Produkte, die falsche Angaben machen, z. B. Ihr Produkt als "Open Source" deklarieren, obwohl es das nicht ist, werden entfernt. +- **Nachweisliches Engagement für einen breiteren Zugang zur Wissenschaft** – Ein DeSci-Projekt sollte darlegen können, wie es die Teilnahme an der Wissenschaft für die breite Öffentlichkeit und nicht nur für Token-/NFT-Inhaber erweitert. +- **Weltweit zugänglich** – Dein Projekt hat keine geografischen Beschränkungen oder KYC-Anforderungen, die bestimmte Personen vom Zugang zu deinem Dienst ausschließen. +- **Informative Website und Dokumentation** – Es ist wichtig, dass Besucher der Projektwebsite verstehen können, was das Projekt tatsächlich tut, wie es zur Dezentralisierung der wissenschaftlichen Infrastruktur beiträgt und wie man sich beteiligen kann. +- **Das Projekt sollte Teil des Ethereum-Ökosystems sein** – Wir bei ethereum.org glauben, dass Ethereum (und seine Layer-2s) die geeignete Basisschicht für die DeSci-Bewegung sind. +- **Das Projekt ist bereits gut etabliert** – Das Projekt hat echte Nutzer, die seit mehreren Monaten auf die Dienste des Projekts zugreifen können. ### Nice-to-Haves -- **Verfügbar in mehreren Sprachen** – Ihr Projekt wird in mehrere Sprachen übersetzt, so dass Nutzer in aller Welt darauf zugreifen können. -- **Lehrmittel** – Ihr Produkt sollte über ein gut gestaltetes Onboarding-Erlebnis bieten, um den Benutzern zu helfen und sie zu informieren. Alternativ sind Informationen zu Lerninhalten wie Artikel oder Videos hilfreich. -- **Überprüfungen durch Dritte** – Ihr Produkt wurde von einer vertrauenswürdigen dritten Partei professionell auf Schwachstellen geprüft. -- **Kontaktstelle** – Eine Kontaktstelle für das Projekt (z. B. ein Vertreter einer DAO oder einer Gemeinschaft) hilft uns sehr, genaue Informationen zu erhalten, wenn Änderungen vorgenommen werden. Somit bleibt die Aktualisierung von ethereum.org bei der Erfassung künftiger Informationen überschaubar. +- **In mehreren Sprachen verfügbar** – Dein Projekt ist in mehrere Sprachen übersetzt, sodass Nutzer auf der ganzen Welt darauf zugreifen können. +- **Lernressourcen** – Dein Produkt sollte ein gut gestaltetes Onboarding haben, um den Nutzern zu helfen und sie zu schulen. Alternativ sind Informationen zu Lerninhalten wie Artikel oder Videos hilfreich. +- **Audits von Drittanbietern** – Dein Produkt wurde von einem vertrauenswürdigen Drittanbieter professionell auf Schwachstellen geprüft. +- **Ansprechpartner** – Ein Ansprechpartner für das Projekt (dies kann ein Vertreter einer DAO oder einer Community sein) hilft uns sehr dabei, bei Änderungen genaue Informationen zu erhalten. Somit bleibt die Aktualisierung von ethereum.org bei der Erfassung künftiger Informationen überschaubar. ## Wartung {#maintenance} Ethereum befindet sich in der Entwicklung. Daher kommen und gehen Teams und Produkte und Innovationen finden täglich statt, so dass wir unsere Inhalte regelmäßig überprüfen: -- sicherstellen, dass alle aufgelisteten Projekte weiterhin unsere Kriterien erfüllen -- Überprüfen, ob Produkte vorgeschlagen wurden, die unsere Kriterien besser erfüllen als die derzeit aufgeführten +- Sorge dafür, dass alle gelisteten Projekte unsere Anforderungen auch weiterhin erfüllen +- Stelle sicher, dass es keine Produktvorschläge gibt, die mehr Kriterien abdecken als die derzeit aufgeführten Produkte -Ethereum.org wird von der Open-Source-Community gepflegt; wir sind auf die Hilfe der Community angewiesen, um diese Seite auf dem neuesten Stand zu halten. Wenn Sie bemerken, dass Informationen zu den aufgelisteten Projekten aktualisiert werden müssen, öffnen Sie bitte ein Ticket oder einen Pull-Request in unserem Github-Repository. +Ethereum.org wird von der Open-Source-Community gepflegt und wir sind auf die Community angewiesen, um diese Seite aktuell zu halten. Solltest du Informationen über gelistete Projekte bemerken, die aktualisiert werden sollten, reiche bitte ein Issue oder einen Pull Request über unser GitHub-Repository ein. ## Nutzungsbedingungen {#terms-of-use} -Bitte beachten Sie auch unsere[Nutzungsbedingungen](/terms-of-use/). Die Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. +Bitte beachte auch unsere [Nutzungsbedingungen](/terms-of-use/). Die Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. diff --git a/public/content/translations/de/contributing/adding-developer-tools/index.md b/public/content/translations/de/contributing/adding-developer-tools/index.md index d6bee16bace..8e0c0294b67 100644 --- a/public/content/translations/de/contributing/adding-developer-tools/index.md +++ b/public/content/translations/de/contributing/adding-developer-tools/index.md @@ -4,17 +4,17 @@ lang: de description: Unsere Kriterien für die Auflistung von Entwicklertools auf ethereum.org --- -# Entwicklertools hinzufügen {#contributing-to-ethereumorg-} +# Hinzufügen von Entwickler-Tools {#contributing-to-ethereumorg-} Wir möchten sicherstellen, dass wir nur die besten Entwicklerressourcen auflisten, damit andere vertrauensvoll damit arbeiten können und die Unterstützung bekommen, die sie benötigen. Wenn es ein hilfreiches Entwicklungstool gibt, das wir vergessen haben, dann schlagen Sie es gerne an geeigneter Stelle vor. -Derzeit listen wir Entwicklertools in unserem [Entwicklerportal](/developers/). +Wir führen derzeit Entwickler-Tools in unserem [Entwicklerportal](/developers/) auf. **Sie können gerne neue Ergänzungen zu den entsprechenden Seiten vorschlagen.** -## So treffen wir Entscheidungen {#ways-to-contribute} +## Wie wir entscheiden {#ways-to-contribute} Die eingereichten Entwicklertools werden anhand der folgenden Kriterien bewertet: @@ -46,13 +46,13 @@ Viele Projekte im Bereich Ethereum sind Open Source. Wir führen mit höherer Wa --- -## Produktanordnung {#product-ordering} +## Produkt-Reihenfolge {#product-ordering} Sofern die Produkte nicht ausdrücklich anders geordnet sind, z. B. alphabetisch, werden sie in der Reihenfolge der Hinzufügung angezeigt. Die neuesten Produkte erscheinen also am Ende der Liste. --- -## Ihr Entwicklertool hinzufügen {#how-decisions-about-the-site-are-made} +## Fügen Sie Ihr Entwickler-Tool hinzu {#how-decisions-about-the-site-are-made} Wenn Sie ein Entwicklertool zu ethereum.org hinzufügen möchten, das die Kriterien erfüllt, erstellen Sie einen Eintrag auf GitHub. diff --git a/public/content/translations/de/contributing/adding-exchanges/index.md b/public/content/translations/de/contributing/adding-exchanges/index.md index 5d9c9aad1a6..928b3744754 100644 --- a/public/content/translations/de/contributing/adding-exchanges/index.md +++ b/public/content/translations/de/contributing/adding-exchanges/index.md @@ -4,7 +4,7 @@ description: Richtlinien für das Hinzufügen von Handelsplätzen auf ethereum.o lang: de --- -# Ethereum-Handelsplätze hinzufügen {#adding-ethereum-exchanges} +# Hinzufügen von Ethereum-Börsen {#adding-ethereum-exchanges} Jeder kann neue Handelsplätze auf ethereum.org vorschlagen. @@ -16,16 +16,16 @@ Benutzer können auf dieser Seite Handelsplätze auf Grundlage des Wohnorts such Daher sind für den Vorschlag eines Handeslplatzes einige bestimmte Informationen erforderlich. -**HINWEIS:** Wenn Sie einen dezentrale Handelsplatz auflisten möchten, machen Sie sich mit unserer [Richtlinie zum Auflisten von Wallets und Dapps](/contributing/adding-products/) vertraut. +**HINWEIS:** Wenn Sie eine dezentralisierte Börse listen möchten, sehen Sie sich unsere [Richtlinie zum Auflisten von Wallets und Dapps](/contributing/adding-products/) an. -## Folgende Informationen sind erforderlich {#what-we-need} +## Was wir benötigen {#what-we-need} -- Die geografischen Beschränkungen, die für Handelsplätze gelten +- Die geografischen Beschränkungen, die für Handelsplätze gelten. Die mit der Börse verbundenen geografischen Beschränkungen sollten auf einer eigenen Seite oder in einem eigenen Abschnitt der Website der Börse aufgeführt werden. - Die Währungen, mit denen Benutzer ETH kaufen können - Nachweis, dass der Handelsplatz ein rechtmäßiges Handelsunternehmen ist - Alle zusätzlichen Informationen, die Sie haben, wie beispielsweise Informationen über das Unternehmen wie Betriebsjahre, finanzielle Situation usw. -Wir benötigen diese Informationen, damit wir [den Nutzern helfen können, einen passenden Handelsplatz zu finden](/get-eth/#country-picker). +Wir benötigen diese Informationen, damit wir [Benutzern helfen können, eine passende Börse zu finden](/get-eth/#country-picker). Außerdem sind diese Informationen die Grundlage, dass ethereum.org darauf vertrauen kann, dass ein Handelsplatz ein legitimer und sicherer Dienst ist. @@ -36,5 +36,5 @@ Außerdem sind diese Informationen die Grundlage, dass ethereum.org darauf vertr Wenn Sie eine Börse zu ethereum.org hinzufügen möchten, erstellen Sie einen Eintrag auf GitHub. - Ein Thema erstellen + Eintrag erstellen diff --git a/public/content/translations/de/contributing/adding-glossary-terms/index.md b/public/content/translations/de/contributing/adding-glossary-terms/index.md index 96a378257d0..7ca8a6464f8 100644 --- a/public/content/translations/de/contributing/adding-glossary-terms/index.md +++ b/public/content/translations/de/contributing/adding-glossary-terms/index.md @@ -4,9 +4,9 @@ lang: de description: Unsere Kriterien für die Aufnahme neuer Begriffe in das Glossar von ethereum.org --- -# Begriffe zum Glossar hinzufügen {#contributing-to-ethereumorg-} +# Glossarbegriffe hinzufügen {#contributing-to-ethereumorg-} -Dieser Bereich verändert sich jeden Tag. Im Lexikon der Ethereum-Nutzerschaft tauchen fortlaufend neue auf und wir benötigen Ihre Unterstützung, um eine genaue, aktuelle Referenz für alle Themen zu erstellen, die mit Ethereum zu tun haben. Machen Sie sich mit dem aktuellen [Glossar](/glossary/) vertraut und sehen Sie unten, ob Sie mithelfen können. +Dieser Bereich verändert sich jeden Tag. Im Lexikon der Ethereum-Nutzerschaft tauchen fortlaufend neue auf und wir benötigen Ihre Unterstützung, um eine genaue, aktuelle Referenz für alle Themen zu erstellen, die mit Ethereum zu tun haben. Schauen Sie sich das aktuelle [Glossar](/glossary/) an und sehen Sie unten nach, ob Sie helfen möchten! ## Kriterien {#criteria} @@ -17,10 +17,10 @@ Die Bewertungen euer Glossarbegriffe erfolgt anhand der folgenden Kriterien: - Enthält der Begriff/die Definition keine Produktwerbung oder andere verkaufsfördernde Inhalte? - Ist der Begriff/die Definition für Ethereum direkt relevant? - Ist die Definition objektiv, genau und frei von subjektiven Beurteilungen oder Meinungen? -- Ist die Quelle vertrauenswürdig? Werden die Quellen angegeben? +- Ist die Quelle vertrauenswürdig? Werden Quellen angegeben? --- ## Ihren Begriff hinzufügen {#how-decisions-about-the-site-are-made} -Wenn Sie einen Glossarbegriff zu ethereum.org hinzufügen möchten und er die Kriterien erfüllt, [erstellen Sie einen Eintrag auf GitHub](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_glossary_term.yaml). +Wenn Sie einen Glossarbegriff zu ethereum.org hinzufügen möchten und dieser die Kriterien erfüllt, [erstellen Sie ein Issue auf GitHub](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_glossary_term.yaml). diff --git a/public/content/translations/de/contributing/adding-layer-2s/index.md b/public/content/translations/de/contributing/adding-layer-2s/index.md index 8bfbd18d5c3..35afddf5b2f 100644 --- a/public/content/translations/de/contributing/adding-layer-2s/index.md +++ b/public/content/translations/de/contributing/adding-layer-2s/index.md @@ -4,27 +4,27 @@ description: Regeln zum Hinzufügen einer Ebene 2 zu ethereum.org lang: de --- -# Ebene 2s hinzufügen {#adding-layer-2} +# Hinzufügen von Layer 2s {#adding-layer-2} Wir möchten sicherstellen, dass die bestmöglichen Ressourcen vorhanden sind, damit Benutzer sich sicher und informiert in der Ebene 2 bewegen können. -Jeder kann vorschlagen, eine Ebene 2 auf ethereum.org hinzuzufügen. Wenn es eine Layer 2 gibt, die wir vergessen haben, **[schlagen Sie sie gerne vor](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_layer2.yaml).** +Jeder kann vorschlagen, eine Ebene 2 auf ethereum.org hinzuzufügen. Wenn es ein Layer 2 gibt, das wir übersehen haben, **[schlagen Sie es bitte vor](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_layer2.yaml)!** Wir listen derzeit L2s auf den folgenden Seiten auf: -- [Optimistische Rollups](/developers/docs/scaling/optimistic-rollups/) -- [Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups/) -- [Ebene 2](/layer-2/) +- [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/) +- [Zero-Knowledge-Rollups](/developers/docs/scaling/zk-rollups/) +- [Layer 2](/layer-2/) Ebene 2 ist ein relativ neues Thema für Ethereum und bietet eine spannende Entwicklung. Wir haben versucht, ein gerechtes Framework für Überlegungen auf ethereum.org zu schaffen. Allerdings werden sich die Kriterien für die Auflistung im Laufe der Zeit verändern und weiterentwickeln. ## Der Entscheidungsrahmen {#decision-framework} -### Aufnahmekriterien: die Must-haves {#criteria-for-inclusion-the-must-haves} +### Aufnahmekriterien: Die Must-haves {#criteria-for-inclusion-the-must-haves} **Auflistung auf L2BEAT** -- Damit ein Projekt berücksichtigt werden kann, muss es auf [L2BEAT](https://l2beat.com) aufgelistet sein. L2BEAT bietet eine solide Risikobewertung von Ebene-2-Projekten, die wir für die Beurteilung von L2-Projekten nutzen. **Wird ein Projekt nicht auf L2BEAT vorgestellt, erfolgt keine Auflistung als L2 auf ethereum.org.** +- Um berücksichtigt zu werden, muss dieses Projekt auf [L2BEAT](https://l2beat.com) gelistet sein. L2BEAT bietet eine solide Risikobewertung von Ebene-2-Projekten, die wir für die Beurteilung von L2-Projekten nutzen. **Wird ein Projekt nicht auf L2BEAT vorgestellt, erfolgt keine Auflistung als L2 auf ethereum.org.** - [Erfahren Sie, wie Sie Ihr L2-Projekt zu L2BEAT hinzufügen](https://github.com/l2beat/l2beat/blob/master/CONTRIBUTING.md). **Open Source** @@ -38,13 +38,13 @@ Derzeit berücksichtigen wir Folgendes für Ebene-2-Lösungen: - Optimistische Rollups - Zero-Knowledge Rollup -_Wir betrachten andere Skalierungslösungen, die nicht Ethereum für Datenverfügbarkeit oder -sicherheit nutzen, nicht als Ebene 2._ +_Wir betrachten andere Skalierungslösungen, die Ethereum nicht für die Datenverfügbarkeit oder Sicherheit nutzen, nicht als Layer 2._ **Ethereum für Datenverfügbarkeit** -- Datenverfügbarkeit ist ein wichtiger Differenzierungsfaktor zwischen anderen Skalierungslösungen und Ebene 2. Ein Projekt **muss** das Ethereum Mainnet für Datenverfügbarkeit nutzen, um für ein Listing berücksichtigt zu werden. +- Datenverfügbarkeit ist ein wichtiger Differenzierungsfaktor zwischen anderen Skalierungslösungen und Ebene 2. Ein Projekt **muss** das Ethereum Mainnet für die Datenverfügbarkeit nutzen, um für eine Listung in Betracht gezogen zu werden. -**Bridges** +**Kettenübergreifende Brücken** - Wie können Benutzer auf Ebene 2 einsteigen? @@ -70,7 +70,7 @@ _Wir betrachten andere Skalierungslösungen, die nicht Ethereum für Datenverfü - Für aufgelistete Projekte ist ein funktionierender Block Explorer erforderlich, um Benutzern die Navigation in der Chain zu erleichtern. -### Weitere Kriterien: optionale Aspekte {#nice-to-haves} +### Weitere Kriterien: die optionalen Aspekte {#nice-to-haves} **Unterstützung des Projekts durch einen Handelsplatz** @@ -88,7 +88,7 @@ _Wir betrachten andere Skalierungslösungen, die nicht Ethereum für Datenverfü - Gibt es Wallets, die eine native Unterstützung für L2 bieten? -## Eigene Ebene 2 hinzufügen {#add-exchange} +## Fügen Sie Ihr Layer 2 hinzu {#add-exchange} Wenn Sie eine Ebene 2 zu ethereum.org hinzufügen möchten, erstellen Sie einen Eintrag auf GitHub. diff --git a/public/content/translations/de/contributing/adding-products/index.md b/public/content/translations/de/contributing/adding-products/index.md index 42ed5e47c5f..8626dc97ecf 100644 --- a/public/content/translations/de/contributing/adding-products/index.md +++ b/public/content/translations/de/contributing/adding-products/index.md @@ -4,7 +4,7 @@ description: Die Richtlinie, die wir beim Hinzufügen von dApps zu ethereum.org lang: de --- -# Ethereum-Produkte hinzufügen {#adding-products} +# Hinzufügen von Ethereum-Produkten {#adding-products} Jedem steht es frei, neue dApps für den Inhalt von ethereum.org vorzuschlagen, insofern das angemessen ist. **Nein, wir werden Ihre dApp nicht auf unserer Homepage auflisten** 😜 @@ -15,43 +15,43 @@ dApps sind derzeit hier aufgelistet: **Bitte schlagen Sie nur neue Ergänzungen auf diesen Seiten vor.** -Obwohl wir neue Ergänzungen begrüßen, haben wir die aktuellen Apps auf der Grundlage der Erfahrung ausgewählt, die wir für unsere Nutzer schaffen wollen. Diese beruhen auf einigen unserer Designprinzipien: +Obwohl wir neue Ergänzungen begrüßen, haben wir die aktuellen Apps auf der Grundlage der Erfahrung ausgewählt, die wir für unsere Nutzer schaffen wollen. Grundlage dafür bilden einige unserer Designprinzipien: -- _Inspirierend_: Alles, was auf ethereum.org zu finden ist, sollte den Nutzern etwas Neues bieten. -- _Eine gute Geschichte_: Das, was aufgelistet ist, sollte einen "Aha"-Moment auslösen. -- _Glaubwürdig_: Alle aufgeführten Inhalte sollten legitime Unternehmen/Projekte sein, um das Risiko für die Nutzer zu minimieren. +- _Inspirierend_: Alles auf ethereum.org sollte den Nutzern etwas Neues bieten +- _Eine gute Geschichte_: Was aufgelistet ist, sollte einen "Aha"-Moment auslösen +- _Glaubwürdig_: Alles sollten legitime Unternehmen/Projekte sein, um das Risiko für Nutzer zu minimieren -Insgesamt will **ethereum.org ein "nahtloses Einführungserlebnis" für neue Nutzer/innen bieten**. Aus diesem Grund werden folgende Kriterien für das Hinzufügen von dApps berücksichtigt: +Insgesamt **möchte ethereum.org neuen Nutzern ein "nahtloses Onboarding-Erlebnis" bieten**. Aus diesem Grund werden folgende Kriterien für das Hinzufügen von dApps berücksichtigt: - Anwenderfreundlichkeit - Interoperabilität mit anderen Produkten - Sicherheit - Langlebigkeit -Hier ist unser Entscheidungsrahmen im Detail. Sie können uns gerne Feedback geben oder Änderungen vorschlagen. +Im Folgenden wird der Entscheidungsrahmen ausführlich dargestellt. Sie können uns gerne Feedback geben oder Änderungen vorschlagen. ## Der Entscheidungsrahmen {#decision-framework} -### Aufnahmekriterien: die Must-haves {#criteria-for-inclusion-the-must-haves} +### Aufnahmekriterien: Die Must-haves {#criteria-for-inclusion-the-must-haves} -- **Ein sicherheitsgeprüftes Produkt**: Ob durch ein Audit, ein internes Sicherheitsteam oder eine andere Methode, die Sicherheit Ihres Produktes muss zuverlässig getestet werden. So lässt sich das Risiko für unsere Nutzerinnen und Nutzer verringern. Zudem ist das ein Zeichen für die Ernsthaftigkeit eines Produkts. -- **Ein Produkt, das seit mehr als 6 Monaten "live" ist**: Das ist ein weiterer Hinweis auf Sicherheit. 6 Monate sind ein guter Zeitraum, um kritische Bugs und Exploits zu finden. -- **Bearbeitung durch ein aktives Team**: Das trägt dazu bei, die Qualität zu gewährleisten und sicherzustellen, dass Benutzer bei Fragen Unterstützung erhalten. -- **Ehrliche und genaue Angaben**: Es wird erwartet, dass alle vorgeschlagenen Projektangebote ehrliche und genaue Angaben enthalten. Produkte mit falschen Informationen, wie zum Beispiel die Angabe, dass es sich um ein "Open-Source-Produkt" handelt, obwohl dies nicht der Fall ist, werden entfernt. +- **Ein sicherheitsgeprüftes Produkt** – ob durch ein Audit, ein internes Sicherheitsteam oder eine andere Methode, die Sicherheit Ihres Produkts muss zuverlässig getestet werden. So lässt sich das Risiko für unsere Nutzerinnen und Nutzer verringern. Zudem ist das ein Zeichen dafür, dass Sie Sicherheit ernst nehmen. +- **Ein Produkt, das seit über 6 Monaten "live" ist** – dies ist ein weiterer Hinweis auf die Sicherheit. 6 Monate sind ein guter Zeitraum, um kritische Bugs und Exploits zu finden. +- **Von einem aktiven Team betreut** – dies trägt dazu bei, die Qualität zu sichern und dass Nutzer bei ihren Anfragen Unterstützung erhalten. +- **Ehrliche und genaue Eintragsinformationen** – es wird erwartet, dass alle vorgeschlagenen Einträge von Projekten mit ehrlichen und genauen Informationen versehen sind. Produkte mit falschen Informationen, wie zum Beispiel die Angabe, dass es sich um ein "Open-Source-Produkt" handelt, obwohl dies nicht der Fall ist, werden entfernt. -### Kriterien für die Rangfolge: optionale Aspekte {#criteria-for-ranking-the-nice-to-haves} +### Ranking-Kriterien: Die Nice-to-haves {#criteria-for-ranking-the-nice-to-haves} Auf Grundlage folgender Kriterien wird bestimmt, wie die Listung von dApps auf ethereum.org erfolgt. -**dApps** +**Dapps** -- **Der Zugriff ist über die meisten gelisteten Wallets möglich**: dApps sollten mit den meisten Wallets funktionieren, die auf ethereum.org gelistet sind. -- **Benutzer können es selbst ausprobieren**: Ein einzelner Benutzer sollte Ihre dApp benutzen und ein reales Ergebnis damit realisieren können. -- **Onboarding**: Ihr Produkt sollte eine gut gestaltete Onboarding-Erfahrung bieten, um den Benutzern zu helfen und sie zu informieren. Alternativ sind Informationen zu Lerninhalten wie Artikel oder Videos hilfreich. -- **Keine Verwahrung**: Nutzer kontrollieren ihr Geld. Wenn Ihr Produkt verschwindet, können die Nutzer weiterhin auf ihr Guthaben zugreifen und es bewegen. -- **Global zugänglich**: Ihr Produkt ist nicht mit geografischen Einschränkungen oder KYC-Anforderungen verbunden, die bestimmte Personen vom Zugang zu Ihrer Dienstleistung ausschließen. -- **Open Source**: Ihr Code sollte zugänglich sein und Sie sollten PRs von der breiten Gemeinschaft akzeptieren. -- **Community**: Sie haben eine eigene Community, vielleicht ein Discord, in der Benutzer mit Ihrem Team interagieren können, wenn sie Hilfe benötigen oder neue Funktionen vorschlagen möchten. +- **Sie können über die meisten der gelisteten Wallets darauf zugreifen** – Dapps sollten mit der Mehrheit der auf ethereum.org gelisteten Wallets funktionieren. +- **Nutzer können sie selbst ausprobieren –** ein einzelner Nutzer sollte in der Lage sein, Ihre Dapp zu verwenden und etwas Greifbares zu erreichen. +- **Onboarding** – Ihr Produkt sollte über einen gut gestalteten Onboarding-Prozess verfügen, um Nutzern zu helfen und sie zu informieren. Alternativ sind Informationen zu Lerninhalten wie Artikel oder Videos hilfreich. +- **Nicht-verwahrend** – Nutzer kontrollieren ihre eigenen Mittel. Wenn Ihr Produkt verschwindet, können die Nutzer weiterhin auf ihr Guthaben zugreifen und es bewegen. +- **Weltweit zugänglich** – Ihr Produkt hat keine geografischen Einschränkungen oder KYC-Anforderungen, die bestimmte Personen vom Zugang zu Ihrem Dienst ausschließen. +- **Open-Source** – Ihr Code sollte zugänglich sein und Sie sollten PRs aus der breiteren Community akzeptieren. +- **Community** – Sie haben eine engagierte Community, vielleicht auf Discord, wo Nutzer mit Ihrem Team interagieren können, um Hilfe zu erhalten oder neue Funktionen vorzuschlagen. ## Kriterien in der Praxis {#criteria-in-practice} @@ -68,24 +68,24 @@ Weitere Aspekte, die bei der Entscheidung eine Rolle spielen: Das ist eine Designentscheidung, für die ethereum.org verantwortlich ist. -Aber seien Sie versichert, **dass es Links zu anderen Websites geben wird, die mehr dApps bewerten** +Aber seien Sie versichert, **dass es Links zu anderen Websites geben wird, die weitere Dapps bewerten** -### Produktanordnung {#product-ordering} +### Produkt-Reihenfolge {#product-ordering} Sofern die Produkte nicht ausdrücklich anders geordnet sind, z. B. alphabetisch, werden sie in der Reihenfolge der Hinzufügung angezeigt, von neu zu alt. Die neuesten Produkte erscheinen also am Ende der Liste. ### Nutzungsbedingungen {#terms-of-use} -Beachten Sie auch unsere [Nutzungsbedingungen](/terms-of-use/). Die Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. +Bitte beachten Sie auch unsere [Nutzungsbedingungen](/terms-of-use/). Die Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. ## Wartung {#maintenance} Ethereum befindet sich in der Entwicklung. Daher kommen und gehen Teams und Produkte und Innovationen finden täglich statt, so dass wir unsere Inhalte regelmäßig überprüfen: -- sicherstellen, dass alle gelisteten dApps weiterhin unsere Kriterien erfüllen +- Sicherstellen, dass alle aufgelisteten Dapps weiterhin unsere Kriterien erfüllen - Überprüfen, ob Produkte vorgeschlagen wurden, die unsere Kriterien besser erfüllen als die derzeit aufgeführten -Sie können uns dabei helfen, indem Sie das hier überprüfen und uns Bescheid geben. [Erstellen Sie ein Ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) oder senden Sie eine E-Mail an [website@ethereum.org](mailto:website@ethereum.org) +Sie können uns dabei helfen, indem Sie das hier überprüfen und uns Bescheid geben. [Ein Issue erstellen](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) oder eine E-Mail an [website@ethereum.org](mailto:website@ethereum.org) senden _Wir untersuchen auch Optionen für Abstimmungen, damit die Community ihre Präferenzen angeben und die besten Produkte hervorheben kann, die wir dann empfehlen können._ @@ -93,8 +93,8 @@ _Wir untersuchen auch Optionen für Abstimmungen, damit die Community ihre Präf ## Ihr Produkt hinzufügen {#add-your-product} -Wenn Sie eine dApp zu ethereum.org hinzufügen möchten und sie die Kriterien erfüllt, erstellen Sie einen Eintrag auf GitHub. +Wenn Sie eine Dapp zu ethereum.org hinzufügen möchten und sie die Kriterien erfüllt, lassen Sie es uns bitte wissen. - Eintrag erstellen + Dapp vorschlagen diff --git a/public/content/translations/de/contributing/adding-resources/index.md b/public/content/translations/de/contributing/adding-resources/index.md new file mode 100644 index 00000000000..113ed3e70a2 --- /dev/null +++ b/public/content/translations/de/contributing/adding-resources/index.md @@ -0,0 +1,53 @@ +--- +title: Hinzufügen von Ressourcen +description: Die Richtlinie, die wir beim Hinzufügen von Ressourcen zu ethereum.org anwenden +lang: de +--- + +# Hinzufügen von Ressourcen {#adding-resources} + +Wir möchten sicherstellen, dass wir die bestmöglichen Ressourcen auflisten und gleichzeitig die Sicherheit und das Vertrauen der Nutzer gewährleisten. + +Jeder kann gerne neue Ressourcen zum Hinzufügen zum Ressourcen-Dashboard auf ethereum.org vorschlagen, das derzeit unter [ethereum.org/resources](/resources/) zu finden ist. + +Obwohl wir neue Ergänzungen begrüßen, wurden die aktuellen Ressourcen auf der Grundlage einer Erfahrung ausgewählt, die wir für unsere Benutzer schaffen möchten. Grundlage dafür bilden einige unserer Designprinzipien: + +- _Inspirierend_: Alles auf ethereum.org sollte den Nutzern etwas Neues bieten +- _Eine gute Geschichte_: Was aufgelistet ist, sollte einen "Aha"-Moment auslösen +- _Glaubwürdig_: Alles sollten legitime Unternehmen/Projekte sein, um das Risiko für Nutzer zu minimieren + +Insgesamt **hat ethereum.org das Ziel, neuen Benutzern ein nahtloses Onboarding-Erlebnis zu bieten**. Aus diesem Grund fügen wir Ressourcen anhand folgender Kriterien hinzu: + +- Anwenderfreundlichkeit +- Genauigkeit +- wartung + +## Der Entscheidungsrahmen {#decision-framework} + +### Kriterien {#criteria} + +- **Ehrliche und genaue Listing-Informationen** – Alle vorgeschlagenen Listings müssen ehrliche und genaue Informationen enthalten. Produkte, die Informationen fälschen, werden entfernt. +- **Aktives Projekt** – Die Ressource sollte von einem aktiven Team gepflegt werden, um Qualität und Support für die Benutzer zu gewährleisten. Veraltete Ressourcen können entfernt werden. + +### Produkt-Reihenfolge {#product-ordering} + +Wir behalten uns das Recht vor, Produkte nach ihrer Wirkung zu ordnen. Neue Produkte werden im Allgemeinen am Ende der Liste hinzugefügt, sofern nicht anders angegeben. + +## Wartung {#maintenance} + +Da sich das Ethereum-Ökosystem weiterentwickelt, werden wir unsere Inhalte regelmäßig überprüfen, um: + +- Sicherzustellen, dass alle aufgelisteten Ressourcen weiterhin unsere Kriterien erfüllen +- Stelle sicher, dass es keine Produktvorschläge gibt, die mehr Kriterien abdecken als die derzeit aufgeführten Produkte + +Sie können uns dabei helfen, indem Sie das hier überprüfen und uns Bescheid geben. [Erstellen Sie ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?template=bug_report.yaml) oder senden Sie eine E-Mail an [website@ethereum.org](mailto:website@ethereum.org). + +--- + +## Fügen Sie Ihre Ressource hinzu {#add-your-resource} + +Wenn Sie eine Ressource zu ethereum.org hinzufügen möchten und diese die Kriterien erfüllt, erstellen Sie ein Issue auf GitHub. + + + Eintrag erstellen + diff --git a/public/content/translations/de/contributing/adding-staking-products/index.md b/public/content/translations/de/contributing/adding-staking-products/index.md index 98cc62a2b1c..c98487eeb69 100644 --- a/public/content/translations/de/contributing/adding-staking-products/index.md +++ b/public/content/translations/de/contributing/adding-staking-products/index.md @@ -4,21 +4,21 @@ description: Richtlinien, die wir beim Hinzufügen von Staking-Produkten oder -D lang: de --- -# Staking-Produkte oder -Services hinzufügen {#adding-staking-products-or-services} +# Staking-Produkte oder -Dienstleistungen hinzufügen {#adding-staking-products-or-services} Wir möchten sicherstellen, dass wir die bestmöglichen Ressourcen auflisten und gleichzeitig die Sicherheit und das Vertrauen der Nutzer gewährleisten. -Jeder kann ein Staking-Produkt oder einen Service zur Hinzufügung auf ethereum.org vorschlagen. Wenn wir ein Produkt übersehen haben, **[dann schlagen Sie es bitte vor](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_staking_product.yaml).** +Jeder kann ein Staking-Produkt oder einen Service zur Hinzufügung auf ethereum.org vorschlagen. Sollten wir eines übersehen haben, **[schlagen Sie es bitte vor](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_staking_product.yaml)!** Auf den folgenden Seiten finden Sie eine Liste der Staking-Produkte und Services, die wir derzeit anbieten: - [Solo-Staking](/staking/solo/) - [Staking als Dienstleistung](/staking/saas/) -- [Staking-Pool](/staking/pools/) +- [Staking-Pools](/staking/pools/) Der Proof-of-Stake wurde am 1. Dezember 2020 auf der Beacon Chain eingeführt. Das Staking ist ein noch relativ neues Verfahren. Dennoch haben wir versucht, einen fairen und transparenten Rahmen für die Berücksichtigung auf ethereum.org zu schaffen. Die Kriterien für die Auflistung werden sich jedoch im Laufe der Zeit ändern und weiterentwickeln und liegen letztendlich im Ermessen des ethereum.org-Website-Teams. -## Der Entscheidungsrahmen {#the-decision-framework} +## Das Entscheidungs-Framework {#the-decision-framework} Die Entscheidung, ein Produkt auf ethereum.org zu listen, ist von mehrern Faktoren abhängig. Mehrer Kriterien werden bei der Entscheidung über die Aufnahme eines Produkts oder einer Dienstleistung gemeinsam berücksichtigt. Je mehr dieser Kriterien erfüllt sind, umso wahrscheinlicher ist eine Aufnahme in die Liste. @@ -31,7 +31,7 @@ Die Entscheidung, ein Produkt auf ethereum.org zu listen, ist von mehrern Faktor Derzeit sind nur Produkte oder Dienstleistungen in diesen Kategorien aufgeführt. -### Aufnahmekriterien {#criteria-for-inclusion} +### Kriterien für die Aufnahme {#criteria-for-inclusion} Die eingereichten Staking-Produkte oder Services werden anhand von folgenden Kriterien bewertet: @@ -57,7 +57,7 @@ Die eingereichten Staking-Produkte oder Services werden anhand von folgenden Kri **Welche Plattformen werden unterstützt?** -- z. B. Linux, macOS, Windows, iOS, Android +- d. h. Linux, macOS, Windows, iOS, Android #### Software und Smart Contracts {#software-and-smart-contracts} @@ -68,7 +68,7 @@ Für jegliche benutzerdefinierte Software oder Smart Contracts: - Open-Source-Projekte sollten über ein öffentlich zugängliches Quellcode-Repository verfügen. - Das wird verwendet, um die "Open-Source"-Bewertung des Produkts zu bestimmen. -**Ist die _Beta-Entwicklung_ für das Produkt abgeschlossen?** +**Ist die Beta-Entwicklung für das Produkt abgeschlossen?** - Wo befindet sich das Produkt in seinem Entwicklungszyklus? - Produkte in der Betaphase werden nicht für die Aufnahme auf ethereum.org berücksichtigt. @@ -83,22 +83,22 @@ Für jegliche benutzerdefinierte Software oder Smart Contracts: - Wenn nicht, ist die Zahlung einer Prämie für entdeckte Sicherheitslücken geplant? - Das wird verwendet, um die "Bug Bounty"-Punktzahl des Produkts zu ermitteln. -#### Node- oder Client-Tool {#node-or-client-tooling} +#### Node- oder Client-Tooling {#node-or-client-tooling} Für Softwareprodukte im Zusammenhang mit der Einrichtung, Verwaltung oder Migration von Nodes oder Clients: -**Welche Clients auf Konsensebene (d. h. Lighthouse, Teku, Nimbus, Prysm) werden unterstützt?** +**Welche Konsensebenen-Clients (d. h. Lighthouse, Teku, Nimbus, Prysm, Grandine) werden unterstützt?** - Welche Clients werden unterstützt? Kann der Nutzer wählen? - Das wird zur Ermittlung der "Multi-Client"-Bewertung des Produkts verwendet. -#### Staking als Service {#staking-as-a-service} +#### Staking als Dienstleistung {#staking-as-a-service} -Für [Staking-as-a-Service-Listings](/staking/saas/) (d. h. delegierter Node-Betrieb): +Für [Staking-as-a-Service-Einträge](/staking/saas/) (d. h. delegierter Node-Betrieb): **Wie hoch sind die Gebühren für die Nutzung des Services?** -- Wie ist die Gebührenstruktur, gibt es z. B. eine monatliche Gebühr für den Service? +- Wie ist die Gebührenstruktur, z. B. gibt es eine monatliche Gebühr für die Dienstleistung? - Gibt es zusätzliche Staking-Anforderungen? **Müssen sich die Nutzer für ein Konto registrieren?** @@ -119,7 +119,7 @@ Für [Staking-as-a-Service-Listings](/staking/saas/) (d. h. delegierter Node-Bet #### Staking-Pool {#staking-pool} -Für [Staking-Services im Pool](/Staking/pools/): +Für [Dienste für gebündeltes Staking](/staking/pools/): **Wie hoch ist die Mindest-ETH, die für einen Einsatz erforderlich ist?** @@ -147,11 +147,11 @@ Für [Staking-Services im Pool](/Staking/pools/): - Seit der letzten Bearbeitung wird vowiegend Prysm als Konsensebenen-Client von den Knotenbetreibern verwendet. Das ist gefährlich für Netzwerk. Wenn ein CL-Client derzeit von mehr als 33 % des Netzes genutzt wird, fordern wir Daten zur Nutzung an. - Auf dieser Grundlage wird für das Produkt der Aspekt "Diverse Clients" bewertet. -### Weitere Kriterien: optionale Aspekte {#other-criteria} +### Weitere Kriterien: die optionalen Aspekte {#other-criteria} **Welche Benutzeroberflächen werden unterstützt?** -- z. B. Browser-Anwendung, Desktop-Anwendung, mobile Anwendung, CLI +- d. h. Browser-App, Desktop-App, mobile App, CLI **Bietet die Software für das Knoten-Tooling eine einfache Möglichkeit, zwischen den Clients zu wechseln?** @@ -161,13 +161,13 @@ Für [Staking-Services im Pool](/Staking/pools/): - Das gibt uns einen Eindruck von der bisherigen Reichweite Ihres Services. -## So erfolgt die Anzeige von Ergebnissen {#product-ordering} +## Wie wir Ergebnisse anzeigen {#product-ordering} -Die [Kriterien für die Aufnahme](#criteria-for-inclusion) werden verwendet, um eine kumulative Punktzahl für jedes Produkt oder jeden Service zu berechnen. Das dient dazu, Produkte, die bestimmte objektive Kriterien erfüllen, zu sortieren und zu präsentieren. Je mehr Kriterien belegt werden, desto höher fällt die Bewertung eines Produkts aus. Gleichstände werden dabei nach dem Zufallsprinzip gewertet. +Die oben genannten [Kriterien für die Aufnahme](#criteria-for-inclusion) werden verwendet, um eine kumulative Punktzahl für jedes Produkt oder jede Dienstleistung zu berechnen. Das dient dazu, Produkte, die bestimmte objektive Kriterien erfüllen, zu sortieren und zu präsentieren. Je mehr Kriterien belegt werden, desto höher fällt die Bewertung eines Produkts aus. Gleichstände werden dabei nach dem Zufallsprinzip gewertet. Die Codelogik und die Gewichtungen für diese Kriterien sind derzeit in [dieser JavaScript-Komponente](https://github.com/ethereum/ethereum-org-website/blob/dev/src/components/Staking/StakingProductsCardGrid.js#L350) in unserem Repo enthalten. -## Ihr Produkt oder Ihren Service hinzufügen {#add-product} +## Ihr Produkt oder Ihre Dienstleistung hinzufügen {#add-product} Wenn Sie ein Staking-Produkt oder einen Staking-Service zu ethereum.org hinzufügen möchten, erstellen Sie einen Eintrag auf GitHub. diff --git a/public/content/translations/de/contributing/adding-wallets/index.md b/public/content/translations/de/contributing/adding-wallets/index.md index 3562146eab2..4d3cf2abe3b 100644 --- a/public/content/translations/de/contributing/adding-wallets/index.md +++ b/public/content/translations/de/contributing/adding-wallets/index.md @@ -10,66 +10,71 @@ Wir wollen sicherstellen, dass wir eine Vielzahl von Wallets zeigen, die die fun Jeder kann einen Vorschlag zum Hinzufügen einer Wallet auf ethereum.org machen. Sollten wir eine Wallet übersehen haben, schlagen Sie sie bitte vor! -Jeder kann eine neue Wallet vorschlagen. Wallets sind derzeit hier aufgelistet: +Wallets sind derzeit hier aufgelistet: - [ethereum.org/wallets/find-wallet/](/wallets/find-wallet/) -- [ethereum.org/wallets/](/wallets/) Wallets verändern sich auf Ethereum rasch. Wir haben versucht, ein gerechtes Framework für Überlegungen auf ethereum.org zu schaffen. Allerdings werden sich die Kriterien für die Auflistung im Laufe der Zeit verändern und weiterentwickeln. -## Der Entscheidungsrahmen {#the-decision-framework} +## Das Entscheidungs-Framework {#the-decision-framework} ### Aufnahmekriterien: die Must-haves {#the-must-haves} -- **Ein sicherheitsgeprüftes Produkt** – ob durch ein Audit, ein internes Sicherheitsteam, einen offenen Source-Code oder eine andere Methode, die Sicherheit Ihrer Wallet muss zuverlässig sein. So lässt sich das Risiko für unsere Nutzerinnen und Nutzer verringern. Zudem ist das ein Zeichen für die Ernsthaftigkeit eines Produkts. -- **Eine Wallet, die seit mehr als sechs Monaten "live" ist ODER von einer Gruppe mit einer seriösen Erfolgsbilanz herausgegeben wurde** – das ist ein weiterer Hinweis auf Sicherheit. Sechs Monate sind ein guter Zeitraum, in dem kritische Fehler und Sicherheitslücken gefunden werden könnten. Wir bitten um sechs Monate, um Forks herauszufiltern, die schnell als Projekte aufgegeben werden. -- **Bearbeitung durch ein aktives Team** – das trägt dazu bei, die Qualität zu gewährleisten und sicherzustellen, dass ein Nutzer Unterstützung für seine Fragen erhält. -- **Ehrliche und genaue Angaben**: Es wird erwartet, dass alle vorgeschlagenen Projektangebote ehrliche und genaue Angaben enthalten. Produkte, die falsche Angaben machen, z. B. Ihr Produkt als "Open Source" deklarieren, obwohl es das nicht ist, werden entfernt. +- **Ein sicherheitsgeprüftes Produkt** – ob durch ein Audit, ein internes Sicherheitsteam, Open-Source-Code oder eine andere Methode, die Sicherheit Ihrer Wallet muss zuverlässig sein. So lässt sich das Risiko für unsere Nutzerinnen und Nutzer verringern. Zudem ist das ein Zeichen dafür, dass Sie Sicherheit ernst nehmen. +- **Eine Wallet, die seit mehr als sechs Monaten „live“ ist ODER von einer Gruppe mit einer seriösen Erfolgsbilanz herausgegeben wurde** – das ist ein weiterer Hinweis auf Sicherheit. Sechs Monate sind ein guter Zeitraum, in dem kritische Fehler und Sicherheitslücken gefunden werden könnten. Wir bitten um sechs Monate, um Forks herauszufiltern, die schnell als Projekte aufgegeben werden. +- **Wird von einem aktiven Team betreut** – Dies hilft, die Qualität zu gewährleisten und sicherzustellen, dass Benutzer bei ihren Anfragen Unterstützung erhalten. +- **Ehrliche und genaue Eintragsinformationen** – es wird erwartet, dass alle vorgeschlagenen Einträge von Projekten mit ehrlichen und genauen Informationen versehen sind. Produkte, die falsche Angaben machen, z. B. Ihr Produkt als "Open Source" deklarieren, obwohl es das nicht ist, werden entfernt. - **Ansprechpartner** – Ein Ansprechpartner für die Wallet hilft uns erheblich, genaue Informationen zu erhalten, wenn Änderungen vorgenommen werden. Somit bleibt die Aktualisierung von ethereum.org bei der Erfassung künftiger Informationen überschaubar. - -### Weitere Kriterien: optionale Aspekte {#the-nice-to-haves} - -- **Globaler Zugang** – Ihre Wallet hat keine geografischen Einschränkungen oder KYC-Anforderungen, die bestimmte Personen vom Zugang zu Ihrem Service ausschließen. -- **Verfügbarkeit in mehreren Sprachen** – Ihre Wallet wird in mehrere Sprachen übersetzt, so dass Nutzer auf der ganzen Welt darauf zugreifen können. -- **Open source** – die gesamte Code-Basis Ihres Projekts (nicht nur die Module) sollte zugänglich sein und Sie sollten PRs von der größeren Gemeinschaft akzeptieren. -- **Keine Verwahrung** – Nutzer kontrollieren ihr Geld. Wenn Ihr Produkt verschwindet, können die Nutzer weiterhin auf ihr Guthaben zugreifen und es bewegen. -- **Unterstützung von Hardware-Wallets** – Nutzer können ihre Hardware-Wallets anschließen, um Transaktionen zu signieren. -- **WalletConnect** – Nutzer können sich über WalletConnect mit dApps verbinden. -- **Importieren von Ethereum RPC-Endpunkten** – Benutzer können Knoten-RPC-Daten importieren, so dass sie sich mit einem Knoten ihrer Wahl oder anderen EVM-kompatiblen Netzwerken verbinden können. -- **NFTs** – Nutzer können ihre NFTs in der Wallet einsehen und mit ihnen interagieren. -- **Verbindung zu Ethereum-Anwendungen** – Nutzer können sich mit Ethereum-Anwendungen verbinden und diese nutzen. -- **Staking** – Nutzer können ihre Investitionen direkt über die Wallet tätigen. -- **Swaps** – Nutzer können Token über die Wallet tauschen. +- **EIP-1559 (Typ 2) Transaktionen** – Ihre Wallet muss EIP-1559-Transaktionen (Typ 2) für Transaktionen auf dem Ethereum-Mainnet unterstützen. +- **Gute Benutzererfahrung** – Obwohl die UX subjektiv ist, behalten wir uns das Recht vor, die Wallet abzulehnen, wenn mehrere Mitglieder des Kernteams das Produkt testen und es als schwierig in der Anwendung empfinden. Stattdessen werden wir nützliche Verbesserungsvorschläge machen. Dies dient dem Schutz unserer Benutzerbasis, die überwiegend aus Anfängern besteht. +- **Fokus auf Ethereum** – Eine Wallet muss in erster Linie ein auf Ethereum ausgerichtetes Erlebnis bieten. Das bedeutet, dass Ethereum (oder ein beliebiges L2) als Standardnetzwerk festgelegt ist, ERC-Assets ordnungsgemäß unterstützt werden und die Funktionen auf das Ethereum-Ökosystem abgestimmt sind. Wallets, die in der Benutzeroberfläche alternative Layer 1s priorisieren, werden nicht gelistet. + +### Entfernung von Produkten {#product-removals} + +- **Aktualisierte Informationen** – Wallet-Anbieter sind verpflichtet, ihre Wallet-Informationen alle 6 Monate erneut einzureichen, um die Gültigkeit und Relevanz der bereitgestellten Informationen sicherzustellen (auch wenn es keine Änderungen an ihrem Produkt gibt). Wenn das Produktteam dies versäumt, kann ethereum.org das Projekt von der Seite entfernen. + +### Weitere Kriterien: Wünschenswerte Eigenschaften {#the-nice-to-haves} + +- **Weltweit zugänglich** – Ihre Wallet hat keine geografischen Einschränkungen oder KYC-Anforderungen, die bestimmte Personen vom Zugang zu Ihrem Dienst ausschließen. +- **In mehreren Sprachen verfügbar** – Ihre Wallet ist in mehrere Sprachen übersetzt, sodass Benutzer auf der ganzen Welt darauf zugreifen können. +- **Open Source** – Die gesamte Codebasis Ihres Projekts (nicht nur die Module) sollte zugänglich sein und Sie sollten PRs aus der breiteren Community akzeptieren. +- **Eigenverwahrung** – Benutzer kontrollieren ihre eigenen Gelder. Wenn Ihr Produkt verschwindet, können die Nutzer weiterhin auf ihr Guthaben zugreifen und es bewegen. +- **Unterstützung von Hardware-Wallets** – Benutzer können ihre Hardware-Wallets anschließen, um Transaktionen zu signieren. +- **WalletConnect** – Benutzer können sich über WalletConnect mit Dapps verbinden. +- **Importieren von Ethereum-RPC-Endpunkten** – Benutzer können Knoten-RPC-Daten importieren, sodass sie sich mit einem Knoten ihrer Wahl oder anderen EVM-kompatiblen Netzwerken verbinden können. +- **NFTs** – Benutzer können ihre NFTs in der Wallet einsehen und mit ihnen interagieren. +- **Verbindung zu Ethereum-Anwendungen** – Benutzer können sich mit Ethereum-Anwendungen verbinden und diese nutzen. +- **Staking** – Benutzer können direkt über die Wallet staken. +- **Swaps** – Benutzer können Token über die Wallet tauschen. - **Multichain-Netzwerke** – Ihre Wallet unterstützt standardmäßig den Zugriff auf mehrere Blockchain-Netzwerke. -- **Layer-2-Netzwerke** – Ihre Wallet unterstützt standardmäßig den Zugang zu Layer-2-Netzwerken. -- **Anpassen der Gasgebühren** – Ihre Wallet ermöglicht es den Nutzern, die Gasgebühren für ihre Transaktionen anzupassen (Grundgebühr, Prioritätsgebühr, maximale Gebühr). +- **Layer-2-Netzwerke** – Ihre Wallet unterstützt standardmäßig den Zugriff auf Layer-2-Netzwerke. +- **Gasgebühren anpassen** – Ihre Wallet ermöglicht es Benutzern, ihre Transaktions-Gasgebühren (Grundgebühr, Prioritätsgebühr, maximale Gebühr) anzupassen. - **ENS-Unterstützung** – Ihre Wallet erlaubt es Benutzern, Transaktionen an ENS-Namen zu senden. -- **ERC-20-Unterstützung** – Ihre Wallet ermöglicht es Nutzern, ERC-20-Token-Verträge zu importieren, oder ERC-20-Token automatisch abzufragen und anzuzeigen. -- **EIP-1559 (Typ 2)-Transaktionen** – Ihre Wallet unterstützt EIP-1559 (Typ 2)-Transaktionen. -- **Krypto kaufen** – Ihre Wallet unterstützt Nutzer beim direkten Kauf und Onboarding von Krypto. -- **Verkauf für Geldwerte** – Ihre Wallet unterstützt den Verkauf und die Abhebung von Geldwerten direkt auf eine Karte oder ein Bankkonto. +- **ERC-20-Unterstützung** – Ihre Wallet ermöglicht es Benutzern, ERC-20-Token-Verträge zu importieren oder ERC-20-Token automatisch abzufragen und anzuzeigen. +- **Kryptowährung kaufen** – Ihre Wallet unterstützt Benutzer beim direkten Kauf von und Onboarding in Kryptowährungen. +- **Verkauf gegen Fiat** – Ihre Wallet unterstützt Benutzer beim Verkauf und der Auszahlung von Fiat direkt auf eine Karte oder ein Bankkonto. - **Multisig** – Ihre Wallet unterstützt mehrere Signaturen, um eine Transaktion zu signieren. -- **Social Recovery** – Ihre Wallet unterstützt Guardians und ein Nutzer kann seine Wallet mithilfe dieser Guardians wiederherstellen, wenn er seine Seed-Phrase verliert. -- **Eigenes Support-Team** – Ihre Wallet hat ein eigenes Support-Team, an das sich die Nutzer bei Problemen wenden können. -- **Lehrreiche Ressourcen/Dokumentation** – Ihr Produkt sollte über ein gut gestaltetes Onboarding-System verfügen, um den Benutzern zu helfen und sie zu informieren. Alternativ sind Informationen zu Lerninhalten wie Artikel oder Videos hilfreich. +- **Soziale Wiederherstellung** – Ihre Wallet unterstützt Guardians, und ein Benutzer kann seine Wallet mit Hilfe dieser Guardians wiederherstellen, wenn er seine Seed-Phrase verliert. +- **Dediziertes Support-Team** – Ihre Wallet verfügt über ein dediziertes Support-Team, an das sich Benutzer bei Problemen wenden können. +- **Lernressourcen/Dokumentation** – Ihr Produkt sollte über ein gut gestaltetes Onboarding-Erlebnis verfügen, um Benutzer zu unterstützen und zu schulen. Alternativ sind Informationen zu Lerninhalten wie Artikel oder Videos hilfreich. ## Eine Wallet hinzufügen {#adding-a-wallet} Wenn Sie eine Wallet zu ethereum.org hinzufügen möchten, erstellen Sie ein Ticket auf GitHub. - Ein Thema erstellen + Eintrag erstellen ## Wartung {#maintenance} Ethereum befindet sich in der Entwicklung. Daher kommen und gehen Teams und Produkte und Innovationen finden täglich statt, so dass wir unsere Inhalte regelmäßig überprüfen: -- Sicherstellen, dass alle aufgeführten Wallets und dApps weiterhin unsere Kriterien erfüllen +- Sicherstellen, dass alle aufgelisteten Wallets und Dapps weiterhin unsere Kriterien erfüllen - Überprüfen, ob Produkte vorgeschlagen wurden, die unsere Kriterien besser erfüllen als die derzeit aufgeführten -Ethereum.org wird von der Open-Source-Community gepflegt; wir sind auf die Hilfe der Community angewiesen, um diese Seite auf dem neuesten Stand zu halten. Wenn Ihnen Informationen zu den aufgelisteten Wallets auffallen, die aktualisiert werden müssen, öffnen Sie bitte [ein Ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=wallet+%3Apurse%3A&template=suggest_wallet.yaml) oder [Pull Request](https://github.com/ethereum/ethereum-org-website/pulls)! +ethereum.org wird von der Open-Source-Community gepflegt und wir sind auf die Hilfe der Community angewiesen, um diese Seite auf dem neuesten Stand zu halten. Wenn Sie Informationen über gelistete Wallets bemerken, die aktualisiert werden müssen, [eröffnen Sie bitte ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=wallet+%3Apurse%3A&template=suggest_wallet.yaml) oder einen [Pull-Request](https://github.com/ethereum/ethereum-org-website/pulls)! ## Nutzungsbedingungen {#terms-of-use} -Bitte beachten Sie auch unsere[Nutzungsbedingungen](/terms-of-use/). Die Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. +Bitte beachte auch unsere [Nutzungsbedingungen](/terms-of-use/). Die Informationen auf ethereum.org werden ausschließlich zu allgemeinen Informationszwecken bereitgestellt. diff --git a/public/content/translations/de/contributing/content-resources/index.md b/public/content/translations/de/contributing/content-resources/index.md index 4120f3ee93d..1b80f5cb2a0 100644 --- a/public/content/translations/de/contributing/content-resources/index.md +++ b/public/content/translations/de/contributing/content-resources/index.md @@ -4,13 +4,13 @@ lang: de description: Unsere Kriterien für die Auflistung von Inhaltsressourcen auf ethereum.org --- -# Inhaltsressourcen hinzufügen {#adding-content-resources} +# Hinzufügen von Inhaltsressourcen {#adding-content-resources} Ethereum vollständig abzubilden, ist wegen des Umfangs nicht möglich. Daher versuchen wir, einige der großartigen Artikel, Tutorials, Newsletter, Jobbörsen und verschiedene Inhaltsressourcen vorzustellen, die die Community erstellt. Sie bieten oft tiefergreifende Informationen zu Themen, die für die Nutzer von Interesse sind. Wenn Sie eine Ressource kennen, die Ihrer Meinung nach nützlich ist, können Sie sie an geeigneter Stelle zur Hinzufügung vorschlagen. -## Die Entscheidungsfindung {#how-we-decide} +## Wie wir entscheiden {#how-we-decide} Die Lernressourcen werden anhand der folgenden Kriterien bewertet: @@ -19,11 +19,11 @@ Die Lernressourcen werden anhand der folgenden Kriterien bewertet: - Sind die Informationen korrekt? Werden Tatsachen oder Meinungen präsentiert? - Ist der Autor glaubwürdig? Werden Quellen angegeben? - Bietet dieser Inhalt einen eindeutigen Mehrwert, der von bestehenden Ressourcen/Links nicht abgedeckt wird? -- Ist der Inhalt für eine unserer [Nutzergruppen](https://www.notion.so/efdn/Ethereum-org-User-Persona-Memo-b44dc1e89152457a87ba872b0dfa366c) nützlich? +- Dient dieser Inhalt einer unserer [Benutzer-Personas](https://www.notion.so/efdn/Ethereum-org-User-Persona-Memo-b44dc1e89152457a87ba872b0dfa366c)? --- -## Ihre Inhaltsressource hinzufügen {#add-your-content-resource} +## Fügen Sie Ihre Inhaltsressource hinzu {#add-your-content-resource} Wenn Sie eine Inhaltsressource zu ethereum.org hinzufügen möchten und diese die Kriterien erfüllt, erstellen Sie einen Eintrag auf GitHub. diff --git a/public/content/translations/de/contributing/design-principles/index.md b/public/content/translations/de/contributing/design-principles/index.md index c00e6623998..656c99128d0 100644 --- a/public/content/translations/de/contributing/design-principles/index.md +++ b/public/content/translations/de/contributing/design-principles/index.md @@ -4,61 +4,61 @@ lang: de description: Die Grundsätze hinter den Entscheidungen über Design und Inhalt von ethereum.org --- -# Unsere Designgrundsätze {#contributing-to-ethereumorg-} +# Unsere Design-Grundsätze {#contributing-to-ethereumorg-} - Hallo und herzlich willkommen bei den Designgrundsätzen für ethereum.org. Die Informationen sind Teil eines laufenden Prozesses zur Weiterentwicklung und Verbesserung von ethereum.org. + Hallo und herzlich willkommen zu den Design-Grundsätzen von ethereum.org. Die Informationen sind Teil eines laufenden Prozesses zur Weiterentwicklung und Verbesserung von ethereum.org. Unsere Grundsätze prägen das Erscheinungsbild der Website und den Inhalt. -Machen Sie sich mit den Informationen vertraut, bevor Sie einen [Beitrag zu ethereum.org](/contributing/) leisten. +Sie sollten diese lesen, bevor Sie [zu ethereum.org beitragen](/contributing/). ## Was sind Designgrundsätze? {#ways-to-contribute} -Keine Sorge, das ist ziemlich einfach. **Designgrundsätze** sind eine Reihe von Richtlinien, auf die wir uns beziehen, wenn wir etwas entwerfen (d. h. erstellen, pflegen oder aktualisieren). +Keine Sorge, das ist ziemlich einfach. **Design-Grundsätze** sind eine Reihe von Richtlinien, auf die wir uns beziehen, wenn wir etwas entwerfen (d. h. erstellen, pflegen oder aktualisieren). -In Zusammenhang mit ethereum.org bilden diese Designgrundsätze die Basis für das, was wir mit der Website darstellen und der Welt zeigen wollen. Sie sind ambitioniert **und** funktional. Es geht nicht nur darum, wie die Website _aussieht_, sondern auch darum, wie sie _funktioniert_, und sogar darum, welche _Gefühle_ sie bei jemanden auslöst. Alles, von den Farben über die Seitenlayouts bis hin zur Art und Weise, wie wir auf der Website über Ethereum sprechen, sollte von diesen Grundsätzen geprägt sein. +In Zusammenhang mit ethereum.org bilden diese Designgrundsätze die Basis für das, was wir mit der Website darstellen und der Welt zeigen wollen. Sie sind sowohl inspirierend **als auch** funktional. Es geht nicht nur darum, wie die Website _aussieht_, sondern auch darum, wie sie _funktioniert_ und sogar, wie sich jemand dabei _fühlt._ Alles, von den Farben über die Seitenlayouts bis hin zur Art und Weise, wie wir auf der Website über Ethereum sprechen, sollte von diesen Grundsätzen geprägt sein. ## Die Grundsätze in der Praxis {#how-decisions-about-the-site-are-made} -Sehen wir uns ein Beispiel an. Einer der Grundsätze ist "Glaubwürdig". Das bedeutet, dass Besucher der Site von der Vertrauenswürdigkeit _überzeugt_ _sind_ – genau wie vom breiteren Ethereum-Ökosystem. Dieser Grundsätz gliedert sich in drei funktionale "Unterprinzipien", die wir als umsetzbar erachten, um die Glaubwürdigkeit der Website zu verbessern: +Sehen wir uns ein Beispiel an. Einer der Grundsätze ist „Glaubwürdig“. Das bedeutet, dass wir möchten, dass die Besucher der Website _fühlen_ und _wissen_, dass die Seite vertrauenswürdig ist – genau wie das breitere Ethereum-Ökosystem. Dieser Grundsätz gliedert sich in drei funktionale "Unterprinzipien", die wir als umsetzbar erachten, um die Glaubwürdigkeit der Website zu verbessern: -- _"Frisch"_ d. h. Inhalte auf aktuellem Stand -- _"Sozial durchdacht"_ d. h. Darstellung der Größe, Vielfalt und Aktivität des Ökosystems (also Ethereum-Upgrade-Fortschritt, DeFi, Gaming, alle Hackathons usw.) -- _"Einheitlich"_ d. h. Konsistenz im Seitendesign und der Wortwahl sowie präzise Inhalte +- _„Frisch“_, d. h. die Inhalte aktuell halten. +- _„Sozialer Beweis“_, d. h. die Größe, Vielfalt und Aktivität des Ökosystems zu zeigen (z. B. Fortschritte bei Ethereum-Upgrades, DeFi, Gaming, all die Hackathons usw.). +- _„Konsistent“_, d. h. Konsistenz im Design der Website sowie im Ton und in der Genauigkeit der Formulierungen. Wenn wir Entscheidungen in puncto Design oder Werbetexte tätigen, ziehen wir den Grundsatz "Glaubwürdigkeit" heran und stellen folgende Fragen: -- _"Gibt die Seite aktuelle Informationen wieder?"_ -- _"Wie und wo zeigen wir die Größe und Aktivität des Ökösystems?"_ -- _"Sind die vorgeschlagenen Beiträge eines Mitglieds der Community, die ich überprüfe, konsistent mit dem aktuellen Design und Inhalten auf der Seite?"_ +- _„Gibt die Seite aktuelle Informationen wieder?“_ +- _„Wie und wo zeigen wir die Größe und Aktivität des Ökosystems?“_ +- _„Sind die neuen, von einem Community-Mitglied vorgeschlagenen Beiträge, die ich prüfe, mit dem aktuellen Design und dem Schreibstil auf der Website konsistent?“_ -## Designgrundsätze von ethereum.org {#contributors} +## Die Design-Grundsätze von ethereum.org {#contributors} ### 1. Inspirierend {#1-inspirational} Die Seite sollte Nutzer dazu anregen, sich vorzustellen, welche Veränderungen Ethereum für die Welt brignen könnte. Menschen sollen sich motiviert fühlen, die Tools des Ethereum-Ökösystems zu erkunden, damit zu experimentieren und zu basteln. -- **Fundamental:** Die Seite sollte vermitteln, wie Ethereum ambitioniert versucht, die Welt zu verändern. Es sollte klar werden, dass Ethereum nicht nur eine weitere technische Errungenschaft ist, sondern eine transformative Technologie. -- **Fördern durch Bildung:** Die Informationen sollten so gestaltet sein, dass Besucher das Potenzial von Ethereum verstehen, einen Platz im Ökösystem finden und sich befähigt fühlen, sich zu beteiligen. +- **Radikal:** Die Website sollte die ehrgeizigen Ziele von Ethereum vermitteln, die Welt entscheidend zu verändern. Es sollte klar werden, dass Ethereum nicht nur eine weitere technische Errungenschaft ist, sondern eine transformative Technologie. +- **Stärkung durch Bildung:** Die Website sollte Menschen bilden, damit sie das Potenzial von Ethereum verstehen, ihren Platz im Ökosystem finden und sich befähigt fühlen, daran teilzunehmen. -Visuelle Ausrichtung • Inhalt +Gestaltung • Inhalt -### 2. Allgemein {#2-universal} +### 2. Universell {#2-universal} Ethereum ist ein globales, dezentralisiertes Projekt und das zeigt sich auch in unserer Zielgruppe. Ziel ist es, die Site jedem zugänglich zu machen und die Kulturen der Welt zu begrüßen. -- **Barrierefrei:** Die Site sollte Richtlinien zur Barrierefreiheit berücsichtigen, auch Anforderungen für Verbindungen mit geringer Bandbreite. -- **Einfach:** Die Site sollte einfach und unmissverständlich sein. Texte sollten so formuliert sein, dass sie nicht falsch interpretiert werden oder die Beteudung in der Übersetzung verloren gehen könnte. +- **Barrierefrei:** Die Website sollte die Richtlinien zur Barrierefreiheit befolgen – auch für Menschen mit Verbindungen mit geringer Bandbreite. +- **Unkompliziert:** Die Website sollte einfach und unmissverständlich sein. Texte sollten so formuliert sein, dass sie nicht falsch interpretiert werden oder die Beteudung in der Übersetzung verloren gehen könnte. - **Ethereum ist facettenreich:** Ethereum ist ein Projekt, eine Codebasis, eine Community und eine Vision. Ethereum ist für unterschiedliche Menschen aus verschiedenen Gründen wertvoll. Es gibt viele Möglichkeiten zur Beteiligung. -Schriftsystem • Benutzung der Farben • Optische Ausrichtung • Inhalt +Schriftsysteme • Farbverwendung • Visuelle Ausrichtung • Inhalte ### 3. Eine gute Geschichte {#3-a-good-story} Die Website sollte eine gute Geschichte erzählen. Besucher sind auf einer Reise und der Inhalt, den Sie beitragen, ist ein Teil davon. Ihre Beiträge sollten sich mit einer klaren Erzählung einfügen: mit einem Anfang (Einleitung/Einstiegspunkt), Mittelteil (eine Reihe von Erkenntnissen und Einsichten) und ein Schlussteil (ein Link zu relevanten Ressourcen oder nächsten Schritten). -- **Hierarchisch**: Eine klare hierarchische strukturierte Informationsarchitektur hilft den Besuchern von ethereum.org bei der Navigation durch die "Geschichte", die die Website erzählt, um ihre Ziele zu erreichen. -- **Ein Sprungbrett:** Wir sind ein Sprungbrett für alle, die nach Antworten suchen. Wir möchten die vielen, bereits vorhandenen Ressourcen nicht ersetzen. Wir geben eine Antwort und zeigen zuverlässige nächste Schritte auf. +- **Hierarchisch**: Eine klare, hierarchisch strukturierte Informationsarchitektur hilft Besuchern von ethereum.org, die Seite „als Geschichte“ zu navigieren, während sie versuchen, ihre Ziele zu erreichen. +- **Ein Sprungbrett:** Wir sind ein Sprungbrett für jeden, der nach Antworten sucht. Wir möchten die vielen, bereits vorhandenen Ressourcen nicht ersetzen. Wir geben eine Antwort und zeigen zuverlässige nächste Schritte auf. Benutzererfahrung • Inhalt @@ -66,28 +66,28 @@ Benutzererfahrung • Inhalt Besucher sind entweder auf der Suche nach einem Einstieg in das Ethereum-Ökosystem oder sie stehen der Sache skeptisch gegenüber. Seien Sie sich dieser Verantwortung bewusst und kommunizieren Sie in einer entsprechenden Art und Weise. Stellen Sie sicher, dass die Inhalte das Vertrauen der Besucher in das Ethereum-Ökosystem stärken. -- **Neu:** immer auf aktuellem Stand. -- **Soziale durchdacht:** Stellen Sie die Größe, Vielfalt und Aktivität des Ökösystems dar. -- **Konsistenz:** einheitlich im Desing und glaubwürdige Inhalte. +- **Frisch:** Immer auf dem neuesten Stand. +- **Sozialer Beweis:** Die Größe, Vielfalt und Aktivität des Ökosystems zeigen. +- **Konsistent:** Konsistenz in Design und Inhalt vermittelt Glaubwürdigkeit. Gestaltung • Inhalt -### 5. Gemeinsame Verbesserung {#5-collaborative-improvement} +### 5. Kollaborative Verbesserung {#5-collaborative-improvement} Die Website ist ein Produkt von vielen Mitwirkenden, genau wie das ganze Ökösystem. -- **Offen:** Stellen sie die Transparenz in den Vordergrund, die den Source Code, die Prozesse und Projekte kennzeichnet und sich durch das ganze Ökösystem zieht. -- **Erweiterbar:** Das Baukastensystem ist ein zentraler Aspekt, der alles prägt, as wir tun. Mitwirkende sollen diesen Anspruch ebenfalls berücksichtigen. Das Kerndesign, Codekomponenten und Implementatierungen der Site sollten für die Zukunft möglichst austauschbar sein. -- **Experimentell:** Wir experiementieren, testen und iterieren fortlaufend. -- **Gemeinschaftlich:** Das Projekt bringt uns alle zusammen. -- **Nachhaltig:** Treffen Sie Vorbereitungen für die langfristige Verwaltung durch die Community. +- **Offen:** Die Transparenz von Quellcode, Prozessen und Projekten im gesamten Ökosystem würdigen. +- **Erweiterbar:** Modularität ist ein zentraler Schwerpunkt bei allem, was wir tun, daher sollten auch Beiträge modular sein. Das Kerndesign, der Komponentencode und die Implementierung der Website sollten eine einfache zukünftige Erweiterbarkeit ermöglichen. +- **Experimentell:** Wir experimentieren, testen und iterieren ständig. +- **Kollaborativ:** Dieses Projekt bringt uns alle zusammen. +- **Nachhaltig:** Eine langfristige Wartung durch die Community ermöglichen. -Sie können unsere Designgrundsätze in Aktion sehen, und zwar [überall auf unserer Site](/). +Sie können unsere Design-Grundsätze [auf unserer gesamten Website](/) in Aktion sehen. -## Wir sind an Feedback interessiert {#give-feedback} +## Feedback geben {#give-feedback} -**Teilen Sie uns Ihr Feedback zu diesem Dokument mit.** Einer unserer Grundsätze ist "**Gemeinsame Verbesserung**" und das bedeutet, dass die Website ein Produkt aus der Beteiligung vieler Mitwirkenden ist. Daher möchen wir diese Designgrundsätze mit der Ethereum-Community teilen. +**Teilen Sie Ihr Feedback zu diesem Dokument mit!** Einer unserer vorgeschlagenen Grundsätze ist „**Kollaborative Verbesserung**“. Das bedeutet, dass wir möchten, dass die Website das Produkt vieler Mitwirkender ist. Daher möchen wir diese Designgrundsätze mit der Ethereum-Community teilen. -Obwohl diese Grundsätze auf die ethereum.org-Website ausgerichtet sind, hoffen wir, dass große Teile davon repräsentativ für die Werte des Ethereum-Ökosystems insgesamt stehen. Vielleicht möchten Sie sogar einige davon für Ihr eigenes Projekt berücksichtigen. +Obwohl sich diese Grundsätze auf die Website ethereum.org konzentrieren, hoffen wir, dass viele von ihnen auch die Werte des gesamten Ethereum-Ökosystems repräsentieren. Vielleicht möchten Sie sogar einige davon für Ihr eigenes Projekt berücksichtigen. -Teilen Sie uns Ihre Gedanken mit auf unserem [Discord-Server](https://discord.gg/ethereum-org) oder indem Sie [ein Thema erstellen](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=). +Teilen Sie uns Ihre Gedanken auf unserem [Discord-Server](https://discord.gg/ethereum-org) mit oder [erstellen Sie ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=). diff --git a/public/content/translations/de/contributing/design/adding-design-resources/index.md b/public/content/translations/de/contributing/design/adding-design-resources/index.md index 6cc547b3500..95890364783 100644 --- a/public/content/translations/de/contributing/design/adding-design-resources/index.md +++ b/public/content/translations/de/contributing/design/adding-design-resources/index.md @@ -4,7 +4,7 @@ description: Richtlinien und Anforderungen zur Gewährleistung der Qualität von lang: de --- -# Design-Ressourcen hinzufügen {#adding-design-resources} +# Hinzufügen von Design-Ressourcen {#adding-design-resources} Jeder kann neue Designmaterialien für die Seite [Design und UX in web3](/developers/docs/design-and-ux/) vorschlagen. @@ -48,7 +48,7 @@ c. Der Text sollte prägnant und auf den Punkt gebracht sein. a. Das Hauptziel des Artikels sollte die Vermittlung von Erkenntnissen und nicht die Werbung für ein bestimmtes Projekt oder Unternehmen sein. -## Communities/DAOs {#Communities-and-DAOs} +## Communitys / DAOs {#Communities-and-DAOs} 1. Die Website muss klar angeben, wie man der DAO/Community beitreten kann diff --git a/public/content/translations/de/contributing/design/index.md b/public/content/translations/de/contributing/design/index.md index 9a0bd796860..a0fb2471d04 100644 --- a/public/content/translations/de/contributing/design/index.md +++ b/public/content/translations/de/contributing/design/index.md @@ -4,23 +4,23 @@ description: Mitarbeit am Design bei ethereum.org lang: de --- -# Mitarbeit am Design bei ethereum.org {#design-contributions} +# Design-Beitrag zu ethereum.org {#design-contributions} -Design ist ein wichtiger Bestandteil eines jeden Projekts. Wenn Sie Ihre Zeit und Ihre Design-Fähigkeiten für Ethereum.org einsetzen, können Sie dazu beitragen, die Benutzerfreundlichkeit für unsere Besucher zu verbessern. Die Mitarbeit an einem Open-Source-Projekt bietet Ihnen die Möglichkeit, relevante Erfahrungen zu sammeln und Ihre Fähigkeiten in einer kollaborativen Umgebung zu entwickeln. Sie werden die Chance haben, mit anderen Designern, Entwicklern und Community-Mitgliedern zusammenzuarbeiten, die alle ihre eigenen Perspektiven und Einsichten miteinbringen. +Design ist eine Schlüsselkomponente eines jeden Projekts. Durch das Einbringen deiner Zeit und deiner Design-Skills auf ethereum.org trägst du dazu bei, das Benutzererlebnis für unsere Besucher zu optimieren. Die Mitarbeit an einem Open-Source-Projekt bietet Ihnen die Möglichkeit, relevante Erfahrungen zu sammeln und Ihre Fähigkeiten in einer kollaborativen Umgebung zu entwickeln. Sie werden die Chance haben, mit anderen Designern, Entwicklern und Community-Mitgliedern zusammenzuarbeiten, die alle ihre eigenen Perspektiven und Einsichten miteinbringen. Letztendlich ist das eine großartige Möglichkeit, ein vielfältiges und beeindruckendes Portfolio aufzubauen, das Ihre Designfähigkeiten unter Beweis stellt. ## Wie kann ich etwas beitragen? -###  Geben Sie Feedback zu frühen Design-Prototypen {#design-critique} +###  Gib Feedback zu frühen Design-Prototypen {#design-critique} Manchmal brauchen wir Hilfe beim Testen unserer "rohen" Ideen. Das ist eine großartige Möglichkeit, auch ohne technische Kenntnisse einen Beitrag zu leisten. -1. Das Design-Team wird ein Mockup-Design auf [Discord](https://discord.com/invite/CetY6Y4) und auf [GitHub](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) veröffentlichen. +1. Das Design-Team teilt ein Mockup-Design auf [Discord](https://discord.com/invite/ethereum-org) und auf [GitHub](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). 2. Sie werden durch die Entwürfe geführt und können über die Kommentarfunktion Feedback geben. 3. Das Ergebnis wird in einem GitHub-Issue geteilt und dann vom Team abgeschlossen. -###  Teilnahme an Umfragen {#answer-surveys} +###  Nimm an Umfragen teil {#answer-surveys} Geben Sie Feedback zu unserer Website: @@ -28,50 +28,50 @@ Geben Sie Feedback zu unserer Website: 2. Klicken Sie auf das Feedback-Widget in der rechten unteren Ecke und beantworten Sie Fragen zum Design und zum Inhalt. 3. Konzentrieren Sie sich auf die Fragen zum freien Format. -###  Finden Sie designbezogene Probleme auf der Website und melden Sie diese. {#report-design-issues} +###  Finde designbezogene Probleme auf der Website und melde sie {#report-design-issues} -Ethereum.org ist eine schnell wachsende Website mit vielen Funktionen und Inhalten. Einige der Benutzeroberflächen können leicht veraltet sein oder verbessert werden. Wenn Ihnen ein solches Problem auffällt, melden Sie es bitte, damit wir darauf aufmerksam werden. +ethereum.org ist eine rasant wachsende Webseite, die zahlreiche Features und Inhalte bietet. Einige der Benutzeroberflächen können leicht veraltet sein oder verbessert werden. Wenn Ihnen ein solches Problem auffällt, melden Sie es bitte, damit wir darauf aufmerksam werden. 1. Gehen Sie durch die Website und achten Sie auf ihr Design. 2. Machen Sie Screenshots und Notizen, wenn Sie visuelle oder UX-Probleme sehen. -3. Melden Sie die gefundenen Probleme in einem [Fehlerbericht](https://github.com/ethereum/ethereum-org-website/issues/new/choose). +3. Melde die gefundenen Probleme über einen [Fehlerbericht](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -###  Designänderungen vorschlagen {#propose-design-changes} +###  Schlage Designänderungen vor {#propose-design-changes} -Wenn Sie sich mit Design-Herausforderungen wohlfühlen, können Sie unser GitHub Issues Board besuchen und nach [designbezogenen Issues](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) filtern. +Wenn du dich wohl dabei fühlst, Design-Herausforderungen anzunehmen, kannst du unser GitHub-Issues-Board besuchen und nach [designbezogenen Issues](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) filtern. -1. Schauen Sie sich unsere Website an und achten Sie auf das Design, oder gehen Sie zu unserem GitHub-Repository und überprüfen Sie Issues, die mit dem Tag ["Design required"](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) gekennzeichnet sind. -2. Machen Sie sich Gedanken über die Lösung und entwerfen Sie sie. (Idealerweise unter Verwendung unseres [Designsystems](https://www.figma.com/community/file/1134414495420383395)). -3. Schlagen Sie die Lösung in dem entsprechenden GitHub-Thema vor oder erstellen Sie ein [neues Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request). +1. Sieh dir unsere Website an und achte auf ihr Design oder gehe zu unserem GitHub-Repository und sieh dir die Issues an, die mit dem [Tag „Design required“](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) gekennzeichnet sind. +2. Machen Sie sich Gedanken über die Lösung und entwerfen Sie sie. (idealerweise unter Verwendung unseres [Design-Systems](https://www.figma.com/community/file/1134414495420383395)). +3. Schlage die Lösung im entsprechenden GitHub-Issue vor oder [erstelle ein neues.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) 4. Warten Sie auf die Überprüfung durch das Designteam. -###  Das Designsystem gemeinsam aufbauen {#Contribute-to-design-system} +###  Trage zum Aufbau des Design-Systems bei {#Contribute-to-design-system} Mit unserem Designsystem macht das Entwerfen von ethereum.org Spaß und ist einfach. Wenn Sie ein erfahrener Designer sind, können Sie uns helfen, viele Komponenten für die Website vorzubereiten. -1. Wählen Sie ein Thema aus dem [Design-System-Board](https://github.com/ethereum/ethereum-org-website/labels/design%20system) auf GitHub aus, an dem Sie arbeiten möchten, oder erstellen Sie ein neues. +1. Wähle ein Issue aus dem [Design-System-Board](https://github.com/ethereum/ethereum-org-website/labels/design%20system) auf GitHub aus, an dem du arbeiten möchtest, oder erstelle ein neues. 2. Fordern Sie an, dass Ihnen das ausgewählte Thema zugewiesen wird. -3. Beginnen Sie mit dem Design der gewünschten Komponente in figma. +3. Fang an, die gewünschte Komponente in Figma zu designen. 4. Teilen Sie es dem Designteam auf GitHub mit, sobald Sie eine Überprüfung oder Hilfe benötigen. 5. Das Designteam wird es dann überprüfen. -6. Das Designteam wird die Änderungen in die Hauptdatei einarbeiten und die Datei in der Community veröffentlichen. +6. Das Design-Team übernimmt die Änderungen in die Hauptdatei und stellt sie der Community zur Verfügung. -###  Verfassen Sie designbezogene Inhalte auf der Website. {#write-design-articles} +###  Schreibe designbezogene Inhalte für die Website {#write-design-articles} -Die Ethereum-Entwickler-Community ist stark, aber die Design-Community hinkt etwas hinterher. Wenn Sie ein Designer mit Web3-Kenntnissen sind, ziehen Sie bitte in Erwägung, Ihre Erkenntnisse mit der größeren Community zu teilen, damit wir alle gemeinsam wachsen und uns verbessern können; wir haben eine [Seite über Design für Ethereum](/developers/docs/design-and-ux/), zu der Sie beitragen können. Sie können auch unsere [Richtline zur Listung](/contributing/design/adding-design-resources) ansehen. +Die Ethereum-Entwickler-Community ist stark, aber die Design-Community hinkt etwas hinterher. Wenn du ein Designer mit Web3-Wissen bist, teile deine Erkenntnisse bitte mit der größeren Community, damit wir alle gemeinsam wachsen und uns verbessern können. Wir haben [eine Seite über das Design für Ethereum](/developers/docs/design-and-ux/), zu der du beitragen kannst. Du kannst auch unsere [Richtlinien für die Aufnahme](/contributing/design/adding-design-resources) einsehen. 1. Machen Sie sich Gedanken über Designthemen, die auf ethereum.org behandelt werden sollten und die für die Designer in diesem Bereich von Nutzen wären. -2. Gehen Sie zu unserem GitHub-Repository und [öffnen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues/new), um ein Thema vorzuschlagen (schreiben Sie den Inhalt noch nicht). +2. Gehe zu unserem GitHub-Repository und [erstelle ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new), in dem du ein Thema vorschlägst (schreibe den Inhalt noch nicht). 3. Warten Sie auf die Freigabe durch das Designteam. 4. Sobald die Anfrage genehmigt ist, schreiben Sie den Inhalt. -5. Reichen Sie ihn im entsprechenden GH-Thema ein. +5. Füge es dem betreffenden GitHub-Issue hinzu. -###  Gestalten Sie neue Illustrationen. {#prepare-illustrations} +###  Zeichne neue Illustrationen {#prepare-illustrations} Visualisierungen sind eines der wirkungsvollsten Instrumente zur Erklärung abstrakter Themen. Der Einsatz von Diagrammen und Infografiken birgt ein enormes Potenzial. Schließlich kann ein Bild mehr als tausend Worte sagen. 1. Gehen Sie auf unsere Website und suchen Sie nach Seiten, auf denen neue Infografiken hinzugefügt werden könnten. -2. Vergewissern Sie sich, dass der Illustrationsstil mit unseren [Assets](/assets/) übereinstimmt. -3. Gehen Sie zu unserem GitHub-Repository und [machen Sie einen Vorschlag](https://github.com/ethereum/ethereum-org-website/issues/new) für die Illustration. +2. Stelle sicher, dass der Illustrationsstil unseren [Assets](/assets/) entspricht. +3. Gehe zu unserem GitHub-Repository und [erstelle ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new), in dem du die Illustration vorschlägst. 4. Das Designteam wird sie dann prüfen. 5. Wir erstellen ein neues Thema, um einen Entwickler zu bitten, das neue Bild zu implementieren. diff --git a/public/content/translations/de/contributing/index.md b/public/content/translations/de/contributing/index.md index 3c98d599e9c..4bf0f92e445 100644 --- a/public/content/translations/de/contributing/index.md +++ b/public/content/translations/de/contributing/index.md @@ -6,60 +6,76 @@ lang: de # Mitwirken bei ethereum.org 🦄 {#contributing-to-ethereumorg} -Die ethereum.org-Website, wie Ethereum im Großen und Ganzen, ist ein Open-Source-Projekt. Möchten Sie helfen, [den Zugang zu Ethereum zu verbessern](/about/), dann finden Sie hier Informationen, was Sie tun können. +Ethereum.org ist ein Open-Source-Projekt mit über **12.000** Mitwirkenden, die helfen, die Website zu übersetzen, zu schreiben, zu gestalten und zu pflegen. - - - - - Beanspruchen Sie Ihren POAP-Token an. Haben Sie 2022 einen Beitrag zu ethereum.org geleistet, dann wartet ein einzigartiger POAP auf Sie.{" "}Mehr zu POAPs. - - - +Wir sind eine einladende Community, die Ihnen dabei hilft, im Ethereum Ökosystem zu wachsen und sich weiterzubilden, während Sie gleichzeitig einen sinnvollen Beitrag leisten und relevante praktische Erfahrungen sammeln! ## Möglichkeiten zum Mitwirken {#ways-to-contribute} -- [Arbeiten an offenen Themen](https://github.com/ethereum/ethereum-org-website/issues) _ – Arbeit, die wir als notwendig erachten_ -- [Beitrag zum Überstzungsprogramm](/contributing/translation-program/)_ – Helfen Sie uns, ethereum.org in neuen Sprachen verfügbar zu machen_ -- [Hilfe bei der Gestaltung der Website](/contributing/design/) _ – Designer aller Stufen können zur Verbesserung der Website beitragen_ -- [Community-Ressourcen hinzufügen](/contributing/content-resources/) _ – Fügen Sie eine(n) hilfreiche(n) Artikel oder Ressource zu einer relevanten Seite hinzu_ -- [Produkt hinzufügen](/contributing/adding-products/) _ – Fügen Sie eine dApp oder eine Wallet zu einer relvanten Seite hinzu_ -- [Entwicklungstools hinzufügen](/contributing/adding-developer-tools/) _ – Fügen Sie Entwicklungstools zu einer relvanten Seite hinzu_ -- [Handelsplatz hinzufügen](/contributing/adding-exchanges/) _ – Fügen Sie einen Handelsplatz zu unserer [Börsensuche hinzu](/get-eth/#country-picker)_ -- [ Unsere Forschung verbessern](https://www.notion.so/efdn/Ethereum-org-User-Persona-Memo-b44dc1e89152457a87ba872b0dfa366c) _ – Geben Sie uns Feedback zu unserer Forschung oder betreiben Sie Ihre eigene_ -- [Ein Feature vorschlagen](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) _ – Lassen Sie uns wissen, wenn Sie irgendwelche Ideen für ein neues Feature oder Design haben_ -- [Glossarbegriff hinzufügen](/contributing/adding-glossary-terms) _ – Helfen Sie uns, das Ethereum-[Wörterbuch](/glossary/) zu vergrößern_ -- [Inhalt erstellen/bearbeiten](/contributing/#how-to-update-content) _ – Neue Seiten vorschlagen oder bereits vorhandene Seiten verbessern_ -- [Eine layer 2 hinzufügen](/contributing/adding-layer-2s/) _ – Eine Layer 2 einer relevanten Seite hinzufügen_ -- [Hinzufügen eines Staking-Produkts oder einer Dienstleistung](/contributing/adding-staking-products/)_ – Fügen Sie ein Projekt hinzu, das die Solo-, Pool-Staking oder Staking als Dienstleistung unterstützt._ -- [Ein Wallet hinzufügen](/contributing/adding-wallets/) _ – Eine Wallet zur Seite [der Wallet-Suche](/wallets/find-wallet/) hinzufügen_ -- [Schlagen Sie ein Projekt für unsere DeSci Seite vor](/contributing/adding-desci-projects/) _ – Fügen Sie ein Projekt hinzu, das auf Ethereum gebaut wurde und zur dezentralen Wissenschaft beiträgt_ -- [Quizfragen](/contributing/quizzes/) _ – Hinzufügen, Aktualisieren und Löschen von Quizfragen für eine bestimmte Seite_ -- [Designressourcen vorschlagen](/contributing/design/adding-design-resources/) _ – Hilfreiche Designressourcen hinzufügen, aktualisieren und löschen_ +**Übersetzungen** -_Haben Sie Fragen?_ 🤔 Sie erreichen uns auf unserem [Discord-Server](https://discord.gg/ethereum-org). +- [Am Übersetzungsprogramm teilnehmen](/contributing/translation-program/) – Helfen Sie uns, ethereum.org in neue Sprachen zu bringen -## So funktioniert die Arbeit an ethereum.org {#how-to-update-content} +**Entwicklung** -Ganz gleich, ob Sie Inhalte zur Site hinzufügen, Inhalte erstellen oder an offenen Themen arbeiten, Sie benötigen ein[GitHub](https://github.com)-Konto. +- [Arbeiten Sie an einem offenen Issue](https://github.com/ethereum/ethereum-org-website/issues) – Aufgaben, die erledigt werden müssen -Alle Updates erfolgen über den GitHub PR-Prozess. Das bedeutet, Sie erstellen eine lokale Kopie der Website, nehmen Ihre Änderungen vor und stellen eine Anfrage, um Ihre Änderungen einzufügen. Wenn Sie so etwas bis dato noch nicht gemacht haben, befolgen Sie die Anweisungen unten in unserem [GitHub-Repository](https://github.com/ethereum/ethereum-org-website). +**Design** + +- [Helfen Sie bei der Gestaltung der Website](/contributing/design/) – Designer aller Erfahrungsstufen können zur Verbesserung der Website beitragen + +**Inhalt** + +- [Inhalte erstellen/bearbeiten](/contributing/#how-to-update-content) – Schlagen Sie neue Seiten vor oder nehmen Sie kleine Änderungen an Bestehendem vor +- [Community-Ressourcen hinzufügen](/contributing/content-resources/) – Fügen Sie einer relevanten Seite einen hilfreichen Artikel oder eine Ressource hinzu +- [Eine Design-Ressource vorschlagen](/contributing/design/adding-design-resources/) – Hilfreiche Design-Ressourcen hinzufügen, aktualisieren und löschen +- [Quizze](/contributing/quizzes/) – Quizfragen-Sammlungen für eine relevante Seite hinzufügen, aktualisieren und löschen + +**Feature Ideen** + +- [Ein Feature anfordern](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) – Teilen Sie uns Ihre Ideen für ein neues Feature oder Design mit + +**Produktlisten** + +- [Eine Börse hinzufügen](/contributing/adding-exchanges/) – Fügen Sie eine Börse zu unserem [Börsen-Finder](/get-eth/#country-picker) hinzu +- [Ein Produkt hinzufügen](/contributing/adding-products/) – Fügen Sie einer relevanten Seite eine Dapp oder eine Wallet hinzu +- [Entwickler-Tools hinzufügen](/contributing/adding-developer-tools/) – Fügen Sie einer relevanten Seite ein Entwickler-Tool hinzu +- [Eine Layer-2 hinzufügen](/contributing/adding-layer-2s/) – Fügen Sie eine Layer-2 zu einer relevanten Seite hinzu +- [Ein Staking-Produkt oder einen -Dienst hinzufügen](/contributing/adding-staking-products/) – Fügen Sie ein Projekt hinzu, das Solo-Staking, Pool-Staking oder Staking-as-a-Service erleichtert +- [Eine Wallet hinzufügen](/contributing/adding-wallets/) – Fügen Sie eine Wallet für die Seite [Wallet finden](/wallets/find-wallet/) hinzu +- [Ein Projekt für unsere DeSci-Seite vorschlagen](/contributing/adding-desci-projects/) – Fügen Sie ein auf Ethereum basierendes Projekt hinzu, das zur dezentralen Wissenschaft beiträgt + +Noch Fragen? 🤔 Treten Sie unserem [Discord-Server](https://discord.gg/ethereum-org) bei + +## Gute erste Aufgaben, um mit der Mitarbeit zu beginnen + +Dies sind einige aktuelle Aufgaben, bei deren Lösung Sie uns helfen und Verantwortung übernehmen könnten. Für die meisten benötigen Sie ein GitHub-Konto, da die meisten Änderungen an der Website über GitHub vorgenommen werden. + + + +Alle Aufgaben ansehen + +## Wie man an ethereum.org mitarbeitet {#how-to-update-content} + +Wenn Sie am [Übersetzungsprogramm](/contributing/translation-program/) mitwirken möchten, bitten wir Sie, ein Konto auf [Crowdin](https://crowdin.com/project/ethereum-org) zu erstellen. Für alles andere – Hinzufügen oder Bearbeiten von Inhalten oder Bildern zur Website, Beheben von Fehlern, Arbeiten an offenen Aufgaben – benötigen Sie ein GitHub-Konto. + +Alle Updates erfolgen über den GitHub PR-Prozess. Das bedeutet, Sie erstellen eine lokale Kopie der Website, nehmen Ihre Änderungen vor und stellen eine Anfrage, um Ihre Änderungen einzufügen. Wenn Sie dies noch nie zuvor getan haben, folgen Sie den Anweisungen am Ende unseres [GitHub-Repositorys](https://github.com/ethereum/ethereum-org-website). Sie können ohne unsere Erlaubnis an Themen arbeiten. Allerdings ist es immer besser, uns wissen zu lassen, was Sie umsetzen möchten. Dafür haben Sie folgende Möglichkeiten: -- Einen Fehler oder einen PR auf [GitHub](https://github.com/ethereum/ethereum-org-website) kommentieren -- Uns auf unserem [Discord-Server](https://discord.gg/ethereum-org) schreiben +- Kommentieren eines Issues oder PRs in [GitHub](https://github.com/ethereum/ethereum-org-website) +- Nachrichtenaustausch auf unserem [Discord-Server](https://discord.gg/ethereum-org) Bevor Sie einen Beitrag leisten, sollten Sie sich mit folgenden Themen vertraut machen: - die sich entwickelnde [Vision von ethereum.org](/about/) -- unsere [Designgrundsätze](/contributing/design-principles/) +- unsere [Design-Prinzipien](/contributing/design-principles/) - unser [Styleguide](/contributing/style-guide/) - unser [Verhaltenskodex](/community/code-of-conduct) -## So werden Entscheidungen für die Site getroffen {#how-decisions-about-the-site-are-made} +## Wie Entscheidungen über die Website getroffen werden {#how-decisions-about-the-site-are-made} -Entscheidungen zu individuellen PRs, zur Designentwicklung und zu großen Upgrades werden von einem Team aus dem Ethereum-Ökösystem getroffen. In diesem Team finden sich Projektmanager, Entwickler, Designer, Marketing-, Kommunikations- und Fachexperten. Der Input der Community fließt in jede Entscheidung ein: Stellen Sie also Fragen zu Problmen, reichen Sie PRs ein oder kontaktieren Sie das Team: +Entscheidungen über einzelne PRs, die Weiterentwicklung des Designs und größere Upgrades werden von einem Team aus dem gesamten Ethereum-Ökosystem getroffen. Dieses Team besteht aus Projektmanagern, Entwicklern, Designern, Marketing- und Kommunikationsexperten sowie Fachexperten. Der Input der Community fließt in jede Entscheidung ein: Stellen Sie also Fragen in Issues, reichen Sie PRs ein oder kontaktieren Sie das Team: - [website@ethereum.org](mailto:website@ethereum.org) - [@ethdotorg](https://twitter.com/ethdotorg) @@ -67,26 +83,37 @@ Entscheidungen zu individuellen PRs, zur Designentwicklung und zu großen Upgrad ### Ein Hinweis zu Plagiaten {#plagiarism} -Verwenden Sie nur Ihre eigene(n) Arbeit oder Inhalte, zu deren Verwendung Sie berechtigt sind, wenn Sie Inhalte oder Artefakte zu ethereum.org beitragen. Viele Projekte innerhalb des Ethereum-Ökosystems nutzen Open-Source-Linzenzen, die den freien Austausch von Informationen ermöglichen. Wenn Sie diese Informationen jedoch nicht finden können, versuchen Sie nicht, Sie zu ethereum.org hinzuzufügen. Jede Pull-Anfrage, die als Plagiat angesehen wird, wird zurückgewiesen. +Verwenden Sie nur Ihre eigene Arbeit oder Inhalte, für deren Verwendung Sie die Erlaubnis haben, wenn Sie Inhalte oder Artefakte zu ethereum.org beitragen. Viele Projekte innerhalb des Ethereum-Ökosystems verwenden Open-Source-Lizenzen, die den freien Austausch von Informationen ermöglichen. Wenn Sie diese Informationen jedoch nicht finden können, versuchen Sie nicht, sie zu ethereum.org hinzuzufügen. Alle Pull-Requests, die als Plagiat eingestuft werden, werden abgelehnt. ## Neu bei Open-Source? {#new-to-open-source} -Ein Einstieg in unser GitHub-Repository sollte kein großes Hindernis darstellen und wurde speziell für Entwickler entworfen, die mit Open Source noch nicht vertraut sind. Es nennt sich [Gutes erstes Thema](https://github.com/ethereum/ethereum-org-website/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). +Wir haben in unserem GitHub-Repository Issues mit geringer Einstiegshürde, die speziell für Entwickler gedacht sind, die neu im Open-Source-Bereich sind, und die mit [good first issue](https://github.com/ethereum/ethereum-org-website/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) gekennzeichnet sind. -## POAP als Mitwirkender beanspruchen {#poap} +## Fordern Sie Ihren Onchain Achievement Token (OAT) an {#oat} -Wenn Ihr Beitrag in ethereum.org eingebunden wird, prägen wir Ihnen einen einzigartigen POAP für Mitwirkende. Ein Proof of Attendance Protokoll- Token (POAP) ist ein On-Chain-Nachweis, dass Sie geholfen haben, das Ökosystem noch besser zu machen. +Wenn Ihr Beitrag in ethereum.org gemerged wird, haben Sie die Möglichkeit, ein spezielles Abzeichen auf [Galxe](https://app.galxe.com/quest/ethereumorg) zu beanspruchen. Ein Onchain Achievement Token (OAT) ist ein Beweis dafür, dass Sie dazu beigetragen haben, das Ökosystem ein bisschen großartiger zu machen. -[Mehr zu POAPs](https://www.poap.xyz/) +[Mehr über OATs](https://help.galxe.com/en/articles/9645630-create-quest-rewards#h_1c5d63ba03) -### So werden sie beansprucht {#how-to-claim} +### So fordern Sie sie an 1. Treten Sie unserem [Discord-Server](https://discord.gg/ethereum-org) bei. -2. Fügen Sie einen Link zu Ihrem Beitrag in den `#🥇 | proof-of-contribution` [Kanal](https://discord.com/channels/714888181740339261/1212737737916948530) ein. -3. Warten Sie, bis ein Mitglied unseres Teams Ihnen einen Link zu Ihrem POAP schickt. -4. Beanspruchen Sie Ihren POAP. +2. Fügen Sie einen Link zu Ihrem Beitrag in den Kanal `#🥇 | proof-of-contribution` ein. +3. Warten Sie, bis ein Mitglied unseres Teams Ihnen einen Link zu Ihrem OAT sendet. +4. Fordern Sie Ihren OAT an! + +Sie sollten nur Self-Custody-Wallets verwenden, um OATs anzufordern. Verwenden Sie keine Konten von Börsen oder andere Konten, für die Sie nicht die privaten Schlüssel besitzen, da Sie mit diesen nicht auf Ihre OATs zugreifen und diese verwalten können. + +## Fordern Sie Ihren GitPOAP an {#claim-gitpoap} + +GitPOAP erkennt auch automatisch Ihren gemergten Beitrag und ermöglicht es Ihnen, ein separates, einzigartiges POAP für Mitwirkende direkt auf der Plattform zu minten! + +### So fordern Sie ihn an {#how-to-claim} -Sie sollten nur Wallets zur Selbstaufbewahrung verwenden, um Ihre POAPs zu beanspruchen. Verwenden Sie keine Konten von Handelspläten oder andere Konten, für die Sie nicht als einziger den Private Key besitzen, da Sie darüber keinen Zugang und keine Möglichkeit zur Verwaltung der POAPs erhalten. +1. Besuchen Sie [GitPOAP](https://www.gitpoap.io). +2. Verbinden Sie sich mit Ihrer Wallet oder auch per E-Mail über die Anmeldeoption. +3. Suchen Sie nach Ihrem GitHub-Benutzernamen, Ihrer ETH-Adresse, Ihren ENS-Namen oder einem GitPOAP, um zu prüfen, ob Sie berechtigt sind. +4. Wenn Ihr GitHub-Konto berechtigt ist, können Sie einen GitPOAP minten! ## Mitwirkende {#contributors} diff --git a/public/content/translations/de/contributing/quizzes/index.md b/public/content/translations/de/contributing/quizzes/index.md index 3617caf1bd3..50bfa7c63bd 100644 --- a/public/content/translations/de/contributing/quizzes/index.md +++ b/public/content/translations/de/contributing/quizzes/index.md @@ -19,7 +19,7 @@ Einige Beispiele für aktuelle Quizfragen finden Sie hier: ## Lernquiz hinzufügen -Wenn es eine Seite gibt, für die noch kein Lernquiz erstellt wurde, [öffnen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) für diese Seite. +Wenn es eine Seite gibt, für die noch kein Lern-Quiz erstellt wurde, [öffnen Sie bitte ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) dafür. Geben Sie die folgenden Informationen an: @@ -32,7 +32,7 @@ Geben Sie die folgenden Informationen an: ## Quizfrage hinzufügen -Wenn Sie eine Frage zur Fragensammlung für ein Quiz hinzufügen möchten, [öffnen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) und geben Sie die folgenden Informationen an: +Wenn Sie eine Frage zum Fragenpool für ein Quiz hinzufügen möchten, [öffnen Sie bitte ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) und machen Sie die folgenden Angaben: - Die Seite, zu der Sie eine Quizfrage hinzufügen möchten - Geben Sie für jede Frage die folgenden Informationen an: @@ -43,7 +43,7 @@ Wenn Sie eine Frage zur Fragensammlung für ein Quiz hinzufügen möchten, [öff ## Quizfrage aktualisieren -Wenn Sie eine Frage in einer Fragensammlung für ein Quiz aktualisieren möchten, [öffnen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) und geben Sie die folgenden Informationen an: +Wenn Sie eine Frage in einem Fragenpool für ein Quiz aktualisieren möchten, [öffnen Sie bitte ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) und machen Sie die folgenden Angaben: - Die Seite, auf der Sie eine Quizfrage aktualisieren möchten - Geben Sie für jede zu aktualisierende Frage die folgenden Informationen an: @@ -55,7 +55,7 @@ Wenn Sie eine Frage in einer Fragensammlung für ein Quiz aktualisieren möchten ## Quizfrage entfernen -Wenn der Inhalt einer Frage nicht mehr auf der Seite vorhanden ist und sie entfernt werden soll, [öffnen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml), um die Frage zu entfernen, und geben Sie die folgenden Informationen an: +Wenn der Inhalt für eine Frage nicht mehr auf der Seite vorhanden ist und entfernt werden muss, [öffnen Sie bitte ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml), um die Frage zu entfernen, und machen Sie die folgenden Angaben: - Die Seite, auf der Sie eine Quizfrage löschen möchten - Die Frage, die Sie löschen möchten diff --git a/public/content/translations/de/contributing/translation-program/faq/index.md b/public/content/translations/de/contributing/translation-program/faq/index.md index d10c9094d27..d828bf7136a 100644 --- a/public/content/translations/de/contributing/translation-program/faq/index.md +++ b/public/content/translations/de/contributing/translation-program/faq/index.md @@ -4,7 +4,7 @@ lang: de description: Häufig gestellte Fragen zum Übersetzungprogramm von ethereum.org --- -# Übersetzungsanleitung für ethereum.org {#translating-ethereum-guide} +# Leitfaden zum Übersetzen von ethereum.org {#translating-ethereum-guide} Wenn Sie neu im Übersetzungsprogramm sind und zögern, sich einzubringen, finden Sie hier einige FAQs, die Ihnen den Einstieg erleichtern können. Sie finden in diesem Leitfaden Antworten auf häufig gestellte Fragen. @@ -18,29 +18,29 @@ Ziel des Übersetzungsprogramms ist es, Ethereum für jeden zugänglich zu mache Daher ist das Übersetzungsprogramm offen zugänglich. Die Mitarbeit erfolgt auf freiwilliger Basis und unbezahlt. Würden Übersetzer für die von ihnen übersetzten Wörter bezahlt, könnten wir nur Übersetzer mit ausreichend Erfahrung (also professionelle Übersetzer) dazu einladen, an dem Übersetzungsprogramm teilzunehmen. Damit würde das Übersetzungsprogramm Personen ausschließen und das steht der allgemeinen Zielsetzung entgegen: Jeder soll die Möglichkeit haben, teilzunehmen und sich am Ökosystem zu beteiligen. -Wir setzen alles daran, unseren Mitwirkenden eine erfolgreiche Teilnahme am Ethereum-Ökosystem zu ermöglichen. Es gibt viele nicht-monetäre Anreize wie: [angebotene POAPs](/contributing/translation-program/acknowledgements/#poap) und ein [Übersetzungszertifikat](/contributing/translation-program/acknowledgements/#certificate) sowie [Übersetzungsranglisten](/contributing/translation-program/acknowledgements/) und [die Nennung all unserer Übersetzer auf der Site](/contributing/translation-program/contributors/). +Wir bemühen uns sehr, unseren Mitwirkenden im Ethereum-Ökosystem zum Erfolg zu verhelfen; es gibt viele nicht-monetäre Anreize wie: das [Angebot von POAPs](/contributing/translation-program/acknowledgements/#poap) und ein [Übersetzerzertifikat](/contributing/translation-program/acknowledgements/#certificate) sowie die Organisation von [Übersetzungs-Bestenlisten](/contributing/translation-program/acknowledgements/) und die [Auflistung all unserer Übersetzer auf der Website](/contributing/translation-program/contributors/). -## Wie kann ich Strings mit `` übersetzen? {#tags} +## Wie übersetze ich Zeichenketten mit ``? {#tags} -Nicht jeder String wird in reiner Textform geschrieben. Einige Strings bestehen aus gemischten Skripten wie HTML-Tags (`<0>`, ``). Diese werden in der Regel für Hyperlinks oder alternative Formatierungen in der Mitte eines Satzes verwendet. +Nicht jeder String wird in reiner Textform geschrieben. Einige Zeichenketten bestehen aus gemischten Skripten wie HTML-Tags (`<0>`, ``). Dies wird in der Regel für Hyperlinks oder eine alternative Formatierung mitten im Satz verwendet. - Übersetzen Sie den Text innerhalb der Tags, aber nicht die Tags selbst. Alles, was zwischen `<` und `>` steht, darf nicht übersetzt oder entfernt werden. - Um die Strings zu schützen, empfehlen wir, unten links auf die Schaltfläche "Copy Source" (Quelle kopieren) zu klicken. Damit wird der ursprüngliche String kopiert und in das Textfeld zur Übersetzung eingefügt. Auf diese Weise können Sie die Tags sehen. Das hilft dabei, Fehler zu vermeiden. -![Crowdin-Oberfläche mit hervorgehobener Schaltfläche "Copy Source" (Quelle kopieren)](./html-tag-strings.png) +![Crowdin-Benutzeroberfläche mit hervorgehobener Schaltfläche „Quelle kopieren“](./html-tag-strings.png) Sie können die Position der Tags innerhalb der Zeichenkette verschieben, um sie an die richtige Position für Ihre Sprache zu bringen. Achten Sie dabei aber darauf, dass das ganze Tag an andere Stelle gebracht wird. -Ausführlichere Informationen zum Umgang mit Tags und Code-Ausschnitten finden Sie im [Übersetzungsleitfaden von ethereum.org](/contributing/translation-program/translators-guide/#dealing-with-tags). +Ausführlichere Informationen zum Umgang mit Tags und Code-Ausschnitten finden Sie im [Stil-Leitfaden für Übersetzungen von ethereum.org](/contributing/translation-program/translators-guide/#dealing-with-tags). ## Woher kommen die Strings? {#strings} Oft reichen die Quelltexte allein nicht aus, um eine genaue Übersetzung zu erstellen. - Weitere Informationen finden Sie unter "Screenshots" und "Context". Im Quelltext-Abschnitt sehen Sie einen Screenshot. Darauf können Sie sehen, in welchem Kontext der String verwendet wird. -- Wenn Sie immer noch unsicher sind, setzen Sie eine Kennzeichnung im Bereich "Comment Section". [Sind Sie unsicher, wie Sie einen Kommentar hinterlassen?](#comment) +- Wenn Sie immer noch unsicher sind, setzen Sie eine Kennzeichnung im Bereich "Comment Section". [Sie sind nicht sicher, wie Sie einen Kommentar hinterlassen können?](#comment) -![Zeigt, wie Kontext per Screenshot für einen String bereitgestellt werden kann](./source-string.png) +![Zeigt, wie Kontext für eine Zeichenkette mithilfe eines Screenshots bereitgestellt werden kann](./source-string.png) ![Ein Beispiel-Screenshot, der zu Kontextzwecken hinzugefügt wurde](./source-string-2.png) @@ -52,11 +52,11 @@ Wenn Sie eine bestimmte Zeichenfolge markieren möchten, die Aufmerksamkeit erfo - Wenn Sie das Problem übermittelt haben, wird es unserem Team gemeldet. Wir werden das Problem beheben und Sie darüber informieren, indem wir auf Ihren Kommentar antworten und das Problem schließen. - Wenn Sie eine fehlerhafte Übersetzung melden, werden die Übersetzung und die von Ihnen vorgeschlagene Alternative bei der nächsten Prüfung von einem Muttersprachler überprüft. -![Zeigt, wie Kommentare geschrieben und Probleme gemeldet werden können](./comment-issue.png) +![Zeigt, wie Kommentare erstellt und Probleme gemeldet werden können](./comment-issue.png) ## Was ist Translation Memory (TM)? {#translation-memory} -Translation Memory (TM) ist eine Funktion von Crowdin, die alle zuvor übersetzten Zeichenketten in [ethereum.org](https://ethereum.org/) speichert. Wenn eine Zeichenkette übersetzt wird, wird sie automatisch in unserem Projekt-TM gespeichert. Das ist ein nützliches Werkzeug, mit dem sich beim Übersetzen Zeit sparen lässt. +Translation Memory (TM) ist eine Funktion von Crowdin, die alle zuvor übersetzten Zeichenketten in ethereum.org speichert. Wenn eine Zeichenkette übersetzt wird, wird sie automatisch in unserem Projekt-TM gespeichert. Das ist ein nützliches Werkzeug, mit dem sich beim Übersetzen Zeit sparen lässt. - Im Abschnitt "TM and MT Suggestions" (TM und maschinell übersetzte Vorschläge) können Sie sehen, wie andere Übersetzer den gleichen oder einen ähnlichen Satz übersetzt haben. Wenn Sie einen Vorschlag mit einer hohen Übereinstimmungsrate finden, können Sie diese Übersetzung verwenden, indem Sie darauf klicken. - Wenn die Liste keine Einträge zeigt, können Sie den Übersetzungsspeicher nach bereits erstellten Übersetzungen durchsuchen und sie wiederverwenden, um Einheitlichkeit zu gewährleisten. @@ -65,23 +65,23 @@ Translation Memory (TM) ist eine Funktion von Crowdin, die alle zuvor übersetzt ## Wie benutze ich das Crowdin-Glossar? {#glossary} -Die Terminologie von Ethereum ist ein weiterer entscheidender Bestandteil unserer Übersetzungsarbeit, da neue technologische Begriffe in anderen Sprachen häufig noch nicht lokalisiert sind. Außerdem gibt es Begriffe, die in verschiedenen Kontexten unterschiedliche Bedeutungen haben. [Weitere Informationen zur Übersetzung der Ethereum-Terminologie](#terminology). +Die Terminologie von Ethereum ist ein weiterer entscheidender Bestandteil unserer Übersetzungsarbeit, da neue technologische Begriffe in anderen Sprachen häufig noch nicht lokalisiert sind. Außerdem gibt es Begriffe, die in verschiedenen Kontexten unterschiedliche Bedeutungen haben. [Mehr zur Übersetzung der Ethereum-Terminologie](#terminology) Das Crowding-Glossar ist der beste Ort, um Begriffe und Definitionen besser zu verstehen. Es gibt zwei Wege, um das Glossar zu nutzen. - Erste Möglichkeit: Wenn ein Begriff im Quelltext unterstrichen ist, können Sie mit der Maus darüberfahren. Daraufhin wird eine kurze Definition angezeigt. -![Beispiel einer Glossardefinition](./glossary-definition.png) +![Eine beispielhafte Glossardefinition](./glossary-definition.png) - Zweite Möglichkeit: Wenn Sie einen Begriff sehen, der nicht unterstrichen und der Ihnen nicht geläufig ist, können Sie ihn über die Registerkarte "Glossary" (Glossar) (die dritte Schaltfläche in der rechten Spalte) suchen. Dort finden Sie Erklärungen zu bestimmten Begriffen, die im Rahmen des Projekts häufig verwendet werden. -![Ein Screenshot, der zeigt, wo die Registerkarte "Glossary" (Glossar) in Crowdin zu finden ist](./glossary-tab.png) +![Ein Screenshot, der zeigt, wo sich die Registerkarte „Glossar“ in Crowdin befindet](./glossary-tab.png) - Wenn Sie jedoch nichts finden können, dann ist das die Chance, einen neuen Begriff hinzuzufügen. Wir möchten Sie dazu ermuntern, den Begriff in einer Suchmaschine nachzuschlagen und die Beschreibung im Glossar hinzuzufügen. Das ist anderen Übersetzern eine große Hilfe, den Begriff besser zu verstehen. -![Ein Screenshot, der zeigt, wie Glossarbegriffe zu Crowdin hinzugefügt werden](./add-glossary-term.png) +![Ein Screenshot, der zeigt, wie ein Glossareintrag zu Crowdin hinzugefügt wird](./add-glossary-term.png) -### Übersetzungsrichtlinie für Eigennamen und Fachbegriffe {#terminology} +### Übersetzungsrichtlinie für Terminologie {#terminology} _Für Namen (Marken, Unternehmen, Personen) und neue technische Begriffe (Beacon Chain, Shard Chains etc.)_ @@ -93,7 +93,7 @@ Nach sorgfältiger Überlegung haben wir die Entscheidung getroffen, die am häu Im Folgenden finden Sie die von uns vorgeschlagene Vorgehensweise, wenn Sie auf einen Begriff stoßen, der Ihnen nicht geläufig ist: -- Sehen Sie im [Glossar der Begriffe](#glossary) nach, wie andere Übersetzer den Begriff bereits übersetzt haben. Wenn Sie der Meinung sind, dass die Übersetzung des Begriffes nicht zutreffend ist, können Sie Ihre Übersetzung für den Begriff zum Crowdin-Glossar hinzufügen. +- Sehen Sie im [Glossar der Begriffe](#glossary) nach, dort finden Sie möglicherweise, wie andere Übersetzer den Begriff bereits übersetzt haben. Wenn Sie der Meinung sind, dass die Übersetzung des Begriffes nicht zutreffend ist, können Sie Ihre Übersetzung für den Begriff zum Crowdin-Glossar hinzufügen. - Falls im Glossar noch keine Übersetzung vorhanden ist, empfehlen wir, den Begriff über eine Suchmaschine in öffentlichen Artikeln zu recherchieren, um herauszufinden, wie der Begriff in der Community tatsächlich verwendet wird. - Wenn Sie keine Referenzen finden, vertrauen Sie auf Ihre Intuition und schlagen Sie eine neue Übersetzung in Ihrer Sprache vor. - Wenn Sie sich das nicht zutrauen, dann belassen Sie den Begriff unübersetzt. Manchmal sind die englischen Begriffe für eine genaue Definition am passendsten. @@ -102,18 +102,18 @@ Wir empfehlen, Namen von Marken, Unternehmen und Personen nicht zu übersetzen, ## Wie funktioniert der Überprüfungsprozess? {#review-process} -Um ein bestimmtes Niveau und Konsistenz in unseren Überstzungen zu gewährleisten, arbeiten wir mit [Acolad](https://www.acolad.com/), einem der weltweit größten Übersetzungsdienstleister, zusammen. Acolad arbeitet mit mehr als 20.000 professionellen Sprachexperten zusammen. Das bedeutet, dass sie für jede Sprache und jede Art von Inhalten, die wir benötigen, professionelle Prüfer bereitstellen können. +Um ein bestimmtes Niveau an Qualität und Konsistenz in unseren Übersetzungen zu gewährleisten, arbeiten wir mit [Acolad](https://www.acolad.com/), einem der weltweit größten Sprachdienstanbieter, zusammen. Acolad arbeitet mit mehr als 20.000 professionellen Sprachexperten zusammen. Das bedeutet, dass sie für jede Sprache und jede Art von Inhalten, die wir benötigen, professionelle Prüfer bereitstellen können. -Der Überprüfungsprozess ist unkompliziert. Sobald ein bestimmtes [Inhaltsgebiet](/contributing/translation-program/content-buckets) vollständig übersetzt ist, beauftragen wir die eine die Überprüfung dieser Inhalte. Der Überprüfungsprozess erfolgt direkt in Crowdin. Sobald die Überprüfung abgeschlossen ist aktualisieren wir die Website mit dem übersezten Inhalt. +Der Überprüfungsprozess ist unkompliziert; sobald eine Reihe von Inhalten zu 100 % übersetzt ist, beauftragen wir eine Überprüfung für dieses Inhaltspaket. Der Überprüfungsprozess erfolgt direkt in Crowdin. Sobald die Überprüfung abgeschlossen ist aktualisieren wir die Website mit dem übersezten Inhalt. ## Wie kann ich Inhalte in meiner Sprache hinzufügen? {#adding-foreign-language-content} Derzeit werden alle nicht-englischen Inhalte direkt vom englischen Quelltext übersetzt. Inhalte, die es nicht auf Englisch gibt, können nicht zu anderen Sprachen hinzugefügt werden. -Wenn Sie neue Inhalte für ethereum.org vorschlagen möchten, [erstellen Sie ein Thema](https://github.com/ethereum/ethereum-org-website/issues) auf GitHub. Wenn Sie hinzugefügt werden, dann wird der Inhalt auf Englisch geschrieben und über Crowdin in andere Sprachen übersetzt. +Um neue Inhalte für ethereum.org vorzuschlagen, können Sie auf GitHub [ein „Issue“ erstellen](https://github.com/ethereum/ethereum-org-website/issues). Wenn Sie hinzugefügt werden, dann wird der Inhalt auf Englisch geschrieben und über Crowdin in andere Sprachen übersetzt. Wir planen, in naher Zukunft Unterstützung für nicht-englische Inhalte hinzuzufügen. -## Kontakt {#contact} +## Kontaktieren Sie uns {#contact} -Vielen Dank, dass Sie sich die Inhalte oben angesehen haben. Wir hoffen, dass das hilfreich war, damit Sie sich an unserem Programm beteiligen können. Sie können unserem [Discord-Übersetzungskanal](https://discord.gg/ethereum-org) beitreten, um Fragen zu stellen und mit anderen Übersetzern zusammenzuarbeiten. Sie können sich aber auch unter translations@ethereum.org an uns wenden. +Vielen Dank, dass Sie sich die Inhalte oben angesehen haben. Wir hoffen, dass das hilfreich war, damit Sie sich an unserem Programm beteiligen können. Treten Sie gerne unserem [Discord-Kanal für Übersetzungen](https://discord.gg/ethereum-org) bei, um Fragen zu stellen und mit anderen Übersetzern zusammenzuarbeiten, oder kontaktieren Sie uns unter translations@ethereum.org! diff --git a/public/content/translations/de/contributing/translation-program/how-to-translate/index.md b/public/content/translations/de/contributing/translation-program/how-to-translate/index.md index 68d3652f00b..9907daaf7eb 100644 --- a/public/content/translations/de/contributing/translation-program/how-to-translate/index.md +++ b/public/content/translations/de/contributing/translation-program/how-to-translate/index.md @@ -4,15 +4,15 @@ lang: de description: Anweisungen für die Verwendung von Crowdin zur Übersetzung von ethereum.org --- -# Übersetzen – so geht's {#how-to-translate} +# Wie man übersetzt {#how-to-translate} -## Ein visueller Leitfaden {#visual-guide} +## Visuelle Anleitung {#visual-guide} Für visuell Lernende: Luka führt Sie durch die Einrichtung von Crowdin. Alternativ können Sie die gleichen Schritte auch im nächsten Abschnitt nachlesen. -## Schriftlicher Leitfaden {#written-guide} +## Schriftliche Anleitung {#written-guide} ### Beteiligen Sie sich an unserem Projekt auf Crowdin {#join-project} @@ -22,33 +22,32 @@ Sie müssen sich bei Ihrem Crowdin-Konto anmelden oder sich registrieren, wenn S Am Projekt teilnehmen -### Wählen Sie Ihre Sprache {#open-language} +### Öffnen Sie Ihre Sprache {#open-language} -Nachdem Sie sich bei Crowdin angemeldet haben, sehen Sie eine Projektbeschreibung und eine Liste aller verfügbaren Sprachen. Jede Sprache enthält außerdem Informationen über die Gesamtzahl der übersetzbaren Wörter und einen Überblick darüber, wie viele Inhalte in einer bestimmten Sprache bereits übersetzt und genehmigt wurden. +Nachdem Sie sich bei Crowdin angemeldet haben, sehen Sie eine Projektbeschreibung und eine Liste aller verfügbaren Sprachen. +Jede Sprache enthält außerdem Informationen über die Gesamtzahl der übersetzbaren Wörter und einen Überblick darüber, wie viele Inhalte in einer bestimmten Sprache bereits übersetzt und genehmigt wurden. Wählen Sie die Sprache, in die Sie übersetzen möchten, um die Liste der Dateien anzuzeigen, die für die Übersetzungen zur Verfügung stehen. -![Liste von Sprachen auf Crowdin](./list-of-languages.png) +![Liste der Sprachen in Crowdin](./list-of-languages.png) ### Suchen Sie ein Dokument, an dem Sie arbeiten möchten {#find-document} Der Inhalt der Website ist in eine Reihe von Dokumenten und Inhaltsbereichen unterteilt. Sie können den Fortschritt jedes Dokuments auf der rechten Seite überprüfen. Wenn der Übersetzungsfortschritt unter 100 % liegt, können Sie daran mitarbeiten. -Ist Ihre Sprache nicht aufgeführt? [Eröffnen Sie ein Ticket](https://github.com/ethereum/ethereum-org-website/issues/new/choose) oder fragen Sie in unserem [Discord](https://discord.gg/ethereum-org) nach. +Ist Ihre Sprache nicht aufgeführt? [Erstellen Sie ein Issue](https://github.com/ethereum/ethereum-org-website/issues/new/choose) oder fragen Sie in unserem [Discord](https://discord.gg/ethereum-org) -![Übersetzte und nicht übersetzte Dateien auf Crowdin](./crowdin-files.png) +![Übersetzte und nicht übersetzte Dateien in Crowdin](./crowdin-files.png) -Ein Hinweis zu den Inhaltsbereichen: Wir nutzen 'Inhaltsbereiche' in Crowdin, um den Inhalt mit der höchsten Priorität zuerst zu veröffentlichen. Wenn Sie sich eine Sprache ansehen, zum Beispiel [Philippinisch](https://crowdin.com/project/ethereum-org/fil#), sehen Sie Ordner für Inhaltsbereiche ("1. Startseite", "2. Grundlagen", "3. Exploring", usw.). +Ein Hinweis zu den Inhaltsbereichen: Wir nutzen 'Inhaltsbereiche' in Crowdin, um den Inhalt mit der höchsten Priorität zuerst zu veröffentlichen. Wenn Sie sich eine Sprache ansehen, zum Beispiel [Filipino](https://crowdin.com/project/ethereum-org/fil#), sehen Sie Ordner für Inhaltsbereiche ("1. Startseite", "2. Grundlagen", "3. Exploring", usw.). Wir empfehlen Ihnen, in dieser numerischen Reihenfolge zu übersetzen (1 → 2 → 3 → ⋯), um sicherzustellen, dass die Seiten mit der größten Wirkung zuerst übersetzt werden. -[Mehr zu ethereum.org-Inhaltsbereichen](/contributing/translation-program/content-buckets/) - ### Übersetzen {#translate} Nachdem Sie die zu übersetzende Datei ausgewählt haben, wird sie im Online-Editor geöffnet. Wenn Sie noch nicht mit Crowdin gearbeitet haben, finden Sie in dieser Kurzanleitung eine Erläuterung der Grundlagen. -![Online-Crowdin-Editor](./online-editor.png) +![Crowdin-Online-Editor](./online-editor.png) **_1 – Linke Seitenleiste_** @@ -60,7 +59,8 @@ Sie können auch die Schaltflächen oben verwenden, um nach bestimmten Zeichenfo **_2 – Editor-Bereich_** -Der Hauptübersetzungsbereich – der Ausgangstext wird oben angezeigt, mit zusätzlichem Kontext und Screenshots, falls verfügbar. Um eine neue Übersetzung vorzuschlagen, geben Sie Ihre Übersetzung in das Feld ''Enter translation here" (Übersetzung hier eingeben') ein und klicken Sie auf "Save" (Speichern). +Der Hauptübersetzungsbereich – der Ausgangstext wird oben angezeigt, mit zusätzlichem Kontext und Screenshots, falls verfügbar. +Um eine neue Übersetzung vorzuschlagen, geben Sie Ihre Übersetzung in das Feld ''Enter translation here" (Übersetzung hier eingeben') ein und klicken Sie auf "Save" (Speichern). In diesem Abschnitt finden Sie auch vorhandene Übersetzungen der Zeichenfolge und Übersetzungen in andere Sprachen sowie Translation-Memory-Übereinstimmungen und Vorschläge für maschinelle Übersetzungen. @@ -70,11 +70,11 @@ Hier können Sie Kommentare finden, Einträge aus dem Übersetzungsspeicher (Tra Über die Schaltflächen oben können Sie auch zum Übersetzungsspeicher wechseln, wo Sie nach bereits existierenden Übersetzungen suchen können, oder zum Glossar, das Beschreibungen und Standardübersetzungen von zentralen Begriffen beinhaltet. -Möchten Sie mehr erfahren? Sehen Sie sich die [Dokumentation zur Verwendung des Online-Crowdin-Editors](https://support.crowdin.com/online-editor/) an. +Möchten Sie mehr erfahren? Sehen Sie sich ruhig die [Dokumentation zur Verwendung des Crowdin-Online-Editors](https://support.crowdin.com/online-editor/) an. ### Überprüfungsprozess {#review-process} -Sobald Sie die Übersetzung abgeschlossen haben (d.h. alle Dateien für einen Inhaltsbereich 100% anzeigen), wird unser professioneller Übersetzungsdienst den Inhalt überprüfen (und möglicherweise bearbeiten). Sobald die Überprüfung abgeschlossen ist (d. h. der Überprüfungsfortschritt beträgt 100%), werden wir sie zur Website hinzufügen. +Sobald Sie die Übersetzung abgeschlossen haben (d. h., alle Dateien für einen Inhaltsbereich 100 % anzeigen), wird unser professioneller Übersetzungsdienst den Inhalt überprüfen (und möglicherweise bearbeiten). Sobald die Überprüfung abgeschlossen ist (d. h., der Überprüfungsfortschritt beträgt 100 %), werden wir sie zur Website hinzufügen. @@ -83,9 +83,9 @@ Sobald Sie die Übersetzung abgeschlossen haben (d.h. alle Dateien für einen In -### Kontakt {#get-in-touch} +### Kontaktieren Sie uns {#get-in-touch} -Haben Sie noch Fragen? Oder möchten Sie mit unserem Team und anderen Übersetzern zusammenarbeiten? Verfassen Sie Ihre Beiträge im Kanal #translations unseres[Discord-Servers von ethereum.org](https://discord.gg/ethereum-org) +Haben Sie noch Fragen? Oder möchten Sie mit unserem Team und anderen Übersetzern zusammenarbeiten? Bitte posten Sie im Kanal #translations auf unserem [ethereum.org Discord-Server](https://discord.gg/ethereum-org) Sie können uns auch unter translations@ethereum.org kontaktieren. diff --git a/public/content/translations/de/contributing/translation-program/index.md b/public/content/translations/de/contributing/translation-program/index.md index b4122c7d1d4..7f5afe17a01 100644 --- a/public/content/translations/de/contributing/translation-program/index.md +++ b/public/content/translations/de/contributing/translation-program/index.md @@ -10,17 +10,17 @@ Das Übersetzungsprogramm ist ein gemeinsamer Versuch, ethereum.org in verschied ![](./enterprise-eth.png) -## Helfen Sie uns bei der Übersetzung {#help-us-translate} +## Helfen Sie uns beim Übersetzen {#help-us-translate} Das ethereum.org Übersetzungsprogramm ist offen und jeder kann dazu beitragen! 1. Sie müssen sich bei Ihrem Crowdin-Konto anmelden oder sich registrieren. 2. Wählen Sie die Sprache aus, zu der Sie beitragen möchten. -3. Bevor Sie beginnen, schauen Sie sich bitte die [Wie übersetzen](/contributing/translation-program/how-to-translate/) Anleitung an, um zu erfahren, wie Sie Crowdin verwenden, und der [Übersetzungsstil-Leitfaden](/contributing/translation-program/translators-guide/) für Tipps und Best Practices. +3. Bevor Sie beginnen, lesen Sie bitte die Anleitung [Wie man übersetzt](/contributing/translation-program/how-to-translate/), um zu erfahren, wie man Crowdin benutzt, und den [Leitfaden für den Übersetzungsstil](/contributing/translation-program/translators-guide/) für Tipps und bewährte Verfahren. 4. Maschinelle Übersetzungen werden nicht genehmigt. 5. Alle Übersetzungen werden überprüft, bevor sie zur Seite hinzugefügt werden. Daher gibt es eine kurze Verzögerung, bevor Ihre Übersetzungen veröffentlicht werden. -_Treten Sie dem [ethereum.org-Discord](https://discord.gg/ethereum-org) bei, um an Übersetzungen mitzuarbeiten, Fragen zu stellen, Feedback und Ideen zu teilen oder einer Übersetzungsgruppe beizutreten._ +_Treten Sie dem [ethereum.org Discord](https://discord.gg/ethereum-org) bei, um bei Übersetzungen zusammenzuarbeiten, Fragen zu stellen, Feedback und Ideen auszutauschen oder einer Übersetzungsgruppe beizutreten._ Mit dem Übersetzen beginnen @@ -32,35 +32,36 @@ Die Ethereum-Community hat das Ziel, global und inklusiv zu sein. Doch ein Groß Das Übersetzungsprogramm von ethereum.org zielt darauf ab, Ethereum jedermann zugänglich zu machen, indem ethereum.org und andere Ethereum-Inhalte in so viele Sprachen wie möglich übersetzt werden. -Lesen Sie mehr über [Mission und Vision](/contributing/translation-program/mission-and-vision) des Übersetzungsprogramms auf ethereum.org. +Lesen Sie mehr über die [Mission und Vision](/contributing/translation-program/mission-and-vision) des ethereum.org-Übersetzungsprogramms. -### Unsere bisherigen Fortschritte {#our-progress} +### Unser bisheriger Fortschritt {#our-progress} -- [**5.100 +** Übersetzer](/contributing/translation-program/contributors/) -- Die Seite ist in **54** Sprachen verfügbar -- [**3 Millionen** Wörter übersetzt im Jahr 2022](/contributing/translation-program/acknowledgements/) +- [**Über 6.900** Übersetzer](/contributing/translation-program/contributors/) +- **68** Sprachen live auf der Seite +- [**2,89 Millionen** Wörter im Jahr 2024 übersetzt](/contributing/translation-program/acknowledgements/) -### Danksagungen {#acknowledgements} +### Anerkennungen {#acknowledgements} -Ethereum.org wird von Tausenden von Community-Mitgliedern übersetzt und sie bilden den wichtigsten Teil des Übersetzungsprogramms. Wir wollen unseren Übersetzern Anerkennung entgegenbringen und sie auf ihrem Karriereweg unterstützen. Hier sind einige der Auszeichnungen für unsere Übersetzer: +Ethereum.org wird von Tausenden von Community-Mitgliedern übersetzt und sie bilden den wichtigsten Teil des Übersetzungsprogramms. +Wir wollen unseren Übersetzern Anerkennung entgegenbringen und sie auf ihrem Karriereweg unterstützen. Hier sind einige der Auszeichnungen für unsere Übersetzer: #### Zertifikat {#certificate} Wenn Sie zum Übersetzungsprogramm beigetragen haben und mindestens 5.000 Ihrer übersetzten Wörter genehmigt wurden, haben Sie Anspruch auf ein ethereum.org-Übersetzerzertifikat. [Mehr über Zertifikate](/contributing/translation-program/acknowledgements/#certificate) -#### POAPs {#poaps} +#### OATs {#oats} -Alle unsere Übersetzer haben Anspruch auf ein POAP (Proof of Attendance Protocol) – ein NFT, das ihren Beitrag zum Übersetzungsprogramm von ethereum.org belegt. [Mehr über POAPs](/contributing/translation-program/acknowledgements/#poap) +Mitwirkende des Übersetzungsprogramms haben, basierend auf der Anzahl ihrer im Jahr 2024 übersetzten Wörter, Anspruch auf verschiedene OATs (On-Chain Achievement Token). OATs sind NFTs, die deine Mitarbeit am Übersetzungsprogramm von ethereum.org belegen. [Mehr über OATs](/contributing/translation-program/acknowledgements/#oats) -#### Danksagungen an die Übersetzer {#translator-acknowledgements} +#### Anerkennungen für Übersetzer {#translator-acknowledgements} -Öffentliche Anerkennungen unserer besten Übersetzer durch [Leaderboards](/contributing/translation-program/acknowledgements/) und eine [Liste aller Übersetzer, die zum Übersetzungsprogramm beitragen](/contributing/translation-program/contributors/). +Öffentliche Anerkennung unserer Top-Übersetzer mittels [Ranglisten](/contributing/translation-program/acknowledgements/) und einer [Liste aller Mitwirkenden am Übersetzungsprogramm](/contributing/translation-program/contributors/). #### Belohnungen {#rewards} -In der Vergangenheit haben wir unsere aktivsten Beitragenden rückwirkend mit Tickets für Ethereum-Konferenzen wie [Devcon](https://devcon.org/en/) und [Devconnect](https://devconnect.org/) sowie mit exklusiven ethereum.org-Artikeln belohnt. +In der Vergangenheit haben wir unsere aktivsten Mitwirkenden rückwirkend mit Tickets für Ethereum-Konferenzen wie [Devcon](https://devcon.org/en/) und [Devconnect](https://devconnect.org/) sowie mit exklusivem ethereum.org-Merch belohnt. Wir denken ständig über neue und innovative Möglichkeiten nach, unsere Mitwirkenden zu belohnen, also bleiben Sie dran! @@ -68,23 +69,23 @@ Wir denken ständig über neue und innovative Möglichkeiten nach, unsere Mitwir Wenn Sie zum Übersetzungsprogramm beitragen oder daran denken, sich zu beteiligen, sollten Sie sich die folgenden Übersetzungsanleitungen ansehen: -- [Übersetzungsleitfaden](/contributing/translation-program/translators-guide/)_ – Anleitungen und Tipps für ethereum.org-Übersetzer_ -- [Übersetzungs-FAQs](/contributing/translation-program/faq/)_ – häufig gestellte Fragen und Antworten zum Übersetzungsprogramm von ethereum.org_ -- [Editorleitfaden für Crowdin-Online](https://support.crowdin.com/online-editor/)_ – ein ausführlicher Ratgeber für die Nutzung des Online-Crowdin-Editors und seiner umfangreichen Funktionen_ -- [Inhaltsbereich](/contributing/translation-program/content-buckets/)_ – welche Seiten gehören zu welchen Inhaltsbereichen von ethereum.org_ +- [Leitfaden für den Übersetzungsstil](/contributing/translation-program/translators-guide/) _– Anweisungen und Tipps für ethereum.org-Übersetzer_ +- [Übersetzungs-FAQs](/contributing/translation-program/faq/) _– häufig gestellte Fragen und Antworten zum ethereum.org-Übersetzungsprogramm_ +- [Anleitung für den Crowdin-Online-Editor](https://support.crowdin.com/online-editor/) _– eine ausführliche Anleitung zur Verwendung des Crowdin-Online-Editors und einiger der erweiterten Funktionen von Crowdin_ -Für andere nützliche Übersetzungstools, Übersetzergemeinschaften und Blog-Einträge des Übersetzungsprogramms besuchen Sie bitte die [Ressourcenseite](/contributing/translation-program/resources/). +Für weitere nützliche Übersetzungstools, Übersetzer-Communitys und Blogbeiträge zum Übersetzungsprogramm besuchen Sie bitte die Seite [Ressourcen](/contributing/translation-program/resources/). ## Kontaktieren Sie uns {#get-in-touch} -Haben Sie noch Fragen? Oder möchten Sie mit unserem Team und anderen Übersetzern zusammenarbeiten? Verfassen Sie Ihre Beiträge im Kanal #translations unseres[Discord-Servers von ethereum.org](https://discord.gg/ethereum-org) +Haben Sie noch Fragen? Oder möchten Sie mit unserem Team und anderen Übersetzern zusammenarbeiten? Bitte posten Sie im Kanal #translations auf unserem [ethereum.org Discord-Server](https://discord.gg/ethereum-org) Sie können uns auch unter translations@ethereum.org kontaktieren. -## Ihr eigenes Übersetzungsprogramm starten {#starting-a-translation-program} +## Starten Sie Ihr eigenes Übersetzungsprogramm {#starting-a-translation-program} -Wir sind bestrebt, Ethereum-Inhalte in so viele Sprachen wie möglich zu übersetzen und Bildungsinhalte für alle zugänglich zu machen. Im Rahmen unserer Übersetzungsbemühungen möchten wir andere Ethereum-Projekte dabei unterstützen, ihre eigenen Übersetzungsbemühungen zu organisieren, zu verwalten und zu verbessern. +Wir sind bestrebt, Ethereum-Inhalte in so viele Sprachen wie möglich zu übersetzen und Bildungsinhalte für alle zugänglich zu machen. +Im Rahmen unserer Übersetzungsbemühungen möchten wir andere Ethereum-Projekte dabei unterstützen, ihre eigenen Übersetzungsbemühungen zu organisieren, zu verwalten und zu verbessern. -Daher haben wir ein [Playbook für Übersetzungsprogramme](/contributing/translation-program/playbook/) erstellt, das einige Tipps und Best Practices enthält, die wir während der Übersetzung von ethereum.org gesammelt haben. +Aus diesem Grund haben wir ein [Playbook für das Übersetzungsprogramm](/contributing/translation-program/playbook/) erstellt, das einige Tipps und bewährte Vorgehensweisen enthält, die wir bei der Übersetzung von ethereum.org gesammelt haben. Möchten Sie Ihre Zusammenarbeit fortführen oder einige unserer Übersetzungsressourcen nutzen? Haben Sie Feedback zum Playbook? Wir würden uns freuen, von Ihnen zu hören: translations@ethereum.org. diff --git a/public/content/translations/de/contributing/translation-program/playbook/index.md b/public/content/translations/de/contributing/translation-program/playbook/index.md new file mode 100644 index 00000000000..80e949ffa2c --- /dev/null +++ b/public/content/translations/de/contributing/translation-program/playbook/index.md @@ -0,0 +1,317 @@ +--- +title: Playbook für das Übersetzungsprogramm +lang: de +description: Eine Sammlung von Tipps und wichtigen Überlegungen für die Einrichtung eines Übersetzungsprogramms +--- + +# Playbook für das Übersetzungsprogramm {#translation-program-playbook} + +Englisch ist eine der meistgesprochenen Sprachen der Welt und die bei weitem meistgelernte Sprache der Welt. Da Englisch die am häufigsten im Internet verwendete Sprache ist – insbesondere in den sozialen Medien – und mehrsprachige Programmiersprachen rar sind, wird der Großteil der Inhalte im Blockchain-Bereich ursprünglich auf Englisch verfasst. + +Da jedoch über 6 Milliarden Menschen auf der Welt (mehr als 75 % der Bevölkerung) überhaupt kein Englisch sprechen, stellt dies für die große Mehrheit der Weltbevölkerung eine massive Eintrittsbarriere für Ethereum dar. + +Aus diesem Grund möchten immer mehr Projekte in diesem Bereich ihre Inhalte in verschiedene Sprachen übersetzen und für globale Gemeinschaften lokalisieren lassen. + +Die Bereitstellung mehrsprachiger Inhalte ist eine einfache und wirksame Möglichkeit, Ihre globale Community zu vergrößern, Nicht-Englischsprechern Bildung zu vermitteln, sicherzustellen, dass Ihre Inhalte und Mitteilungen ein breiteres Publikum erreichen, und mehr Menschen in den Bereich einzuführen. + +Dieser Leitfaden zielt darauf ab, die allgemeinen Herausforderungen und Missverständnisse bei der Lokalisierung von Inhalten zu behandeln. Es bietet eine Schritt-für-Schritt-Anleitung zur Verwaltung von Inhalten, zum Übersetzungs- und Überprüfungsprozess, zur Qualitätssicherung, zur Kontaktaufnahme mit Übersetzern und zu anderen wichtigen Aspekten des Lokalisierungsprozesses. + +## Content Management {#content-management} + +Das Übersetzungs-Content-Management bezieht sich auf den Prozess der Automatisierung des Übersetzungs-Workflows, wodurch wiederholte manuelle Arbeit überflüssig wird, Effizienz und Qualität verbessert, eine bessere Kontrolle ermöglicht und die Zusammenarbeit gefördert wird. + +Es gibt viele verschiedene Ansätze für das Content Management im Lokalisierungsprozess, je nach Inhalt und Ihren Bedürfnissen. + +Die grundlegende Art der Inhaltsverwaltung besteht darin, zweisprachige Dateien zu erstellen, die den Quell- und Zieltext enthalten. Dies wird bei der Übersetzung selten verwendet, da es außer der Einfachheit keine wesentlichen Vorteile bietet. + +Übersetzungsagenturen gehen das Übersetzungsmanagement in der Regel mit Übersetzungsmanagementsoftware oder Lokalisierungstools an, die Projektmanagementfunktionen bieten und eine viel größere Kontrolle über Dateien, Inhalte und Linguisten ermöglichen. + +Lesen Sie mehr über Content Management: + +[Trados zum Thema Übersetzungsmanagement](https://www.trados.com/solutions/translation-management/) + +[Phrase über mehrsprachiges Content Management](https://phrase.com/blog/posts/multilingual-content-management/) + +### Übersetzungsmanagementsoftware {#translation-management-software} + +Es gibt viele Übersetzungsmanagementsysteme und Lokalisierungstools, und die Wahl der Software hängt hauptsächlich von Ihren Bedürfnissen ab. + +Während sich einige Projekte gegen die Verwendung von Übersetzungsmanagementsystemen entscheiden und Übersetzungen lieber manuell bearbeiten – entweder direkt in zweisprachigen Dateien oder auf Hosting-Diensten wie GitHub – reduziert dies die Kontrolle, Produktivität, Qualität, Skalierbarkeit und die Möglichkeiten zur Zusammenarbeit drastisch. Ein solcher Ansatz könnte für kleine oder einmalige Übersetzungsprojekte am vorteilhaftesten sein. + +Ein kurzer Blick auf einige der leistungsstärksten und am weitesten verbreiteten Tools für das Übersetzungsmanagement: + +**Am besten für Crowdsourcing und Zusammenarbeit** + +[Crowdin](https://crowdin.com/) + +- Kostenlos für Open-Source-Projekte (unbegrenzte Anzahl von Strings und Projekten) +- TM und Glossar in allen Paketen verfügbar +- Über 60 unterstützte Dateiformate, über 70 API-Integrationen + +[Lokalise](https://lokalise.com/) + +- Kostenlos für 2 Teammitglieder, kostenpflichtige Pakete für mehr Mitwirkende (begrenzte Anzahl von Strings für die meisten Pakete) +- TM und Glossar in einigen kostenpflichtigen Paketen verfügbar +- Über 30 unterstützte Dateiformate, über 40 API-Integrationen + +[Transifex](https://www.transifex.com/) + +- Nur kostenpflichtige Pakete (begrenzte Anzahl von Strings für die meisten Pakete) +- TM und Glossar in allen kostenpflichtigen Paketen verfügbar +- Über 30 unterstützte Dateiformate, über 20 API-Integrationen + +[Phrase](https://phrase.com/) + +- Nur kostenpflichtige Pakete (unbegrenzte Anzahl von Strings für alle Pakete, begrenzte Anzahl von Projekten und Teammitgliedern) +- TM und Glossar in einigen kostenpflichtigen Paketen verfügbar +- Über 40 unterstützte Dateiformate, über 20 API-Integrationen + +[Smartcat](https://www.smartcat.com/) + +- Kostenloses Basispaket mit kostenpflichtigen erweiterten Funktionen (unbegrenzte Anzahl von Strings und Projekten für alle Pakete) +- TM und Glossar in allen Paketen verfügbar +- Über 60 unterstützte Dateiformate, über 20 API-Integrationen + +[POEditor](https://poeditor.com/) + +- Kostenlos für Open-Source-Projekte (begrenzte Anzahl von Strings für alle Projekte, unbegrenzt für Open-Source-Projekte) +- TM und Glossar für kostenpflichtige Pakete verfügbar +- Über 20 unterstützte Dateiformate, über 10 API-Integrationen + +und viele andere... + +**Professionelle Übersetzungstools** + +[SDL Trados Studio](https://www.trados.com/products/trados-studio/) + +- Kostenpflichtige Pakete für freiberufliche Übersetzer und Teams +- Sehr leistungsstarkes CAT-Tool (computerunterstützte Übersetzung) und Software zur Steigerung der Produktivität von Übersetzern + +[MemoQ](https://www.memoq.com/) + +- Begrenzte kostenlose Version mit mehreren kostenpflichtigen Paketen für erweiterte Funktionen verfügbar +- Übersetzungsmanagementsoftware für Unternehmen, Sprachdienstleister und Übersetzer + +[Memsource](https://www.memsource.com/) + +- Kostenlos für einzelne Übersetzer mit mehreren kostenpflichtigen Paketen für Teams +- Cloud-basiertes System für computerunterstützte Übersetzung und Übersetzungsmanagement + +und viele andere... + +Lesen Sie mehr über Übersetzungsmanagementsoftware: + +[Wikipedia-Definition von Übersetzungsmanagementsystemen](https://en.wikipedia.org/wiki/Translation_management_system) + +[Phrase über 7 Dinge, die jede Übersetzungsmanagementsoftware haben sollte](https://phrase.com/blog/posts/7-things-every-translation-management-software-should-have/) + +[MemoQ darüber, was ein Übersetzungsmanagementsystem ist](https://www.memoq.com/tools/what-is-a-translation-management-system) + +[Gengos Liste der 16 besten Übersetzungsmanagementsysteme](https://gengo.com/translator-product-updates/16-best-translation-management-systems/) + +## Workflow {#workflow} + +Im Übersetzungsbereich kann der Übersetzungs-Workflow einige verschiedene Dinge bedeuten, die beide etwas miteinander zusammenhängen und wichtige Überlegungen für Ihr Projekt sind. + +Wir werden beide im Folgenden untersuchen. + +**Bedeutung 1** + +Dies ist wahrscheinlich die häufigste Denkweise über Übersetzungs-Workflows und etwas, das einem normalerweise in den Sinn kommt, wenn man das Wort Workflow hört. + +Im Wesentlichen ist es der „Arbeitsablauf“ von der ersten Überlegung über Übersetzungen bis zur Verwendung der übersetzten Inhalte in Ihrem Produkt. + +Ein Beispiel-Workflow wäre in diesem Fall: + +1. **Vorbereitung der Dateien für die Übersetzung** – Das klingt einfach, aber Sie müssen ein paar wichtige Dinge beachten. In diesem Schritt sollten Sie einen klaren Plan haben, wie der gesamte Prozess ablaufen soll. + +- _Welche Dateitypen werden Sie verwenden?_ In welchem Format möchten Sie Ihre übersetzten Dateien erhalten?_ + - Wenn Ihre Inhalte im DOCX- oder MD-Format verfügbar sind, ist der Ansatz viel einfacher, als wenn Sie eine PDF-Version Ihres Whitepapers oder anderer Dokumente übersetzen. +- _Welche Lokalisierungstools unterstützen diesen Dateityp?_ Kann die Datei so übersetzt werden, dass die ursprüngliche Formatierung beibehalten wird?_ + - Nicht alle Dateitypen unterstützen die direkte Lokalisierung (z. B. PDF-Dateien, Bilddateien), und nicht alle Lokalisierungstools unterstützen alle Dateitypen. +- _Wer wird den Inhalt übersetzen?_ Werden Sie professionelle Übersetzungen in Auftrag geben oder sich auf Freiwillige verlassen?_ + - Dies wirkt sich auf eine Reihe anderer Entscheidungen aus, die Sie treffen müssen. Professionelle Übersetzer fühlen sich beispielsweise bei der Arbeit mit fortschrittlichen Lokalisierungstools wohler als Freiwillige. +- _Welche Erwartungen haben Sie an die Linguisten?_ Wenn Sie einen Sprachdienstleister beauftragen, was erwartet dieser von Ihnen?_ + - Dies ist der Schritt, um sicherzustellen, dass Ihre Ziele, Erwartungen und Zeitpläne aufeinander abgestimmt sind. +- _Ist der gesamte zu übersetzende Inhalt gleichermaßen wichtig?_ Sollten einige Inhalte zuerst übersetzt werden?_ + - Es gibt einige Möglichkeiten, bestimmte Inhalte zu priorisieren, die zuerst übersetzt und implementiert werden sollten. Wenn Sie beispielsweise viele Inhalte für die Übersetzung haben, können Sie die Versionskontrolle verwenden, um sicherzustellen, dass die Übersetzer wissen, was sie priorisieren sollen. + +2. **Freigabe der Dateien für die Übersetzung** – Dieser Schritt erfordert ebenfalls etwas langfristiges Denken und ist nicht so einfach wie das Senden der Quelldateien an einen Sprachdienstleister. + +- _Wer wird den Inhalt übersetzen?_ Wie viele Personen werden an diesem Prozess beteiligt sein?_ + - Wenn Sie ein Lokalisierungstool verwenden möchten, wird dieser Schritt vereinfacht, da Sie die Quelldateien direkt in das Tool hochladen können. Dies gilt auch, wenn der Übersetzungsprozess auf dem Hosting-Dienst stattfindet, da die Quelldateien nirgendwo exportiert werden müssen. +- _Werden die Quelldateien manuell bearbeitet oder kann dieser Prozess automatisiert werden?_ + - Die meisten Lokalisierungstools ermöglichen eine Art Integration oder Automatisierung des Dateiverwaltungsprozesses. Wenn Sie andererseits mit einzelnen Übersetzern zusammenarbeiten und kein Lokalisierungstool verwenden, ist das manuelle Senden von Quelldateien an Hunderte oder Tausende von Übersetzern kein skalierbarer Prozess. +- _Welche Tools werden für die Lokalisierung verwendet?_ + - Die Antwort auf diese Frage bestimmt, wie Sie alles andere angehen. Die Auswahl des richtigen Tools kann Ihnen helfen, das Content Management, die Verwaltung des Translation Memory und des Glossars, die Verwaltung der Übersetzer, die Verfolgung des Übersetzungs-/Überprüfungsfortschritts usw. zu automatisieren. Nehmen Sie sich also etwas Zeit und recherchieren Sie, welches Tool Sie verwenden möchten. Wenn Sie kein Lokalisierungstool verwenden möchten, muss alles oben Genannte manuell erledigt werden. +- _Wie lange wird der Übersetzungsprozess dauern?_ Wie viel wird es kosten?_ + - An diesem Punkt sollten Sie bereit sein, die Quelldateien mit dem Sprachdienstleister oder dem Pool von Übersetzern zu teilen. Der Sprachdienstleister kann Ihnen bei der Analyse der Wortzahl helfen und ein Angebot erstellen, das die Tarife und den Zeitplan für den Übersetzungsprozess enthält. +- _Planen Sie, während dieses Prozesses Änderungen/Aktualisierungen am Quellinhalt vorzunehmen?_ + - Wenn Ihr Inhalt dynamisch ist und sich häufig ändert, können alle Änderungen oder Aktualisierungen den Übersetzungsfortschritt stören. Die Verwendung eines Translation Memory kann dies erheblich mildern, obwohl es immer noch wichtig ist, darüber nachzudenken, wie der Prozess ablaufen wird und wie Sie verhindern können, dass der Fortschritt der Übersetzer zurückgesetzt wird. + +3. **Verwaltung des Übersetzungsprozesses** – Ihre Arbeit ist nicht erledigt, sobald der Quellinhalt an den Sprachdienstleister oder die Übersetzer übergeben wurde. Um eine optimale Qualität der Übersetzungen zu gewährleisten, sollten die Ersteller von Inhalten so weit wie möglich in den Übersetzungsprozess einbezogen werden. + +- _Wie planen Sie die Kommunikation mit den Übersetzern?_ + - Wenn Sie ein Lokalisierungstool verwenden möchten, kann die Kommunikation direkt im Tool erfolgen. Es wird auch empfohlen, einen alternativen Kommunikationskanal mit den Übersetzern einzurichten, da diese möglicherweise weniger zögerlich sind, Kontakt aufzunehmen, und Messaging-Tools eine freiere Kommunikation ermöglichen. +- _Wie gehe ich mit Fragen von Übersetzern um?_ Wer sollte diese Fragen beantworten?_ + - Übersetzer (sowohl professionelle als auch nicht-professionelle) werden sich oft mit Fragen und Bitten um Klärung oder zusätzlichen Kontext sowie mit Feedback und Verbesserungsvorschlägen melden. Die Beantwortung dieser Anfragen kann oft zu einem besseren Engagement und einer besseren Qualität der übersetzten Inhalte führen. Es ist auch wertvoll, ihnen so viele Ressourcen wie möglich zur Verfügung zu stellen (z. B. Leitfäden, Tipps, Terminologierichtlinien, FAQs usw.). +- _Wie soll der Überprüfungsprozess gehandhabt werden?_ Möchten Sie es auslagern oder haben Sie die Kapazität, Überprüfungen intern durchzuführen?_ + - Obwohl nicht immer notwendig, sind Überprüfungen ein integraler Bestandteil eines optimalen Übersetzungsprozesses. In der Regel ist es am einfachsten, den Überprüfungsprozess an professionelle Prüfer auszulagern. Wenn Sie jedoch ein großes internationales Team haben, können die Überprüfungen oder die Qualitätssicherung auch intern durchgeführt werden. + +4. **Implementierung der übersetzten Inhalte** – Der letzte Teil des Workflows, aber dennoch wichtig, um ihn im Voraus zu berücksichtigen. + +- _Werden alle Übersetzungen gleichzeitig fertiggestellt?_ + - Wenn nicht, sollten Sie darüber nachdenken, welche Übersetzungen priorisiert werden sollen, wie der Fortschritt der Übersetzungen verfolgt werden soll und wie die Implementierung gehandhabt wird, während die Übersetzungen erstellt werden. +- _Wie wird der übersetzte Inhalt an Sie geliefert?_ In welchem Format wird er sein?_ + - Dies ist eine wichtige Überlegung, unabhängig davon, welchen Ansatz Sie verwenden. Lokalisierungstools ermöglichen es Ihnen, die Kontrolle über das Zieldateiformat und den Exportprozess zu behalten und unterstützen in der Regel die Automatisierung, z. B. durch die Integration mit dem Hosting-Dienst. +- _Wie werden Sie die Übersetzungen in Ihr Projekt implementieren?_ + - In einigen Fällen kann dies so einfach sein wie das Hochladen der übersetzten Datei oder das Hinzufügen zu Ihren Dokumenten. Bei komplexeren Projekten wie Website- oder App-Übersetzungen sollten Sie jedoch sicherstellen, dass der Code die Internationalisierung unterstützt, und im Voraus festlegen, wie der Implementierungsprozess gehandhabt wird. +- _Was passiert, wenn die Formatierung von der Quelle abweicht?_ + - Ähnlich wie oben, wenn Sie einfache Textdateien übersetzen, ist die Formatierung wahrscheinlich nicht entscheidend wichtig. Bei komplexeren Dateien, wie Inhalten für eine Website oder Anwendung, müssen die Formatierung und der Code jedoch mit der Quelle identisch sein, um in Ihrem Projekt implementiert werden zu können. Wenn nicht, müssen die Zieldateien entweder von den Übersetzern oder Ihren Entwicklern bearbeitet werden. + +**Bedeutung 2** + +Ein alternativer Übersetzungs-Workflow, der interne Entscheidungen und Ansätze nicht berücksichtigt. Die Hauptüberlegung hier ist der Fluss des Inhalts selbst. + +Ein Beispiel-Workflow wäre in diesem Fall: + +1. _Übersetzung → Implementierung_ + +- Der einfachste Workflow, bei dem die Übersetzung wahrscheinlich eine menschliche Übersetzung sein wird, da es keinen Überprüfungs- oder QS-Prozess gibt, um die Qualität zu bewerten und die Übersetzungen vor der Implementierung zu bearbeiten. +- Bei diesem Workflow ist es wichtig, dass die Übersetzer ein gewisses Qualitätsniveau aufrechterhalten können, was entsprechende Ressourcen und Kommunikation zwischen den Projektmanagern und Übersetzern erfordert. + +2. _Übersetzung → Überprüfung → Implementierung_ + +- Ein fortgeschrittenerer Workflow, der einen Überprüfungs- und Bearbeitungsprozess umfasst, um sicherzustellen, dass die Qualität der Übersetzungen akzeptabel und konsistent ist. +- Es gibt eine Reihe von Ansätzen für diesen Workflow, bei denen die Übersetzungen von professionellen Übersetzern oder Freiwilligen durchgeführt werden könnten, während der Überprüfungsprozess wahrscheinlich von professionellen Prüfern durchgeführt wird, die mit allen Grammatik- und Rechtschreibregeln vertraut sind, die in der Zielsprache beachtet werden müssen. + +3. _Übersetzung → Überprüfung → QA → Implementierung_ + +- Der optimale Workflow zur Sicherstellung des höchsten Qualitätsniveaus. Obwohl eine QS nicht immer notwendig ist, kann sie nützlich sein, um Ihnen nach der Übersetzung und Überprüfung ein besseres Gefühl für die Qualität des übersetzten Textes zu geben. +- Mit diesem Workflow könnten Übersetzungen ausschließlich von Freiwilligen oder sogar maschinell durchgeführt werden. Der Überprüfungsprozess sollte von professionellen Übersetzern durchgeführt werden, während die Qualitätssicherung von einem Sprachdienstleister oder intern durchgeführt werden kann, wenn Sie Mitarbeiter haben, die Muttersprachler der Zielsprachen sind. + +Lesen Sie mehr über Übersetzungs-Workflows: + +[Inhaltsregeln zu den fünf Phasen des Übersetzungs-Workflows](https://contentrules.com/creating-translation-workflow/) + +[Smartling über das Management von Übersetzungs-Workflows](https://www.smartling.com/resources/101/what-is-translation-workflow-management/) + +[RixTrans zum Thema Übersetzungs-Workflow](https://www.rixtrans.com/translation-workflow) + +## Terminologiemanagement {#terminology-management} + +Die Festlegung eines klaren Plans für den Umgang mit Terminologie ist einer der wichtigsten Schritte, um die Qualität und Konsistenz Ihrer Übersetzungen zu gewährleisten und Ihren Übersetzern Zeit zu sparen. + +Im Übersetzungsbereich wird dies als Terminologiemanagement bezeichnet und ist einer der wichtigsten Dienste, die Sprachdienstleister ihren Kunden neben dem Zugang zu ihrem Pool von Linguisten und dem Content-Management anbieten. + +Terminologiemanagement bezieht sich auf den Prozess der Identifizierung, Erfassung und Verwaltung von Terminologie, die für Ihr Projekt wichtig ist und immer korrekt und konsistent übersetzt werden sollte. + +Es gibt ein paar Schritte zu beachten, wenn man beginnt, über Terminologiemanagement nachzudenken: + +- Identifizieren Sie Schlüsselbegriffe, die in die Terminologiedatenbank aufgenommen werden sollen. +- Erstellen Sie ein Glossar mit Begriffen und deren Definitionen. +- Übersetzen Sie die Begriffe und fügen Sie sie dem Glossar hinzu. +- Überprüfen und genehmigen Sie die Übersetzungen. +- Pflegen Sie das Glossar und aktualisieren Sie es mit neuen Begriffen, sobald diese wichtig werden. + +Lesen Sie mehr über Terminologiemanagement: + +[Trados zum Thema Terminologiemanagement](https://www.trados.com/solutions/terminology-management/translation-101-what-is-terminology-management.html) + +[Language Scientific darüber, warum Terminologiemanagement wichtig ist](https://www.languagescientific.com/terminology-management-why-it-matters/#:~:text=Terminology%20management%20is%20the%20process,are%20related%20to%20each%20other.) + +[Clear Words Translation darüber, was Terminologiemanagement ist und warum es wichtig ist](http://clearwordstranslations.com/language/en/what-is-terminology-management/) + +### Translation Memory und Glossar {#tm-and-glossary} + +Das Translation Memory und das Glossar sind wichtige Werkzeuge in der Übersetzungsbranche und etwas, auf das sich die meisten Sprachdienstleister verlassen. + +Lassen Sie uns einen Blick darauf werfen, was diese Begriffe bedeuten und wie sie sich voneinander unterscheiden: + +**Translation Memory (TM)** – Eine Datenbank, die automatisch Segmente oder Zeichenketten speichert, einschließlich längerer Textblöcke, vollständiger Sätze, Absätze und einzelner Begriffe, sowie deren aktuelle und frühere Übersetzungen in jeder Sprache. + +Die meisten Lokalisierungstools, Übersetzungsmanagementsysteme und computergestützte Übersetzungstools verfügen über integrierte Translation Memories, die in der Regel auch exportiert und in anderen ähnlichen Tools verwendet werden können. + +Die Vorteile der Verwendung eines Translation Memory umfassen schnellere Übersetzungen, eine bessere Übersetzungsqualität, die Fähigkeit, bestimmte Übersetzungen bei der Aktualisierung oder Änderung von Quellinhalten beizubehalten, und geringere Übersetzungskosten für sich wiederholende Inhalte. + +Translation Memories arbeiten auf der Grundlage einer prozentualen Übereinstimmung zwischen verschiedenen Segmenten und sind in der Regel am nützlichsten, wenn zwei Segmente über 50 % des gleichen Inhalts enthalten. Sie werden auch verwendet, um sich wiederholende Segmente, die zu 100 % übereinstimmen, automatisch zu übersetzen, wodurch die Notwendigkeit entfällt, sich wiederholende Inhalte jemals mehr als einmal zu übersetzen. + +Lesen Sie mehr über Translation Memories: + +[Memsource über Translation Memories](https://www.memsource.com/translation-memory/) + +[Smartling darüber, was ein Translation Memory ist](https://www.smartling.com/resources/101/what-is-translation-memory/) + +**Glossar –** Eine Liste wichtiger oder sensibler Begriffe, ihrer Definitionen, Funktionen und etablierten Übersetzungen. Der Hauptunterschied zwischen einem Glossar und einem Translation Memory besteht darin, dass ein Glossar nicht automatisch erstellt wird und keine Übersetzungen ganzer Sätze enthält. + +Die meisten Lokalisierungstools, Übersetzungsmanagementsysteme und computergestützte Übersetzungstools verfügen über integrierte Glossare, die Sie pflegen können, um sicherzustellen, dass sie für Ihr Projekt wichtige Terminologie enthalten. Wie das TM kann auch das Glossar in der Regel exportiert und in anderen Lokalisierungstools verwendet werden. + +Bevor Sie Ihr Übersetzungsprojekt beginnen, wird dringend empfohlen, sich etwas Zeit zu nehmen und ein Glossar für Ihre Übersetzer und Prüfer zu erstellen. Die Verwendung eines Glossars stellt sicher, dass wichtige Begriffe korrekt übersetzt werden, liefert Übersetzern den dringend benötigten Kontext und garantiert die Konsistenz der Übersetzungen. + +Obwohl Glossare meist etablierte Übersetzungen in den Zielsprachen enthalten, sind sie auch ohne diese nützlich. Auch ohne etablierte Übersetzungen kann ein Glossar Definitionen von Fachbegriffen enthalten, Begriffe hervorheben, die nicht übersetzt werden sollten, und Übersetzer darüber informieren, ob ein bestimmter Begriff als Substantiv, Verb, Eigenname oder ein anderer Wortart verwendet wird. + +Lesen Sie mehr über Glossare: + +[Lionbridge darüber, was ein Übersetzungsgloassar ist](http://info.lionbridge.com/rs/lionbridge/images/Lionbridge%20FAQ_Glossary_2013.pdf) + +[Transifex über Glossare](https://docs.transifex.com/glossary/glossary) + +Wenn Sie kein Lokalisierungstool für Ihr Projekt verwenden möchten, können Sie wahrscheinlich kein Translation Memory und kein Glossar verwenden (Sie könnten ein Glossar oder eine Terminologiedatenbank in einer Excel-Datei erstellen, jedoch entfällt bei automatisierten Glossaren die Notwendigkeit für Übersetzer, manuell nach Begriffen und deren Definitionen zu suchen). + +Dies bedeutet, dass alle sich wiederholenden und ähnlichen Inhalte jedes Mal manuell übersetzt werden müssten. Darüber hinaus müssten sich die Übersetzer mit Fragen dazu melden, ob ein bestimmter Begriff übersetzt werden muss oder nicht, wie er im Text verwendet wird und ob ein Begriff bereits eine etablierte Übersetzung hat. + +_Möchten Sie das Translation Memory und Glossar von ethereum.org in Ihrem Projekt verwenden?_ Kontaktieren Sie uns unter translations@ethereum.org._ + +## Kontaktaufnahme mit Übersetzern {#translator-outreach} + +**Zusammenarbeit mit einem Sprachdienstleister** + +Wenn Sie mit einem Sprachdienstleister und dessen professionellen Übersetzern zusammenarbeiten, ist dieser Abschnitt für Sie möglicherweise nicht allzu relevant. + +In diesem Fall ist es wichtig, einen Sprachdienstleister mit der Kapazität auszuwählen, alle von Ihnen benötigten Dienstleistungen (z. B. Übersetzung, Überprüfung, QS) in vielen Sprachen anzubieten. + +Obwohl es verlockend sein mag, einen Sprachdienstleister ausschließlich auf der Grundlage seiner angebotenen Tarife auszuwählen, ist es wichtig zu beachten, dass die größten Sprachdienstleister aus gutem Grund höhere Tarife haben. + +- Sie verfügen über Zehntausende von Linguisten in ihrer Datenbank, was bedeutet, dass sie Ihrem Projekt Übersetzer mit ausreichender Erfahrung und Kenntnis Ihrer speziellen Branche (d. h. Fachübersetzer) zuweisen können. +- Sie haben bedeutende Erfahrung in der Arbeit an verschiedenen Projekten und bei der Erfüllung der vielfältigen Bedürfnisse ihrer Kunden. Das bedeutet, dass sie sich eher an Ihren speziellen Workflow anpassen, wertvolle Vorschläge und potenzielle Verbesserungen für Ihren Übersetzungsprozess anbieten und Ihre Bedürfnisse, Anforderungen und Fristen erfüllen werden. +- Die meisten der größten Sprachdienstleister haben auch ihre eigenen Lokalisierungstools, Translation Memories und Glossare, die Sie verwenden können. Wenn nicht, haben sie zumindest genügend Linguisten in ihrem Pool, um sicherzustellen, dass ihre Übersetzer mit jedem Lokalisierungstool, das Sie verwenden möchten, vertraut sind und damit arbeiten können. + +Einen detaillierten Vergleich der größten Sprachdienstleister der Welt, einige Details zu jedem von ihnen und Aufschlüsselungen nach den von ihnen angebotenen Dienstleistungen, geografischen Daten usw. finden Sie im [Nimdzi 100-Bericht 2021](https://www.nimdzi.com/nimdzi-100-top-lsp/). + +**Zusammenarbeit mit nicht-professionellen Übersetzern** + +Möglicherweise arbeiten Sie mit nicht-professionellen Übersetzern und suchen Freiwillige, die Ihnen bei der Übersetzung helfen. + +Es gibt verschiedene Möglichkeiten, Menschen zu erreichen und sie einzuladen, an Ihrem Projekt teilzunehmen. Dies hängt weitgehend von Ihrem Produkt ab und davon, wie groß Ihre Community bereits ist. + +Einige Möglichkeiten, Freiwillige einzubinden, werden im Folgenden beschrieben: + +**Kontaktaufnahme –** Obwohl dies in den folgenden Punkten etwas abgedeckt wird, kann die Kontaktaufnahme mit potenziellen Freiwilligen und die Sicherstellung, dass sie sich Ihrer Übersetzungsinitiative bewusst sind, an sich schon wirksam sein. + +Viele Leute möchten sich engagieren und zu ihren Lieblingsprojekten beitragen, sehen aber oft keine klare Möglichkeit, dies zu tun, ohne Entwickler zu sein oder spezielle technische Fähigkeiten zu haben. Wenn Sie das Bewusstsein für Ihr Projekt schärfen können, werden wahrscheinlich viele Zweisprachige daran interessiert sein, sich zu beteiligen. + +**Ein Blick in Ihre Community –** Die meisten Projekte in diesem Bereich haben bereits große und aktive Communities. Viele Ihrer Community-Mitglieder würden wahrscheinlich die Chance schätzen, auf einfache Weise zum Projekt beizutragen. + +Während die Mitarbeit an Open-Source-Projekten oft auf intrinsischer Motivation beruht, ist sie auch eine fantastische Lernerfahrung. Jeder, der daran interessiert ist, mehr über Ihr Projekt zu erfahren, würde sich wahrscheinlich gerne als Freiwilliger an einem Übersetzungsprogramm beteiligen, da er so die Tatsache, dass er zu etwas beigetragen hat, das ihm am Herzen liegt, mit einer intensiven praktischen Lernerfahrung verbinden kann. + +**Erwähnung der Initiative in Ihrem Produkt –** Wenn Ihr Produkt beliebt ist und von einer großen Anzahl von Menschen genutzt wird, kann es äußerst effektiv sein, Ihr Übersetzungsprogramm hervorzuheben und die Benutzer während der Nutzung des Produkts zum Handeln aufzufordern. + +Dies könnte so einfach sein wie das Hinzufügen eines Banners oder Pop-ups mit einem CTA zu Ihrem Produkt für Anwendungen und Websites. Dies ist effektiv, weil Ihre Zielgruppe Ihre Community ist – die Leute, die am ehesten überhaupt mitmachen. + +**Soziale Medien –** Soziale Medien können ein wirksames Mittel sein, um auf Ihr Übersetzungsprogramm aufmerksam zu machen und sowohl Ihre Community-Mitglieder als auch andere Personen zu erreichen, die noch keine Mitglieder Ihrer Community sind. + +Wenn Sie einen Discord-Server oder einen Telegram-Kanal haben, ist es einfach, diesen für die Kontaktaufnahme, die Kommunikation mit Ihren Übersetzern und die Anerkennung Ihrer Mitwirkenden zu nutzen. + +Plattformen wie X (früher Twitter) können auch hilfreich sein, um neue Community-Mitglieder zu gewinnen und Ihre Mitwirkenden öffentlich anzuerkennen. + +Die Linux Foundation hat einen umfassenden [Bericht zur FOSS-Mitwirkenden-Umfrage 2020](https://www.linuxfoundation.org/wp-content/uploads/2020FOSSContributorSurveyReport_121020.pdf) erstellt, der Open-Source-Mitwirkende und ihre Motivationen analysiert. + +## Fazit {#conclusion} + +Dieses Dokument enthält einige wichtige Überlegungen, die jedes Übersetzungsprogramm beachten sollte. Es ist keineswegs ein vollständiger Leitfaden, kann aber jedem ohne Erfahrung in der Übersetzungsbranche helfen, ein Übersetzungsprogramm für sein Projekt zu organisieren. + +Wenn Sie nach detaillierteren Anweisungen und Aufschlüsselungen verschiedener Tools, Prozesse und kritischer Aspekte der Verwaltung eines Übersetzungsprogramms suchen, führen einige der größten Sprachdienstleister Blogs und veröffentlichen häufig Artikel zu verschiedenen Aspekten des Lokalisierungsprozesses. Dies sind die besten Ressourcen, wenn Sie tiefer in eines der oben genannten Themen eintauchen und verstehen möchten, wie der Lokalisierungsprozess professionell funktioniert. + +Einige relevante Links sind am Ende jedes Abschnitts enthalten; Sie können jedoch viele andere Ressourcen online finden. + +Für Kooperationsvorschläge oder zusätzliche Informationen, Erkenntnisse und bewährte Verfahren, die wir durch die Betreuung des Übersetzungsprogramms von ethereum.org gesammelt haben, können Sie uns gerne unter translations@ethereum.org kontaktieren. diff --git a/public/content/translations/de/contributing/translation-program/resources/index.md b/public/content/translations/de/contributing/translation-program/resources/index.md index 8931ba5e690..f04de0de2fa 100644 --- a/public/content/translations/de/contributing/translation-program/resources/index.md +++ b/public/content/translations/de/contributing/translation-program/resources/index.md @@ -8,37 +8,42 @@ description: Nützliche Ressourcen für ethereum.org-Übersetzer Nachfolgend finden Sie einige nützliche Anleitungen und Tools für ethereum.org-Übersetzer sowie Übersetzergemeinschaften und Updates. -## Leitfäden {#guides} +## Anleitungen {#guides} -- [Leitfaden für die Übersetzung](/contributing/translation-program/translators-guide/) _ – Anweisungen und Tipps für ethereum.org-Übersetzer_ -- [Übersetzungs-FAQs](/contributing/translation-program/faq/)_ – häufig gestellte Fragen und Antworten zum Übersetzungsprogramm von ethereum.org_ -- [Editorleitfaden für Crowdin-Online](https://support.crowdin.com/online-editor/)_ – ein ausführlicher Ratgeber für die Nutzung des Online-Crowdin-Editors und seiner umfangreichen Funktionen_ -- [Inhaltsbereich](/contributing/translation-program/content-buckets/)_ – welche Seiten gehören zu welchen Inhaltsbereichen von ethereum.org_ +- [Übersetzungsleitfaden](/contributing/translation-program/translators-guide/) _– Anleitungen und Tipps für ethereum.org-Übersetzer_ +- [Übersetzungs-FAQs](/contributing/translation-program/faq/) _– häufig gestellte Fragen und Antworten zum ethereum.org-Übersetzungsprogramm_ +- [Anleitung für den Crowdin-Online-Editor](https://support.crowdin.com/online-editor/) _– eine ausführliche Anleitung zur Verwendung des Crowdin-Online-Editors und einiger der erweiterten Funktionen von Crowdin_ -## Tools {#tools} +## Werkzeuge {#tools} -- [Linguee](https://www.linguee.com/) _ – Suchmaschine für Übersetzungen und ein Wörterbuch, in dem Sie nach Wörtern und auch nach Phrasen suchen können_ -- [Proz-Begriffssuche](https://www.proz.com/search/) _ – Datenbank für Übersetzungen, Wörterbücher und Glossare für Fachbegriffe_ -- [Eurotermbank](https://www.eurotermbank.com/) _ – Sammlungen von Terminologie zu europäischen Themen in 42 Sprachen_ +- [Linguee](https://www.linguee.com/) + _– Suchmaschine für Übersetzungen und Wörterbuch, mit der nach Wörtern oder Phrasen gesucht werden kann_ +- [Proz-Begriffssuche](https://www.proz.com/search/) + _– Datenbank mit Übersetzungswörterbüchern und Glossaren für Fachbegriffe_ +- [Eurotermbank](https://www.eurotermbank.com/) + _– Sammlungen europäischer Terminologie in 42 Sprachen_ -## Communities {#communities} +## Communitys {#communities} -- [Sprachenspezifische Discord-Übersetzungsgruppen](https://discord.gg/ethereum-org) _ – eine Initiative zur Verbindung von ethereum.org-Übersetzern mit Übersetzungsgruppen_ -- [Chinesische Übersetzergruppe](https://www.notion.so/Ethereum-org-05375fe0a94c4214acaf90f42ba40171) _ – Begriffsseite für die einfachere Koordination zwischen den chinesischen Übersetzern_ +- [Sprachspezifische Discord-Übersetzungsgruppen](https://discord.gg/ethereum-org) + _– eine Initiative, um ethereum.org-Übersetzer mit Übersetzungsgruppen zu verbinden_ +- [Gruppe für chinesische Übersetzer](https://www.notion.so/Ethereum-org-05375fe0a94c4214acaf90f42ba40171) + _– Notion-Seite für die einfachere Koordination zwischen den chinesischen Übersetzern_ -## Letzte Aktualisierungen {#latest-updates} +## Neueste Aktualisierungen {#latest-updates} -Damit Sie beim aktuellen Fortschritt des Übersetzungsprogramms auf dem Laufenden bleiben, folgen Sie dem [Ethereum Foundation-Blog](https://blog.ethereum.org/): +Um über die neuesten Fortschritte des Übersetzungsprogramms auf dem Laufenden zu bleiben, können Sie dem [Blog der Ethereum Foundation](https://blog.ethereum.org/) folgen: -- [Oktober 2021, Updates für Meilensteine](https://blog.ethereum.org/2021/10/04/translation-program-update/) -- [Dezember 2020, Updates für Meilensteine](https://blog.ethereum.org/2020/12/21/translation-program-milestones-updates-20/) -- [Juli 2020, Updates für Meilensteine](https://blog.ethereum.org/2020/07/29/ethdotorg-translation-milestone/) -- [August 2019, Start des Übersetzungsprogramms](https://blog.ethereum.org/2019/08/20/translating-ethereum-for-our-global-community/) +- [Meilenstein-Aktualisierung Oktober 2021](https://blog.ethereum.org/2021/10/04/translation-program-update/) +- [Meilenstein-Aktualisierung Dezember 2020](https://blog.ethereum.org/2020/12/21/translation-program-milestones-updates-20/) +- [Meilenstein-Aktualisierung Juli 2020](https://blog.ethereum.org/2020/07/29/ethdotorg-translation-milestone/) +- [Start des Übersetzungsprogramms im August 2019](https://blog.ethereum.org/2019/08/20/translating-ethereum-for-our-global-community/) -## Sprechstunde für Übersetzerinnen und Übersetzer {#office-hours} +## Sprechstunden für Übersetzende {#office-hours} -Jeden zweiten Mittwoch im Monat haben wir Sprechstunde für Übersetzer. Diese finden im Sprachkanal #office-hours auf dem [ethereum.org-Discord](https://discord.gg/ethereum-org) statt, wo Sie auch die genauen Zeiten und weitere Details finden. +Jeden zweiten Mittwoch im Monat haben wir Sprechstunde für Übersetzer. Diese finden im Sprachkanal #office-hours auf dem [ethereum.org-Discord](https://discord.gg/ethereum-org) statt, wo Sie auch die genauen Zeiten und weiteren Details finden. -Während der Geschäftszeiten haben unsere Übersetzer die Möglichkeit, Fragen zum Übersetzungsprozess zu stellen, Feedback zum Programm zu geben, ihre Ideen mitzuteilen oder einfach mit dem ethereum.org-Kernteam zu plaudern. Schließlich wollen wir diese Zusammentreffen nutzen, um die neuesten Entwicklungen im Übersetzungsprogramm mitzuteilen und wichtige Tipps und Anleitungen an unsere Mitwirkenden weiterzugeben. +Während der Geschäftszeiten haben unsere Übersetzer die Möglichkeit, Fragen zum Übersetzungsprozess zu stellen, Feedback zum Programm zu geben, ihre Ideen mitzuteilen oder einfach mit dem ethereum.org-Kernteam zu plaudern. +Schließlich wollen wir diese Zusammentreffen nutzen, um die neuesten Entwicklungen im Übersetzungsprogramm mitzuteilen und wichtige Tipps und Anleitungen an unsere Mitwirkenden weiterzugeben. Wenn Sie ethereum.org-Übersetzerin und -Übersetzer sind oder werden möchten, können Sie gerne an einer dieser Sitzungen teilnehmen. diff --git a/public/content/translations/de/contributing/translation-program/translatathon/details/index.md b/public/content/translations/de/contributing/translation-program/translatathon/details/index.md new file mode 100644 index 00000000000..fd3c1d45b07 --- /dev/null +++ b/public/content/translations/de/contributing/translation-program/translatathon/details/index.md @@ -0,0 +1,90 @@ +--- +title: Details und Regeln +lang: de +template: Übersetzungsmarathon +--- + +![](./participate.png) + +Der Translatathon ist offen und jeder kann durch Ausfüllen des Bewerbungsformulars und Beitreten des Projekts in Crowdin teilnehmen. + +Übersetzer sammeln Punkte, indem sie während des Übersetzungszeitraums im Crowdin-Editor Übersetzungsvorschläge für unübersetzte Zeichenketten in ihrer Sprache machen. + +Die Endpunktzahl jedes Teilnehmers wird durch seine Position auf der Rangliste bestimmt, die auf der Anzahl der während des Übersetzungszeitraums übersetzten Wörter und eventuell gesammelten Bonuspunkten basiert. + +## Erste Schritte {#getting-started} + +Der Übersetzungsprozess findet im ethereum.org-Projekt in Crowdin statt. Übersetzer schlagen ihre Übersetzungen für unübersetzte Zeichenketten vor, die fast den gesamten Inhalt der ethereum.org-Website ausmachen. + +Übersetzungen werden direkt im Online-Editor vorgeschlagen, sodass keine Dateien oder Arbeitsergebnisse herunter- oder hochgeladen werden müssen. Jedes übersetzte Wort wird nachverfolgt und gezählt. + +**1) Dem Projekt beitreten** + +- Um mit dem Beitragen zu beginnen, treten Sie dem [ethereum.org-Projekt in Crowdin](https://crowdin.com/project/ethereum-org) bei. +- Sie müssen sich anmelden oder ein Konto erstellen – alles, was Sie dazu benötigen, ist eine E-Mail-Adresse und ein Passwort. + +**2) Wählen Sie Ihre Sprache** + +- Suchen Sie Ihre Sprache in der Liste der Zielsprachen und öffnen Sie sie, indem Sie auf den Namen oder die Flagge klicken. +- Wenn Sie in eine Sprache übersetzen möchten, die nicht verfügbar ist, wenden Sie sich an das [Ethereum.org Team](https://crowdin.com/profile/ethdotorg) auf Crowdin oder senden Sie uns eine E-Mail an translations@ethereum.org und wir werden auf Anfrage weitere Zielsprachen hinzufügen. + +**3) Eine unübersetzte Datei öffnen** + +- Suchen Sie die erste unübersetzte Datei, um mit dem Übersetzen zu beginnen. Die Ordner mit den Quelldateien sind nach Priorität geordnet. Sie sollten also mit der Übersetzung des ersten Ordners beginnen, der unübersetzte Dateien enthält. +- Jede Datei hat eine Fortschrittsanzeige, die anzeigt, wie viel des übersetzbaren Inhalts in der Datei übersetzt und genehmigt wurde … Wenn der Übersetzungsfortschritt einer Datei unter 100 % liegt, übersetzen Sie sie bitte. + +**4) Die unübersetzten Zeichenketten übersetzen** + +- Wenn Sie eine Datei zum Übersetzen öffnen, stellen Sie sicher, dass Sie nur unübersetzte Zeichenketten übersetzen! +- Jede Zeichenkette hat eine Statusanzeige, die anzeigt, ob sie _Übersetzt_, _Unübersetzt_ oder _Genehmigt_ ist. Wenn eine Quellzeichenkette bereits eine vorgeschlagene Übersetzung in Ihrer Sprache hat, muss sie nicht übersetzt werden. +- Sie können Zeichenketten im Editor auch filtern, um _Zuerst Unübersetzte_ oder _Nur Unübersetzte_ anzuzeigen. + +Für eine detaillierte Anleitung zur Navigation und Nutzung des Crowdin-Editors empfehlen wir allen Translatathon-Teilnehmern, unsere Anleitung [Wie man übersetzt](/contributing/translation-program/how-to-translate/) zu lesen. + +Tipps und bewährte Vorgehensweisen finden Sie auch in unserem [Styleguide für Übersetzungen](/contributing/translation-program/translators-guide/). + +**Wie Punkte funktionieren** + +Jeder Translatathon-Teilnehmer sammelt Punkte für seine Endpunktzahl, indem er Inhalte im ethereum.org Crowdin-Projekt und anderen teilnahmeberechtigten Projekten übersetzt (die vollständige Liste der teilnahmeberechtigten Projekte finden Sie unten). + +Die Punktevergabe ist einfach: **1 übersetztes Wort = 1 Punkt** + +Um Ihre endgültige Punktzahl zu erhalten, müssen Ihre vorgeschlagenen Übersetzungen den Bewertungsprozess bestehen, bei dem professionelle Prüfer die Übersetzungen jedes Teilnehmers überprüfen, um sicherzustellen, dass sie die Mindestqualitätsschwelle erfüllen und keine maschinellen oder KI-Übersetzungen verwendet wurden. + +## Inhalte des Ökosystems {#ecosystem-content} + +Da das Übersetzungsprogramm von ethereum.org ständig aktiv ist, ist der Übersetzungsfortschritt in einigen Zielsprachen auf der Website deutlich höher als in anderen. + +Um sicherzustellen, dass alle Translatathon-Teilnehmer die gleiche Chance haben, so viele Inhalte wie möglich zu übersetzen und um die Hauptpreise zu konkurrieren, ist der Quellinhalt, der Teil des Translatathons ist, nicht nur auf den Inhalt der ethereum.org-Website beschränkt. + +Teilnehmer, die eines der teilnahmeberechtigten Projekte übersetzen, erhalten die gleiche Anzahl an Punkten, 1 übersetztes Wort in einem beliebigen Projekt = 1 Punkt. + +Hier ist eine Liste aller teilnahmeberechtigten Projekte, die Teil des Translatathon 2025 sind: + +- [Ethereum.org](https://crowdin.com/project/ethereum-org) + +- [Ethereum.org-Entwicklertutorials](https://crowdin.com/project/33388446abbe9d7aa21e42e49bba7f97) + +- [EthStaker Deposit-CLI](https://crowdin.com/project/ethstaker-deposit-cli) + +- [Eth Docker-Dokumentation](https://crowdin.com/project/eth-docker-docs) + +- [Remix-IDE-Dokumentation](https://crowdin.com/project/remix-translation) + +- [Remix LearnEth](https://crowdin.com/project/remix-learneth) + +- [web3.py](https://crowdin.com/project/web3py) + +## Bewertungsprozess {#evaluation-process} + +Alle Übersetzungen unterliegen der Qualitätssicherung und dem Feedback, wobei professionelle Linguisten die Einreichungen auf Qualität und Genauigkeit bewerten. + +Wir werden auch **Maßnahmen gegen maschinelle Übersetzung** ergreifen und dabei einige Werkzeuge verwenden, die maschinelle oder KI-Übersetzungen automatisch erkennen. + +Obwohl die Übersetzungsqualität keine entscheidende Rolle bei der Punktevergabe spielt, sind **Teilnehmer, bei denen die Verwendung von maschinellen oder KI-Übersetzungen festgestellt wird** oder die minderwertige und ungenaue Übersetzungen vorschlagen, nicht für Preise berechtigt! + +Der Bewertungszeitraum läuft den ganzen September über, und die Ergebnisse werden im Community-Call von ethereum.org am 25. September bekannt gegeben. + +Alle Übersetzungen werden ebenfalls vollständig überprüft, bevor sie auf der Website hinzugefügt werden. + + diff --git a/public/content/translations/de/contributing/translation-program/translatathon/index.md b/public/content/translations/de/contributing/translation-program/translatathon/index.md new file mode 100644 index 00000000000..a04a929237a --- /dev/null +++ b/public/content/translations/de/contributing/translation-program/translatathon/index.md @@ -0,0 +1,100 @@ +--- +title: 2025 ethereum.org Translatathon +lang: de +template: Translatathon +--- + + + + + + + +## Einführung {#introduction} + +Wir sind davon überzeugt, dass Ethereum-Inhalte und Onboarding-Ressourcen für alle zugänglich sein sollten, unabhängig von der Sprache, die sie sprechen. +Um diesem Ziel näher zu kommen, ist das Übersetzungsprogramm von ethereum.org eine Initiative, um die Webseite in so viele Sprachen wie möglich zu übersetzen. + +Als Teil des Übersetzungsprogramms organisieren wir die 3. Ausgabe des Translatathon, unseres Übersetzungswettbewerbs, der darauf abzielt, Anreize für Übersetzungsbeiträge in weniger aktiven Sprachen zu schaffen, die Anzahl der Sprachen und den Umfang der auf der Seite verfügbaren Inhalte zu erhöhen, neue Mitwirkende zu gewinnen und unsere bestehenden zu belohnen. + +Wenn Sie Muttersprachler einer anderen Sprache als Englisch sind und helfen möchten, Ethereum-Inhalte zugänglicher zu machen, während Sie um Preise wetteifern, lesen Sie weiter, um mehr zu erfahren! + +[Erfahren Sie mehr über das Übersetzungsprogramm von ethereum.org](/contributing/translation-program/) + +## Zeitplan {#timeline} + +Hier sind die wichtigen Daten für den Translatathon 2025: + + + + + +## Mitmachen {#participate} + +![Bild von Community und Globus](./participate.png) + + + +

Wer kann teilnehmen?

+ Jede Person, die älter als 18 Jahre ist, mindestens eine andere Sprache als Englisch als Muttersprache spricht und über gute Englischkenntnisse verfügt. +
+ +

Muss ich ein Übersetzer sein?

+ Nein. Sie müssen lediglich zweisprachig sein und menschliche Übersetzungen vorschlagen (die Verwendung von maschineller Übersetzung ist verboten!) nach bestem Wissen und Gewissen, keine Berufserfahrung erforderlich. +
+
+ + + +

Wie viel Zeit muss ich investieren?

+ So viel Sie möchten. Die Mindestschwelle, um für Preise in Frage zu kommen, liegt bei 1.000 übersetzten Wörtern, was etwa 2 Stunden in Anspruch nehmen sollte, während der Wettbewerb um die Hauptpreise einen größeren Zeitaufwand erfordert. +
+ +

Muss ich mit Ethereum vertraut sein?

+ Nein. Obwohl es für Ihre Produktivität und Qualität hilfreich sein kann, mit Ethereum vertraut zu sein, ist der Translatathon auch eine Lernerfahrung, und jeder ist eingeladen, mitzumachen und während der Teilnahme mehr über Ethereum zu lernen. +
+
+ +Weitere Einzelheiten finden Sie in den [vollständigen Teilnahmebedingungen](/contributing/translation-program/translatathon/terms-and-conditions) + +### Schritt-für-Schritt-Anleitung {#step-by-step-instructions} + + + +## Preise {#prizes} + +| Platzierung | Preisgeld | +| -------------------------------------------------------- | --------- | +| 1. Platz | $4000 | +| 2. Platz | $2500 | +| 3. Platz | $1500 | +| 4. Platz | $1100 | +| 5. Platz | $1000 | +| 6. Platz | $600 | +| 7. Platz | $550 | +| 8. Platz | $500 | +| 9. Platz | $450 | +| 10. Platz | $400 | +| 11. - 20. Platz | $240 | +| 21. - 50. Platz | $120 | +| 51. - 100. Platz | $60 | +| 101. - 150. Platz | $40 | +| Rest | $20 | + +Alle Preise werden in ETH ausgezahlt. + + + + diff --git a/public/content/translations/de/contributing/translation-program/translators-guide/index.md b/public/content/translations/de/contributing/translation-program/translators-guide/index.md index 718e6300c14..4ee9f2a3c2a 100644 --- a/public/content/translations/de/contributing/translation-program/translators-guide/index.md +++ b/public/content/translations/de/contributing/translation-program/translators-guide/index.md @@ -4,21 +4,21 @@ lang: de description: Anweisungen und Tipps für ethereum.org-Übersetzer --- -# Übersetzungsleitfaden von ethereum.org {#style-guide} +# Ethereum.org Übersetzungsleitfaden {#style-guide} Der Übersetzungsleitfaden von ethereum.org enthält die wichtigsten Richtlinien, Anweisungen und Tipps für Übersetzer, die uns bei der Lokalisierung der Website helfen. Dieses Dokument dient als allgemeiner Leitfaden und ist nicht spezifisch für eine bestimmte Sprache. -Wenn Sie Fragen, Vorschläge oder Feedback haben, wenden Sie sich bitte an translations@ethereum.org, senden Sie eine Nachricht an @ethdotorg auf Crowdin oder treten Sie [unserem Discord](https://discord.gg/ethereum-org) bei. Dort können Sie uns im Kanal #translations eine Nachricht senden oder sich an eines der Teammitglieder wenden. +Wenn Sie Fragen, Vorschläge oder Feedback haben, erreichen Sie uns unter translations@ethereum.org, senden Sie eine Nachricht an @ethdotorg auf Crowdin oder [treten Sie unserem Discord bei](https://discord.gg/ethereum-org). Dort können Sie uns im Kanal #translations eine Nachricht senden oder sich an eines der Teammitglieder wenden. ## Crowdin verwenden {#using-crowdin} -Auf der Seite [Übersetzungsprogramm](/contributing/translation-program/#how-to-translate) finden Sie grundlegende Anweisungen, wie Sie dem Projekt in Crowdin beitreten und den Crowdin-Online-Editor verwenden können. +Grundlegende Anweisungen, wie Sie dem Projekt in Crowdin beitreten und wie Sie den Online-Editor von Crowdin verwenden, finden Sie auf der [Seite des Übersetzungsprogramms](/contributing/translation-program/#how-to-translate). -Wenn Sie mehr über Crowdin und die Nutzung der erweiterten Funktionen erfahren möchten, finden Sie in der [Crowdin-Wissensdatenbank](https://support.crowdin.com/online-editor/) viele ausführliche Anleitungen und eine Übersicht über alle Crowdin-Funktionen. +Wenn Sie mehr über Crowdin und die Nutzung einiger seiner erweiterten Funktionen erfahren möchten, enthält die [Crowdin-Wissensdatenbank](https://support.crowdin.com/online-editor/) viele ausführliche Anleitungen und Übersichten über alle Crowdin-Funktionen. -## Das Wesentliche der Botschaft erfassen {#capturing-the-essence} +## Die Essenz der Nachricht erfassen {#capturing-the-essence} Vermeiden Sie bei der Übersetzung von ethereum.org-Inhalten wörtliche Übersetzungen. @@ -42,7 +42,7 @@ Unser Ziel ist es, die Inhalte der Website für so viele Menschen wie möglich v In den meisten Fällen lässt sich das ganz einfach durch die Verwendung kurzer und einfacher Worte erreichen, die leicht verständlich sind. Wenn es für ein bestimmtes Wort in Ihrer Sprache mehrere mögliche Übersetzungen mit der gleichen Bedeutung gibt, ist die beste Option meist das kürzeste Wort, das die Bedeutung klar wiedergibt. -## Schreibsystem {#writing-system} +## Schriftsystem {#writing-system} Ethereum.org ist in einer Reihe von Sprachen verfügbar, die alternative Schriftsysteme (oder Schreibschriften) zum Lateinischen verwenden. @@ -50,17 +50,17 @@ Der gesamte Inhalt sollte unter Verwendung des korrekten Schriftsystems für Ihr Wenn Sie den Inhalt übersetzen, sollten Sie sicherstellen, dass die Übersetzungen einheitlich sind und keine lateinischen Zeichen enthalten. -Ein gängiger Irrtum ist, dass Ethereum immer in Latein geschrieben werden sollte. Das ist meistens falsch. Nutzen Sie die Schreibweise von Ethereum in Ihrer Muttersprache (z. B. 以太坊 in Chinesisch, إيثيريوم in Arabisch usw.). +Ein gängiger Irrtum ist, dass Ethereum immer in Latein geschrieben werden sollte. Dies ist meistens falsch. Bitte verwenden Sie die Schreibweise von Ethereum, die in Ihrer Sprache üblich ist (z. B. 以太坊 auf Chinesisch, إيثيريوم auf Arabisch usw.). **Die obigen Ausführungen gelten nicht für Sprachen, in denen Eigennamen in der Regel nicht übersetzt werden sollten.** -## Metadaten der Seite übersetzen {#translating-metadata} +## Übersetzen von Seitenmetadaten {#translating-metadata} Einige Seiten enthalten Metadaten wie "title", "lang", "description", "sidebar" usw. auf der Seite. Wir blenden beim Hochladen neuer Seiten in Crowdin die Inhalte aus, die Übersetzer nicht übersetzen sollen. Das bedeutet, dass alle Metadaten, die für Übersetzer in Crowdin sichtbar sind, auch übersetzt werden sollen. -Seien Sie besonders aufmerksam, wenn Sie eine Zeichenfolgen übersetzen, deren Ausgangstext mit 'en' gekennzeichnet ist. Das steht für die Sprache, in der die Seite verfügbar ist. Das sollte mit dem [ISO-Sprachcode für Ihre Sprache](https://www.andiamo.co.uk/resources/iso-language-codes/) übersetzt werden. Diese Zeichenfolgen sollten immer mit lateinischen Buchstaben übersetzt werden, nicht mit der Schreibschrift der Zielsprache. +Seien Sie besonders aufmerksam, wenn Sie eine Zeichenfolgen übersetzen, deren Ausgangstext mit 'en' gekennzeichnet ist. Dies repräsentiert die Sprache, in der die Seite verfügbar ist, und sollte in den [ISO-Sprachcode für Ihre Sprache](https://www.andiamo.co.uk/resources/iso-language-codes/) übersetzt werden. Diese Zeichenfolgen sollten immer mit lateinischen Buchstaben übersetzt werden, nicht mit der Schreibschrift der Zielsprache. Wenn Sie sich nicht sicher sind, welchen Sprachcode Sie verwenden sollten, können Sie das Translation Memory in Crowdin überprüfen oder den Sprachcode für Ihre Sprache auf der URL-Seite im Crowdin-Online-Editor finden. @@ -72,21 +72,24 @@ Einige Beispiele für Sprachcodes für die am weitesten verbreiteten Sprachen: - Hindi - hi - Spanisch - es -## Titel von externen Artikeln {#external-articles} +## Titel externer Artikel {#external-articles} Einige Strings enthalten Titel externer Artikel. Die meisten unserer Dokumentationsseiten für Entwickler enthalten Links zu externen Artikeln, um weiterführende Informationen zu bieten. Die Zeichenketten, die die Titel der Artikel enthalten, müssen unabhängig von der Sprache des Artikels übersetzt werden, um eine einheitliche Benutzererfahrung für die Besucher zu gewährleisten, die die Seite in ihrer Sprache ansehen. Im Folgenden finden Sie einige Beispiele dafür, wie diese Zeichenfolgen für Übersetzer aussehen und wie sie zu erkennen sind (Links zu den Artikeln finden Sie meist am Ende dieser Seiten im Abschnitt "Weiterführende Literatur"): -![Titel von Artikeln in sidebar.png](./article-titles-in-sidebar.png) ![Titel von Artikeln in editor.png](./article-titles-in-editor.png) +![Artikeltitel in der Seitenleiste.png](./article-titles-in-sidebar.png) +![Artikeltitel im Editor.png](./article-titles-in-editor.png) ## Crowdin-Warnungen {#crowdin-warnings} -Crowdin verfügt über eine eingebaute Funktion, die Übersetzer warnt, wenn sie im Begriff sind, einen Fehler zu machen. Crowdin warnt Sie automatisch, bevor Sie Ihre Übersetzung speichern, wenn Sie vergessen, ein Tag aus der Quelle einzubinden, Elemente übersetzen, die nicht übersetzt werden sollten, mehrere aufeinander folgende Leerzeichen hinzufügen, Ende-Satzzeichen vergessen usw. Wenn Sie eine solche Warnung sehen, gehen Sie zurück und überprüfen Sie die vorgeschlagene Übersetzung nochmals. +Crowdin verfügt über eine eingebaute Funktion, die Übersetzer warnt, wenn sie im Begriff sind, einen Fehler zu machen. Crowdin warnt Sie automatisch, bevor Sie Ihre Übersetzung speichern, wenn Sie vergessen, ein Tag aus der Quelle einzubinden, Elemente übersetzen, die nicht übersetzt werden sollten, mehrere aufeinander folgende Leerzeichen hinzufügen, Ende-Satzzeichen vergessen usw. +Wenn Sie eine solche Warnung sehen, gehen Sie zurück und überprüfen Sie die vorgeschlagene Übersetzung nochmals. **Ignorieren Sie diese Warnungen nicht, denn sie bedeuten in der Regel, dass etwas falsch ist oder dass in der Übersetzung ein wichtiger Teil des Ausgangstextes fehlt.** -Ein Beispiel für eine Crowdin-Warnung, wenn Sie vergessen, ein Tag zur Übersetzung hinzuzufügen: ![Beispiel für eine Crowdin-Warnung](./crowdin-warning-example.png) +Ein Beispiel für eine Crowdin-Warnung, wenn Sie vergessen, Ihrer Übersetzung ein Tag hinzuzufügen: +![Beispiel für eine Crowdin-Warnung](./crowdin-warning-example.png) ## Umgang mit Tags und Codeausschnitten {#dealing-with-tags} @@ -96,33 +99,36 @@ Ein großer Teil des Quellinhalts enthält Tags und Variablen, die im Crowdin-Ed Um die Verwaltung von Tags zu erleichtern und diese direkt aus der Quelle zu kopieren, empfehlen wir Ihnen, Ihre Einstellungen im Crowdin-Editor zu ändern. -1. Einstellungen öffnen ![Einstellungen im Editor öffnen](./editor-settings.png) +1. Einstellungen öffnen + ![So öffnen Sie die Einstellungen im Editor](./editor-settings.png) 2. Scrollen Sie nach unten zum Abschnitt „HTML-Tags Anzeige" -3. Wählen Sie „Verstecken" ![Bitte „Verstecken" auswählen](./hide-tags.png) +3. 'Ausblenden' auswählen + ![Bitte 'Ausblenden' auswählen](./hide-tags.png) 4. Klicken Sie auf „Speichern" -Durch Auswahl dieser Option wird der vollständige Tag-Text nicht mehr angezeigt und durch eine Zahl ersetzt. Beim Übersetzen wird der exakte Tag automatisch in das Übersetzungsfeld kopiert, wenn der Tag angeklickt wird. +Durch Auswahl dieser Option wird der vollständige Tag-Text nicht mehr angezeigt und durch eine Zahl ersetzt. +Beim Übersetzen wird der exakte Tag automatisch in das Übersetzungsfeld kopiert, wenn der Tag angeklickt wird. **Links** Sie finden möglicherweise vollständige Links zu Seiten auf ethereum.org oder anderen Websites. -Diese sollten mit der Quelle identisch sein und nicht verändert oder übersetzt werden. Wenn Sie einen Link übersetzen oder ihn in irgendeiner Weise verändern, selbst wenn Sie nur einen Teil davon entfernen, wie z. B. einen Schrägstrich (/), führt das zu fehlerhaften und unbrauchbaren Links. +Sie sollten mit der Quelle identisch sein und nicht verändert oder übersetzt werden. Wenn Sie einen Link übersetzen oder ihn in irgendeiner Weise verändern, selbst wenn Sie nur einen Teil davon entfernen, wie z. B. einen Schrägstrich (/), führt das zu fehlerhaften und unbrauchbaren Links. Am besten ist es, Links direkt aus der Quelle zu kopieren, entweder durch Anklicken oder mit der Schaltfläche „Copy Source" (Quelle kopieren) (Alt+C). ![Beispiel für einen Link.png](./example-of-link.png) -Links erscheinen im Quelltext auch in Form von Tags (z. B. \<0> \). Wenn Sie mit dem Mauszeiger über das Tag fahren, zeigt der Editor den vollständigen Inhalt an. Manchmal stellen diese Tags auch Links dar. +Links erscheinen im Quelltext auch in Form von Tags (d. h. `<0>` ``). Wenn Sie mit dem Mauszeiger über das Tag fahren, zeigt der Editor den vollständigen Inhalt an. Manchmal stellen diese Tags auch Links dar. Es ist sehr wichtig, die Links aus der Quelle zu kopieren und die Reihenfolge nicht zu verändern. Wird die Reihenfolge der Tags geändert, wird damit die Verbindung, die sie darstellen, aufgebrochen. -![Beispiel für Links in Tags.png](./example-of-links-inside-tags.png) +![Beispiel für Links innerhalb von Tags.png](./example-of-links-inside-tags.png) **Tags und Variablen** @@ -132,35 +138,35 @@ Tags enthalten immer einen öffnenden und einen schließenden Tag. In den meiste Beispiel: ``Dezentralisiert`` -`` - _Öffnender Tag, der eine Fettformatierung bedingt_ +`` - _Öffnender Tag, der den Text fett macht_ -Dezentralisiert – _Übersetzbarer Text_ +Dezentralisiert - _Übersetzbarer Text_ -`` – _Schließender Tag_ +`` - _Schließender Tag_ -![Beispiel für „starke" Tags.png](./example-of-strong-tags.png) +![Beispiel für 'strong'-Tags.png](./example-of-strong-tags.png) CodeAusschnitte sollten etwas anders behandelt werden als die anderen Tags, da sie Code enthalten, der nicht übersetzt werden sollte. -Beispiel: ``Nonce`` +Beispiel: ``nonce`` -`` – _Öffnender Tag, der einen Code-Ausschnitt enthält_ +`` - _Öffnender Tag, der einen Code-Ausschnitt enthält_ -Nonce – _Nicht übersetzbarer Text_ +nonce - _Nicht übersetzbarer Text_ -`` – _Schließender Tag_ +`` - _Schließender Tag_ -![Beispiel für Code-Ausschnitte.png](./example-of-code-snippets.png) +![Beispiel für Codeausschnitte.png](./example-of-code-snippets.png) Der Quelltext enthält auch verkürzte Tags, die nur Zahlen enthalten. Ihre Funktion ist dadurch nicht direkt ersichtlich. Sie können mit dem Mauszeiger über diese Tags fahren, um genau zu sehen, welche Funktion sie haben. -Im folgenden Beispiel können Sie sehen, dass der Mauszeiger über dem \<0> Tag zeigt, dass er `` darstellt und einen Code-Ausschnitt enthält. Daher sollte der Inhalt innerhalb dieser Tags nicht übersetzt werden. +Im Beispiel unten sehen Sie, dass das Tag `<0>` beim Darüberfahren anzeigt, dass es `` darstellt und einen Code-Ausschnitt enthält. Daher sollte der Inhalt innerhalb dieser Tags nicht übersetzt werden. ![Beispiel für mehrdeutige Tags.png](./example-of-ambiguous-tags.png) -## Kurze vs. vollständige Formulierungen/Abkürzungen {#short-vs-full-forms} +## Kurz- vs. Langformen/Abkürzungen {#short-vs-full-forms} -Auf der Website werden viele Abkürzungen verwendet, z. B. dApps, NFT, DAO, DeFi etc. Diese Abkürzungen werden im Englischen häufig verwendet und sind den meisten Besuchern der Website bekannt. +Auf der Website werden viele Abkürzungen verwendet, z. B. Dapps, NFT, DAO, DeFi usw. Diese Abkürzungen werden im Englischen häufig verwendet und sind den meisten Besuchern der Website bekannt. Da es für diese und ähnliche Begriffe in der Regel keine etablierten Übersetzungen in anderen Sprachen gibt, ist es am besten, eine beschreibende Übersetzung der vollständigen Form anzugeben und die englische Abkürzung in Klammern hinzuzufügen. @@ -168,11 +174,11 @@ Da es für diese und ähnliche Begriffe in der Regel keine etablierten Übersetz Beispiel für die Übersetzung von dApps: -- Dezentrale Anwendungen (dApps) → _Übersetzte Vollform (englische Abkürzung in Klammern)_ +- Dezentralisierte Anwendungen (Dapps) → _Übersetzte Vollform (englische Abkürzung in Klammern)_ ## Begriffe ohne etablierte Übersetzungen {#terms-without-established-translations} -Für einige Begriffe gibt es möglicherweise keine etablierten Übersetzungen in anderen Sprachen und sie sind weithin unter dem englischen Originalbegriff bekannt. Diese Begriffe umfassen meist neuere Konzepte wie Proof-of-Work, Proof-of-Stake, Beacon Chain, Staking usw. +Für einige Begriffe gibt es möglicherweise keine etablierten Übersetzungen in anderen Sprachen und sie sind weithin unter dem englischen Originalbegriff bekannt. Diese Begriffe umfassen meist neuere Konzepte wie Proof ofWork, Proof of Stake, Beacon Chain, Staking usw. Die Übersetzung dieser Begriffe kann zwar unnatürlich klingen, da aber die englische Version auch in anderen Sprachen häufig verwendet wird, ist es sehr empfehlenswert, sie zu übersetzen. @@ -180,17 +186,17 @@ Wenn Sie sie übersetzen, können Sie kreativ sein, beschreibende Übersetzungen **Es ist sinnvoll, die meisten Begriffe zu übersetzen, anstatt sie auf Englisch zu belassen, da diese neue Terminologie sich zukünftig stärker verbreitet, wenn mehr Menschen Ethereum und zugehörige Technologien nutzen. Wenn wir mehr Menschen aus der ganzen Welt für diesen Bereich gewinnen wollen, müssen wir eine verständliche Terminologie in so vielen Sprachen wie möglich anbieten, auch wenn wir sie selbst erstellen müssen.** -## Schaltflächen und CTAs (Call to Action) {#buttons-and-ctas} +## Schaltflächen & CTAs {#buttons-and-ctas} Die Website enthält zahlreiche Schaltflächen, die anders übersetzt werden sollten als andere Inhalte. Schaltflächentext kann identifiziert werden, indem Sie sich die zugehörigen Kontext-Screenshots ansehen oder den Kontext im Editor überprüfen, der den Ausdruck „Button“ enthält. -Die Übersetzungen für Schaltflächen sollten so kurz wie möglich sein, um Formatierungsfehler zu vermeiden. Außerdem sollten die Schaltflächenübersetzungen als Anweisung formuliert sein, d. h. einen Befehl oder eine Aufforderung darstellen. +Die Übersetzungen für Schaltflächen sollten so kurz wie möglich sein, um Formatierungsfehler zu vermeiden. Zudem sollten Übersetzungen von Schaltflächen im Imperativ stehen, d. h. einen Befehl oder eine Aufforderung darstellen. -![Wie man eine Schaltfläche.png findet](./how-to-find-a-button.png) +![So finden Sie eine Schaltfläche.png](./how-to-find-a-button.png) -## Übersetzen für Inklusion {#translating-for-inclusivity} +## Inklusives Übersetzen {#translating-for-inclusivity} Die Besucher von ethereum.org kommen aus der ganzen Welt und haben ganz unterschiedliche Hintergründe. Die Sprache auf der Website sollte daher neutral, einladend für alle und nicht ausschließend sein. @@ -229,7 +235,7 @@ Einige Beispiele dafür, worauf besonders zu achten ist: - Jede Sprache hat vielfältige und komplexe Regeln für die Erstellung von Listen. Diese können sich erheblich vom Englischen unterscheiden. - In einigen Sprachen muss das erste Wort jeder neuen Zeile groß geschrieben werden, während in anderen Sprachen neue Zeilen mit Kleinbuchstaben beginnen sollten. Viele Sprachen haben auch unterschiedliche Regeln für die Groß- und Kleinschreibung in Listen, je nach Länge der einzelnen Zeilen. -- Das Gleiche gilt für die Interpunktion von Zeilenelementen. Das Endzeichen in Listen kann, je nach Sprache, ein Punkt (**.**), ein Komma (**,**) oder ein Semikolon (**;**) sein. +- Das Gleiche gilt für die Interpunktion von Zeilenelementen. Das abschließende Satzzeichen in Listen kann je nach Sprache ein Punkt (.), ein Komma (,) oder ein Semikolon (;) sein. **Anführungszeichen** @@ -256,7 +262,7 @@ Einige Beispiele dafür, worauf besonders zu achten ist: - Englisch – **1,000.50** - Spanisch – **1.000,50** - Französisch – **1 000,50** -- Ebenfalls wichtig bei der Übersetzung von Zahlen ist das Prozentzeichen. Es kann auf verschiedene Weise geschrieben werden: **100%**, **100 %** oder **%100**. +- Ebenfalls wichtig bei der Übersetzung von Zahlen ist das Prozentzeichen. Es kann auf verschiedene Weisen geschrieben werden: **100%**, **100 %** oder **%100**. - Und abschließend können auch negative Zahlen je nach Sprache unterschiedlich dargestellt werden: -100, 100-, (100) oder [100]. **Datumsangaben** @@ -284,7 +290,7 @@ Einige Beispiele dafür, worauf besonders zu achten ist: - Als allgemeine Regel gilt, dass die Maßeinheiten aus der Quelle beibehalten werden sollten. Wenn in Ihrem Land ein anderes System verwendet wird, können Sie die Umrechnung in Klammern angeben. - Abgesehen von der Lokalisierung von Maßeinheiten sollte ebenfalls beachtet werden, wie unterschiedlich die Herangehensweise bei diesen Einheiten in den verschiedenen Sprachen ist. Der Hauptunterschied ist der Abstand zwischen der Zahl und der Einheit, der je nach Sprache unterschiedlich sein kann. Beispiele hierfür sind 100kB vs. 100 kB oder 50ºF vs. 50 ºF. -## Zusammenfassung {#conclusion} +## Fazit {#conclusion} Das Übersetzen von ethereum.org ist eine gute Gelegenheit, die verschiedenen Aspekte von Ethereum kennenzulernen. diff --git a/public/content/translations/de/dao/index.md b/public/content/translations/de/dao/index.md index f7922d74baf..57f195b7951 100644 --- a/public/content/translations/de/dao/index.md +++ b/public/content/translations/de/dao/index.md @@ -1,5 +1,6 @@ --- -title: Dezentrale autonome Organisationen (DAOs) +title: Was ist ein DAO? +metaTitle: Was ist ein DAO? | Dezentralisierte Autonome Organisation description: Eine Übersicht über DAOs auf Ethereum lang: de template: use-cases @@ -18,7 +19,7 @@ Eine DAO ist eine Organisation im kollektiven Besitz, die auf eine gemeinsame Mi DAOs ermöglichen es uns, mit Gleichgesinnten rund um den Globus zusammenzuarbeiten, ohne auf das Wohlwollen einer Führungskraft vertrauen zu müssen, die unsere Geldmittel oder die Operationen verwaltet. Es gibt keinen CEO, der Geldmittel nach Lust und Laune ausgibt, und keinen Finanzchef, der die Buchhaltung manipulieren kann. Stattdessen bestimmen die in den Code eingebauten, Blockchain-basierten Regeln, wie die Organisation funktioniert und wie Geldmittel ausgegeben werden. -Die Finanzverwaltung ist integriert und niemand kann ohne die Zustimmung der Gruppe auf die Mittel zugreifen. Entscheidungen werden nach Vorschlägen und Abstimmungen getroffen. So wird sichergestellt, dass jeder in der Organisation eine Stimme hat und dass alles transparent [on-Chain](/glossary/#on-chain) abläuft. +Die Finanzverwaltung ist integriert und niemand kann ohne die Zustimmung der Gruppe auf die Mittel zugreifen. Entscheidungen werden durch Vorschläge und Abstimmungen getroffen, um sicherzustellen, dass jeder in der Organisation eine Stimme hat und alles transparent [onchain](/glossary/#onchain) geschieht. ## Wofür brauchen wir DAOs? {#why-dao} @@ -28,27 +29,27 @@ Das eröffnet so viele neue Möglichkeiten der globalen Zusammenarbeit und Koord ### Ein Vergleich {#dao-comparison} -| DAO | Eine herkömmliche Organisation | -| ---------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| In der Regel flache Strukturen und vollständig demokratisiert | In der Regel hierarchisch strukturiert | -| Abstimmung durch die Mitglieder erforderlich, damit Veränderungen implementiert werden können | Veränderungen können je nach Struktur von einzelnen Parteien verlangt oder durch offene Abstimmungen beschlossen werden | -| Nach der Stimmenauszählung wird das Ergebnis automatisch ohne vertrauenswürdige Vermittlungsinstanz implementiert | Sofern Abstimmungen erlaubt sind, werden die Stimmen intern gezählt und das Ergebnis muss manuell umgesetzt werden | +| DAO | Eine herkömmliche Organisation | +| ----------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| In der Regel flache Strukturen und vollständig demokratisiert | In der Regel hierarchisch strukturiert | +| Abstimmung durch die Mitglieder erforderlich, damit Veränderungen implementiert werden können | Veränderungen können je nach Struktur von einzelnen Parteien verlangt oder durch offene Abstimmungen beschlossen werden | +| Nach der Stimmenauszählung wird das Ergebnis automatisch ohne vertrauenswürdige Vermittlungsinstanz implementiert | Sofern Abstimmungen erlaubt sind, werden die Stimmen intern gezählt und das Ergebnis muss manuell umgesetzt werden | | Angebotene Dienste werden automatisch auf dezentrale Weise abgewickelt (etwa die Verteilung von Geldmitteln für einen guten Zweck) | Erfordert die Abwicklung durch Personen oder zentral kontrollierte automatische Abläufe, die anfällig für Manipulation sind | -| Alle Aktivitäten sind transparent und vollständig öffentlich | Aktivitäten sind normalerweise organisationsintern, begrenzte Einsicht für die Öffentlichkeit | +| Alle Aktivitäten sind transparent und vollständig öffentlich | Aktivitäten sind normalerweise organisationsintern, begrenzte Einsicht für die Öffentlichkeit | -### Beispiele für DAOs {#dao-examples} +### DAO-Beispiele {#dao-examples} Für ein besseres Verständnis finden Sie im Folgenden einige Beispiele für den Einsatz einer DAO: - **Eine Wohltätigkeitsorganisation** – Sie könnten von jeder Person auf der Welt Spenden annehmen und darüber abstimmen, welche Zwecke unterstützt werden sollen. -- **Kollektivbesitz** – Sie könnten physische oder digitale Vermögenswerte erwerben und Mitglieder können darüber abstimmen, wie diese eingesetzt werden sollen. -- **Projekte und Förderung** – Sie könnten einen Risikofonds anlegen, der Investitionskapital zusammenlegt und abstimmt, welche Projekte unterstützt werden sollen. Das zurückgezahlte Geld könnte später unter den DAO-Mitgliedern neu verteilt werden. +- **Kollektives Eigentum** – Sie könnten physische oder digitale Vermögenswerte erwerben und die Mitglieder können darüber abstimmen, wie diese verwendet werden sollen. +- **Wagniskapital und Zuschüsse** – Sie könnten einen Risikofonds gründen, der Investitionskapital bündelt und darüber abstimmt, welche Vorhaben unterstützt werden sollen. Das zurückgezahlte Geld könnte später unter den DAO-Mitgliedern neu verteilt werden. ## Wie funktionieren DAOs? {#how-daos-work} -Das Grundgerüst einer DAO ist ihr [Smart Contract](/glossary/#smart-contract), der die Regeln der Organisation bestimmt und die Finanzmittel enthält. Sobald ein Smart Contract auf Ethereum aktiv ist, können die Regeln ausschließlich per Abstimmung geändert werden. Vorgänge, die nicht durch die Regeln und Logik des Codes abgedeckt sind, schlagen fehl. Da auch die Finanzmittel durch den Smart Contract definiert sind, kann niemand das Geld ohne die Zustimmung der Gruppe ausgeben. Daher benötigen DAOs keine zentrale Instanz. Stattdessen trifft die Gruppe Entscheidungen gemeinsam, wobei Zahlungen bei positiver Abstimmung automatisch genehmigt werden. +Das Rückgrat einer DAO ist ihr [Smart Contract](/glossary/#smart-contract), der die Regeln der Organisation festlegt und die Kasse der Gruppe verwaltet. Sobald ein Smart Contract auf Ethereum aktiv ist, können die Regeln ausschließlich per Abstimmung geändert werden. Vorgänge, die nicht durch die Regeln und Logik des Codes abgedeckt sind, schlagen fehl. Da auch die Finanzmittel durch den Smart Contract definiert sind, kann niemand das Geld ohne die Zustimmung der Gruppe ausgeben. Daher benötigen DAOs keine zentrale Instanz. Stattdessen trifft die Gruppe Entscheidungen gemeinsam, wobei Zahlungen bei positiver Abstimmung automatisch genehmigt werden. Möglich wird dies durch die Manipulationssicherheit von Smart Contracts, die auf Ethereum veröffentlicht werden. Da alle Vorgänge öffentlich sind, sind unbemerkte Änderungen am Code (also den Regeln der DAO) unmöglich. @@ -61,7 +62,7 @@ Ethereum ist aus einer Reihe von Gründen die perfekte Plattform für DAOs: - Smart Contracts können Geldmittel versenden und empfangen. Andernfalls wäre für die Verwaltung der Geldmittel der Gruppe eine vertrauenswürdige Vermittlungsinstanz erforderlich. - Die Ethereum-Community ist bekannt dafür, dass ihr Zusammenarbeit wichtiger ist als Wettbewerb. Daher können sich bewährte Verfahren und Unterstützungssysteme schnell herausbilden. -## DAO-Verwaltung {#dao-governance} +## DAO-Governance {#dao-governance} Um DAOs zu verwalten, sind vorher zahlreiche Überlegungen notwendig – etwa wie Abstimmungen und Vorschläge funktionieren sollen. @@ -69,29 +70,29 @@ Um DAOs zu verwalten, sind vorher zahlreiche Überlegungen notwendig – etwa wi Die Delegation ist die DAO-Variante repräsentativer Demokratie. Tokenbesitzer delegieren Stimmen an Benutzer, die sich selbst nominieren und sich verpflichten, auf dem aktuellen Stand zu bleiben und das Protokoll zu verwalten. -#### Bekanntes Beispiel {#governance-example} +#### Ein berühmtes Beispiel {#governance-example} -[ENS](https://claim.ens.domains/delegate-ranking) – Um sie zu vertreten, können ENS-Besitzer ihre Stimmen an engagierte Communitymitglieder delegieren. +[ENS](https://claim.ens.domains/delegate-ranking) – ENS-Inhaber können ihre Stimmen an engagierte Community-Mitglieder delegieren, damit diese sie vertreten. -### Automatische Transaktionsverwaltung {#governance-example} +### Automatische Transaktions-Governance {#governance-example} In vielen DAOs werden Transaktionen automatisch ausgeführt, wenn eine Mindestanzahl der Mitglieder zustimmt. -#### Bekanntes Beispiel {#governance-example} +#### Ein berühmtes Beispiel {#governance-example} -[Nouns](https://nouns.wtf) – In der Nouns DAO wird eine Transaktion automatisch ausgeführt, wenn die Mindestanzahl der Stimmen erreicht ist und sich die Mehrzahl der Stimmen für die Transaktion ausspricht, solange es von den Gründern keinen Widerspruch gibt. +[Nouns](https://nouns.wtf) – In der Nouns DAO wird eine Transaktion automatisch ausgeführt, wenn ein Quorum an Stimmen erreicht wird und eine Mehrheit zustimmt, solange die Gründer kein Veto einlegen. -### Multisig-Verwaltung {#governance-example} +### Multisig-Governance {#governance-example} -DAOS können über Tausende stimmberechtigte Mitglieder verfügen. Die Geldmittel werden allerdings in einer [Wallet](/glossary/#wallet) aufbewahrt, die von 5 bis 20 aktiven, vertrauenswürdigen Mitgliedern der Community, die normalerweise „gedoxxt“ (Ihre öffentlichen Identitäten sind der Community bekannt) sind, geteilt wird. Nach einer Abstimmung setzen die [Multi-sig](/glossary/#multisig)-Unterzeichner den Willen der Community um. +Obwohl DAOs Tausende von stimmberechtigten Mitgliedern haben können, können die Gelder in einer [Wallet](/glossary/#wallet) aufbewahrt werden, die von 5–20 aktiven Community-Mitgliedern gemeinsam genutzt wird, die vertrauenswürdig und in der Regel „doxxed“ sind (d. h. ihre öffentlichen Identitäten sind der Community bekannt). Nach einer Abstimmung führen die [Multisig](/glossary/#multisig)-Unterzeichner den Willen der Community aus. ## DAO-Gesetze {#dao-laws} Im US-Bundesstaat Wyoming wurde 1977 die LCC eingeführt, die Unternehmer schützt und ihre Haftung beschränkt. In jüngster Zeit hat der Staat außerdem ein DAO-Gesetz verabschiedet, das den Rechtsstatus von DAOs festlegt. Aktuell verfügen (in den USA) Wyoming, Vermont und die Jungferninseln über eine Form von DAO-Gesetzen. -### Bekanntes Beispiel {#law-example} +### Ein berühmtes Beispiel {#law-example} -[CityDAO](https://citizen.citydao.io/) – CityDAO hat durch Wyomings DAO-Gesetz rund 16 Hektar Land in der Nähe des Yellowstone-Nationalparks gekauft. +[CityDAO](https://citizen.citydao.io/) – CityDAO nutzte das DAO-Gesetz von Wyoming, um 40 Acres (ca. 16 Hektar) Land in der Nähe des Yellowstone-Nationalparks zu kaufen. ## DAO-Mitgliedschaft {#dao-membership} @@ -99,13 +100,13 @@ Für die Mitgliedschaft in einer DAO gibt es verschiedene Modelle. Über die Mit ### Token-basierte Mitgliedschaft {#token-based-membership} -Abhängig vom benutzten Token normalerweise vollkommen [berechtigungsfrei](/glossary/#permissionless). Meistens können diese Verwaltungs-Token berechtigungsfrei in einem [dezentralisierten Austausch](/glossary/#dex) gehandelt werden. Andere müssen durch die Bereitstellung liquider Mittel oder eine andere Form des „Proof of Work“ erworben werden. In jedem Fall gewährt der Besitz des Tokens Zugang zur Abstimmung. +In der Regel vollständig [berechtigungsfrei](/glossary/#permissionless), abhängig vom verwendeten Token. Meistens können diese Governance-Token berechtigungsfrei an einer [dezentralen Börse](/glossary/#dex) gehandelt werden. Andere müssen durch die Bereitstellung liquider Mittel oder eine andere Form des „Proof of Work“ erworben werden. In jedem Fall gewährt der Besitz des Tokens Zugang zur Abstimmung. _In der Regel werden sie zur Steuerung umfangreicher dezentraler Protokolle und/oder von Token selbst verwendet._ -#### Bekanntes Beispiel {#token-example} +#### Ein berühmtes Beispiel {#token-example} -[MakerDAO](https://makerdao.com) – Der Token MKR von MakerDAOs wird an zahlreichen dezentralisierten Börsen angeboten, sodass jeder Token und damit Stimmrechte für die zukünftige Ausrichtung des Maker-Protokolls kaufen kann. +[MakerDAO](https://makerdao.com) – Der Token MKR von MakerDAO ist auf dezentralen Börsen weithin verfügbar, und jeder kann sich Stimmrechte für die Zukunft des Maker-Protokolls erkaufen. ### Anteilsbasierte Mitgliedschaft {#share-based-membership} @@ -113,53 +114,55 @@ Anteilsbasierte DAOs sind stärker reglementiert, aber immer noch recht offen. A _Findet in der Regel Anwendung für kleinere, auf den Menschen ausgerichtete Organisationen wie Wohltätigkeitsorganisationen, Arbeitergemeinschaften und Investmentclubs. Die anteilsbasierte Mitgliedschaft kann auch die Verwaltung von Protokollen und Token regeln._ -#### Bekanntes Beispiel {#share-example} +#### Ein berühmtes Beispiel {#share-example} -[MolochDAO](http://molochdao.com/) – MolochDAO ist auf die Finanzierung von Ethereum-Projekten ausgerichtet. Für sie ist ein Antrag auf Mitgliedschaft erforderlich, damit die Gruppe beurteilen kann, ob Interessenten über das nötige Fachwissen und Kapital verfügen, um fundierte Entscheidungen über potenzielle Förderungsempfänger zu treffen. Es ist nicht möglich, den Zugang zur DAO einfach auf dem freien Markt zu erwerben. +[MolochDAO](http://molochdao.com/) – MolochDAO konzentriert sich auf die Finanzierung von Ethereum-Projekten. Für sie ist ein Antrag auf Mitgliedschaft erforderlich, damit die Gruppe beurteilen kann, ob Interessenten über das nötige Fachwissen und Kapital verfügen, um fundierte Entscheidungen über potenzielle Förderungsempfänger zu treffen. Es ist nicht möglich, den Zugang zur DAO einfach auf dem freien Markt zu erwerben. ### Reputationsbasierte Mitgliedschaft {#reputation-based-membership} -Die Reputation ist ein Nachweis der Teilnahme und gewährt Stimmrechte in der DAO. Im Gegensatz zur token- oder anteilsbasierten Mitgliedschaft werde bei reputationsbasierten DAOs keine Eigentumsrechte an Mitwirkende übertragen. Die Reputation kann weder gekauft, übertragen noch delegiert werden. DAO-Mitglieder können die Reputation nur durch Teilnahme erwerben. Für On-Chain-Abstimmungen ist keine Berechtigung erforderlich. Jedes potenzielle Mitglied kann einen Antrag auf Beitritt zur DAO und Vergütung seiner Mitwirkung in Form von Reputation und Token stellen. +Die Reputation ist ein Nachweis der Teilnahme und gewährt Stimmrechte in der DAO. Im Gegensatz zur token- oder anteilsbasierten Mitgliedschaft werde bei reputationsbasierten DAOs keine Eigentumsrechte an Mitwirkende übertragen. Die Reputation kann weder gekauft, übertragen noch delegiert werden. DAO-Mitglieder können die Reputation nur durch Teilnahme erwerben. Die Organ-Abstimmung ist genehmigungsfrei, und potenzielle Mitglieder können frei Vorschläge zum Beitritt zur DAO einreichen und als Gegenleistung für ihre Beiträge Reputation und Token als Belohnung beantragen. -_Wird üblicherweise für die dezentralisierte Entwicklung und Verwaltung von Protokollen und [DApps](/glossary/#dapp) verwendet, aber auch gut geeignet für eine vielfältige Reihe an Organisationen wie Wohltätigkeitsorganisationen, Arbeitergemeinschaften, Investmentclubs usw._ +_Typischerweise für die dezentrale Entwicklung und Governance von Protokollen und [Dapps](/glossary/#dapp) verwendet, aber auch gut geeignet für eine Vielzahl von Organisationen wie Wohltätigkeitsorganisationen, Arbeiterkollektive, Investmentclubs usw._ -#### Bekanntes Beispiel {#reputation-example} +#### Ein berühmtes Beispiel {#reputation-example} -[DXdao](https://DXdao.eth.limo) – DXdao war eine weltweit souveräne Gemeinschaft, die seit 2019 dezentralisierte Protokolle und Anwendungen entwickelte und verwaltete. Sie nutzte reputationsbasierte Verwaltung und [holografischen Konsens](/glossary/#holographic-consensus) zur Koordiantion und Verwaltung von Geldmitteln, d. h. niemand konnte sich Einfluss auf ihre Entwicklung oder Verwaltung erkaufen. +[DXdao](https://DXdao.eth.limo) – DXdao war ein globales, souveränes Kollektiv, das seit 2019 dezentrale Protokolle und Anwendungen entwickelt und verwaltet. Sie nutzte reputationsbasierte Governance und [holografischen Konsens](/glossary/#holographic-consensus) zur Koordination und Verwaltung von Geldern, was bedeutet, dass sich niemand Einfluss auf ihre Zukunft oder Governance erkaufen konnte. -## DAO – Beitritt und Gründung {#join-start-a-dao} +## Einer DAO beitreten / eine DAO gründen {#join-start-a-dao} ### Einer DAO beitreten {#join-a-dao} -- [DAOs der Ethereum-Community](/community/get-involved/#decentralized-autonomous-organizations-daos) -- [DAO-Liste von DAOHaus](https://app.daohaus.club/explore) -- [DAO-Liste von tally.xyz](https://www.tally.xyz) +- [Ethereum-Community-DAOs](/community/get-involved/#decentralized-autonomous-organizations-daos) +- [Liste der DAOs von DAOHaus](https://app.daohaus.club/explore) +- [Liste der DAOs von Tally.xyz](https://www.tally.xyz/explore) +- [Liste der DAOs von DeGov.AI](https://apps.degov.ai/) -### Gründung einer DAO {#start-a-dao} +### Eine DAO gründen {#start-a-dao} -- [Eine DAO mit DAOHaus gründen](https://app.daohaus.club/summon) -- [Eine Governor DAO mit Tally gründen](https://www.tally.xyz/add-a-dao) -- [Eine von Aragon betriebene DAO gründen](https://aragon.org/product) -- [Eine Kolonie gründen](https://colony.io/) -- [Eine DAO mit dem holografischen Konsens von DAOstack gründen](https://alchemy.daostack.io/daos/create) +- [Eine DAO mit DAOHaus beschwören](https://app.daohaus.club/summon) +- [Eine Governor-DAO mit Tally starten](https://www.tally.xyz/get-started) +- [Eine DAO mit Aragon erstellen](https://aragon.org/product) +- [Eine Colony starten](https://colony.io/) +- [Eine DAO mit dem holographischen Konsens von DAOstack erstellen](https://alchemy.daostack.io/daos/create) +- [Eine DAO mit dem DeGov Launcher starten](https://docs.degov.ai/integration/deploy) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -### DAO-Artikel {#dao-articles} +### Artikel über DAOs {#dao-articles} - [Was ist eine DAO?](https://aragon.org/dao) – [Aragon](https://aragon.org/) -- [Haus der DAOs](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) – [Metagame](https://wiki.metagame.wtf/) +- [House of DAOs](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) – [Metagame](https://wiki.metagame.wtf/) - [Was ist eine DAO und wofür ist sie da?](https://daohaus.substack.com/p/-what-is-a-dao-and-what-is-it-for) – [DAOhaus](https://daohaus.club/) -- [Gründung einer DAO-basierten digitalen Community](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) +- [Wie man eine DAO-gestützte digitale Community gründet](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [Was ist eine DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [Was ist holografischer Konsens?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) – [DAOstack](https://daostack.io/) -- [DAOs sind keine Unternehmen: „Wo die Dezentralisierung in autonomen Organisationen wichtig ist“ von Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) -- [DAOs, DACs, DAs und mehr: Ein unvollständiger Terminologie-Guide](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Ethereum Blog](https://blog.ethereum.org) +- [DAOs sind keine Unternehmen: Wo Dezentralisierung bei autonomen Organisationen eine Rolle spielt, von Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) +- [DAOs, DACs, DAs und mehr: Ein unvollständiger Leitfaden zur Terminologie](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) – [Ethereum Blog](https://blog.ethereum.org) ### Videos {#videos} -- [Was ist eine DAO in der Kryptolandschaft?](https://youtu.be/KHm0uUPqmVE) -- [Lässt sich mithilfe von DAOs eine Stadt errichten?](https://www.ted.com/talks/scott_fitsimones_could_a_dao_build_the_next_great_city) – [TED](https://www.ted.com/) +- [Was ist eine DAO im Kryptobereich?](https://youtu.be/KHm0uUPqmVE) +- [Kann eine DAO eine Stadt bauen?](https://www.ted.com/talks/scott_fitsimones_could_a_dao_build_the_next_great_city) – [TED](https://www.ted.com/) diff --git a/public/content/translations/de/decentralized-identity/index.md b/public/content/translations/de/decentralized-identity/index.md index 72abcbbc709..cf54c55261c 100644 --- a/public/content/translations/de/decentralized-identity/index.md +++ b/public/content/translations/de/decentralized-identity/index.md @@ -13,13 +13,13 @@ summaryPoint3: Dank Krypto haben Benutzer jetzt die Werkzeuge, um ihre eigenen I Identität untermauert praktisch jeden Aspekt Ihres heutigen Lebens. Die Nutzung von Online-Diensten, die Eröffnung eines Bankkontos, die Teilnahme an Wahlen, der Kauf von Immobilien, die Sicherung von Arbeit – all dies erfordert den Nachweis Ihrer Identität. -Traditionelle Identitätsmanagementsysteme verlassen sich jedoch seit Langem auf zentralisierte Vermittler, die Ihre Identifikatoren und [Attestierungen](/glossary/#attestation) ausstellen, speichern und kontrollieren. Das bedeutet, dass Sie Ihre identitätsbezogenen Informationen nicht kontrollieren können und nicht entscheiden können, wer Zugriff auf personenbezogene Daten (PII) hat, und wie viel Zugriff diese Parteien haben. +Herkömmliche Identitätsmanagementsysteme stützen sich jedoch seit langem auf zentralisierte Vermittler, die Ihre Identifikatoren und [Attestierungen](/glossary/#attestation) ausstellen, aufbewahren und kontrollieren. Das bedeutet, dass Sie Ihre identitätsbezogenen Informationen nicht kontrollieren können und nicht entscheiden können, wer Zugriff auf personenbezogene Daten (PII) hat, und wie viel Zugriff diese Parteien haben. -Um diese Probleme zu lösen, haben wir dezentrale Identitätssysteme, die auf öffentlichen Blockchains wie Ethereum basieren. Eine dezentralisierte Identität erlaubt es den Menschen, ihre identitätsbezogenen Informationen zu verwalten. Durch dezentralisierte Identitätslösungen können _Sie_ Identifikatoren erschaffen und Ihre Attestierungen sowohl beanspruchen als auch über sie verfügen, ohne dabei auf zentrale Autoritäten, wie Dienstleister oder Regierungen, vertrauen zu müssen. +Um diese Probleme zu lösen, haben wir dezentrale Identitätssysteme, die auf öffentlichen Blockchains wie Ethereum basieren. Eine dezentralisierte Identität erlaubt es den Menschen, ihre identitätsbezogenen Informationen zu verwalten. Mit dezentralisierten Identitätslösungen können _Sie_ Identifikatoren erstellen, Ihre Attestierungen beanspruchen und aufbewahren, ohne sich auf zentrale Behörden wie Dienstanbieter oder Regierungen verlassen zu müssen. ## Was ist Identität? {#what-is-identity} -Identität bedeutet das Selbstempfinden eines Individuums, definiert durch einzigartige Charaktereigenschaften. Identität bezieht sich auf ein _Individuum_, d. h. eine eigenständige Person. Identität könnte sich auch auf andere nicht-menschliche Entitäten, wie eine Organisation oder Behörde, beziehen. +Identität bedeutet das Selbstempfinden eines Individuums, definiert durch einzigartige Charaktereigenschaften. Identität bezieht sich darauf, ein _Individuum_ zu sein, d. h. eine eigenständige Person. Identität könnte sich auch auf andere nicht-menschliche Entitäten, wie eine Organisation oder Behörde, beziehen. @@ -35,67 +35,93 @@ Ein Identifikator ist eine Information, die als Pointer einer bestimmten Identit Diese traditionellen Beispiele von Identifikatoren werden von zentralen Stellen ausgestellt, gespeichert und kontrolliert. Sie brauchen die Erlaubnis Ihrer Regierung, um Ihren Namen zu ändern, oder die einer Social-Media-Plattform, um Ihren Benutzernamen zu ändern. -## Vorteile dezentralisierter Identitäten {#benefits-of-decentralized-identity} +## Vorteile der dezentralisierten Identität {#benefits-of-decentralized-identity} 1. Dezentralisierte Identitäten erhöhen die individuelle Kontrolle der Identifizierung von Informationen. Dezentralisierte Identifikatoren und Attestierungen können überprüft werden, ohne sich auf zentralisierte Behörden und Dienste Dritter zu verlassen. -2. Dezentralisierte Identitätslösungen benötigen kein Vertrauen. Sie stellen eine nahtlose und die Privatsphäre schützende Methode zur Überprüfung und Verwaltung von Benutzeridentitäten dar. +2. Dezentralisierte Identitätslösungen ermöglichen eine vertrauenslose, nahtlose und die Privatsphäre schützende Methode zur Verifizierung und Verwaltung von Benutzeridentitäten. 3. Dezentralisierte Identitäten nutzten die Blockchain-Technologie, die Vertrauen zwischen verschiedenen Parteien schafft und kryptografische Garantien bietet, um die Gültigkeit von Attestierungen nachzuweisen. -4. Dezentralisierte Identitäten machen Identitätsdaten übertragbar. Benutzer speichern Attestierungen und Identifikatoren in mobilen Wallets und können sie mit jeder Partei ihrer Wahl teilen. Dezentralisierte Identifikatoren und Attestierungen sind nicht in der Datenbank der emittierenden Organisation gesperrt. +4. Dezentralisierte Identitäten machen Identitätsdaten übertragbar. Benutzer speichern Attestierungen und Identifikatoren in einer mobilen Wallet und können sie mit jeder Partei ihrer Wahl teilen. Dezentralisierte Identifikatoren und Attestierungen sind nicht in der Datenbank der emittierenden Organisation gesperrt. -5. Dezentralisierte Identitäten sollten gut mit aufkommenden [Zero-Knowledge](/glossary/#zk-proof)-Technologien zusammenarbeiten. Diese ermöglichen Einzelpersonen, dass sie beweisen können, dass sie etwas besitzen oder etwas gemacht haben, ohne preiszugeben, was es ist. Dies könnte sich zu einer schlagkräftigen Möglichkeit entwickeln, Vertrauen und Privatsphäre für bestimmte Anwendungen zu verbinden, wie z. B. Abstimmungsverhalten. +5. Dezentralisierte Identität sollte gut mit aufkommenden [Zero-Knowledge](/glossary/#zk-proof)-Technologien funktionieren, die es Einzelpersonen ermöglichen, den Besitz oder die Durchführung von etwas nachzuweisen, ohne preiszugeben, worum es sich dabei handelt. Dies könnte sich zu einer schlagkräftigen Möglichkeit entwickeln, Vertrauen und Privatsphäre für bestimmte Anwendungen zu verbinden, wie z. B. Abstimmungsverhalten. -6. Dezentralisierte Identitäten ermöglichen [Anti-Sybil](/glossary/#anti-sybil)-Mechanismen zu identifizieren, wenn eine Einzelperson vorgibt, mehrere Personen zu sein, um ein System auszutricksen oder zu spammen. +6. Dezentralisierte Identität ermöglicht [Anti-Sybil](/glossary/#anti-sybil)-Mechanismen, zu erkennen, wenn eine einzelne Person vorgibt, mehrere Personen zu sein, um ein System auszunutzen oder zuzuspammen. -## Dezentralisierte Nutzungsmöglichkeiten von Identitäten {#decentralized-identity-use-cases} +## Anwendungsfälle für dezentrale Identität {#decentralized-identity-use-cases} Dezentralisierte Identitäten haben viele potenzielle Nutzungsmöglichkeiten: -### 1. Universale Log-Ins {#universal-dapp-logins} +### 1. Universelle Logins {#universal-dapp-logins} -Dezentralisierte Identitäten können dazu beitragen, Passwort-basierte Logins durch dezentrale Authentifizierung zu ersetzen. Dienstleister können Attestierungen an Benutzer verteilen, welche in einer Ethereum-Wallet gespeichert werden. Eine Beispielattestierung wäre ein [NFT](/glossary/#nft), welcher dem Inhaber Zugriff auf eine Online-Community gewährt. +Dezentralisierte Identitäten können dazu beitragen, Passwort-basierte Logins durch dezentrale Authentifizierung zu ersetzen. Dienstleister können Attestierungen an Benutzer verteilen, welche in einer Ethereum-Wallet gespeichert werden. Ein Beispiel für eine Attestierung wäre ein [NFT](/glossary/#nft), der dem Inhaber Zugang zu einer Online-Community gewährt. -Eine [Anmeldung über Ethereum](https://siwe.xyz/) würde es Servern ermöglichen, das Ethereum-Konto des Benutzers zu bestätigen und die erforderliche Attestierung von seiner Account-Adresse einzuholen. Das bedeutet, dass Benutzer auf Plattformen und Websites zugreifen können, ohne sich lange Passwörter merken und das Online-Erlebnis für Benutzer verbessern zu müssen. +Eine [Sign-In with Ethereum](https://siwe.xyz/)-Funktion würde es Servern dann ermöglichen, das Ethereum-Konto des Benutzers zu bestätigen und die erforderliche Attestierung von seiner Kontoadresse abzurufen. Das bedeutet, dass Benutzer auf Plattformen und Websites zugreifen können, ohne sich lange Passwörter merken und das Online-Erlebnis für Benutzer verbessern zu müssen. ### 2. KYC-Authentifizierung {#kyc-authentication} Die Nutzung vieler Online-Dienste erfordert von Einzelpersonen die Bereitstellung von Attestierungen und Berechtigungsnachweisen, wie zum Beispiel einen Führerschein oder nationalen Reisepass. Dieser Ansatz ist jedoch problematisch, da private Nutzerinformationen kompromittiert werden und Dienstleister die Echtheit der Attestierung nicht überprüfen können. -Dezentralisierte Identitäten erlauben es Unternehmen, herkömmliche [Know-Your-Customer (KYC)](https://de.wikipedia.org/wiki/Know_your_customer)-Prozesse zu überspringen und Benutzeridentitäten mittels überprüfbarer Zugangsdaten zu authentifizieren. Dies senkt die Kosten des Identitätsmanagements und verhindert die Verwendung gefälschter Dokumentationen. +Dezentralisierte Identität ermöglicht es Unternehmen, herkömmliche [Know-Your-Customer (KYC)](https://de.wikipedia.org/wiki/Know_your_customer)-Prozesse zu überspringen und Benutzeridentitäten über Verifiable Credentials zu authentifizieren. Dies senkt die Kosten des Identitätsmanagements und verhindert die Verwendung gefälschter Dokumentationen. -### 3. Abstimmungen und Online-Communtitys {#voting-and-online-communities} +### 3. Abstimmungen und Online-Communitys {#voting-and-online-communities} -Online-Abstimmungen und Social Media sind zwei neuartige Anwendungen für dezentralisierte Identitäten. Online-Wahlsysteme sind manipulationsanfällig, insbesondere wenn böswillige Akteure falsche Identitäten zur Abstimmung erschaffen. Einzelpersonen zu bitten, On-chain-Attestierungen vorzulegen, kann die Integrität von Online-Abstimmungsverfahren verbessern. +Online-Abstimmungen und Social Media sind zwei neuartige Anwendungen für dezentralisierte Identitäten. Online-Wahlsysteme sind manipulationsanfällig, insbesondere wenn böswillige Akteure falsche Identitäten zur Abstimmung erschaffen. Die Integrität von Online-Abstimmungsprozessen kann verbessert werden, indem Einzelpersonen aufgefordert werden, an Kette Bescheinigungen vorzulegen. -Dezentralisierte Identitäten können dabei helfen, Online-Communitys zu schaffen, die frei von gefälschten Konten sind. Zum Beispiel müsste jeder Benutzer seine Identität mittels eines On-Chain-Identitätssystems, wie dem Ethereum Name Service, authentifizieren, womit die Gefahr durch Bots reduziert wird. +Dezentralisierte Identitäten können dabei helfen, Online-Communitys zu schaffen, die frei von gefälschten Konten sind. Beispielsweise muss jeder Benutzer seine Identität möglicherweise mithilfe eines ankette Identitätssystems wie dem Ethereum Name Service authentifizieren, wodurch die Möglichkeit von Bots verringert wird. ### 4. Anti-Sybil-Schutz {#sybil-protection} -Applikationen, die Finanzierungshilfe geben, welche [Quadratische Abstimmung](/glossary/#quadratic-voting) nutzen, sind anfällig für [Sybil-Attacken](/glossary/#sybil-attack), weil der Wert eines Zuschusses erhöht wird, wenn mehr Personen dafür abstimmen, was Nutzer dazu anreizt, ihre Beiträge auf mehrere Identitäten zu verteilen. Dezentralisierte Identitäten helfen, dies zu verhindern, indem sie jeden Teilnehmer beweisen lassen, dass sie wirklich menschlich sind, auch wenn dabei meist keine spezifischen privaten Informationen verlangt werden. +Anwendungen zur Vergabe von Zuschüssen, die [quadratisches Abstimmen](/glossary/#quadratic-voting) verwenden, sind anfällig für [Sybil-Angriffe](/glossary/#sybil-attack), da der Wert eines Zuschusses steigt, wenn mehr Personen dafür stimmen, was Benutzer dazu anregt, ihre Beiträge auf viele Identitäten aufzuteilen. Dezentralisierte Identitäten helfen, dies zu verhindern, indem sie jeden Teilnehmer beweisen lassen, dass sie wirklich menschlich sind, auch wenn dabei meist keine spezifischen privaten Informationen verlangt werden. + +### 5. Nationaler und staatlicher Ausweis {#national-and-government-id} + +Regierungen können die Prinzipien der dezentralen Identität nutzen, um grundlegende Identitätsdokumente – wie nationale Ausweise, Pässe oder Führerscheine – als nachprüfbare Anmeldeinformationen auf Ethereum auszustellen. Dies bietet starke kryptografische Garantien für die Echtheit, um Betrug und Fälschungen bei der Online-Identitätsprüfung zu reduzieren. Bürger können diese Attestierungen in ihrem persönlichen [Wallet](/wallets/) speichern und damit ihre Identität, ihr Alter oder ihre Wahlberechtigung nachweisen. + +Dieses Modell ermöglicht eine selektive Offenlegung, insbesondere in Kombination mit der [Zero-Knowledge-Proof (ZKP)](/zero-knowledge-proofs/)-Datenschutztechnologie. Beispielsweise könnte ein Bürger kryptografisch nachweisen, dass er über 18 Jahre alt ist, um auf einen altersbeschränkten Dienst zuzugreifen, ohne sein genaues Geburtsdatum preiszugeben, was mehr Privatsphäre bietet als ein herkömmlicher Ausweis. + +#### 💡Fallstudie: Bhutan National Digital ID (NDI) auf Ethereum {#case-study-bhutan-ndi} + +- Bietet Zugang zu nachprüfbaren Identitätsnachweisen für die fast 800.000 Bürger Bhutans +- Migration vom Polygon-Netzwerk [zum Ethereum-Mainnet](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878) im Oktober 2025 +- Über [234.000 digitale Ausweise](https://www.blockchain-council.org/blockchain/bhutan-uses-blockchain-in-digital-id-project/) ausgestellt (Stand: März 2025) + +Das Königreich Bhutan hat sein [National Digital Identity (NDI)-System](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878) im Oktober 2025 auf Ethereum migriert. Auf den Prinzipien der dezentralisierten und selbstbestimmten Identität aufbauend, verwendet Bhutans NDI-System dezentralisierte Identifikatoren und nachprüfbare Anmeldeinformationen, um digital signierte Nachweise direkt an das persönliche Wallet eines Bürgers auszustellen. Durch die Verankerung kryptografischer Nachweise dieser Anmeldeinformationen auf Ethereum stellt das System sicher, dass sie authentisch und manipulationssicher sind und von jeder Partei ohne Abfrage einer zentralen Behörde überprüft werden können. + +Die Architektur des Systems legt durch den Einsatz der [Zero-Knowledge-Proof (ZKP)](/zero-knowledge-proofs/)-Technologie besonderen Wert auf den Datenschutz. Diese Implementierung der „selektiven Offenlegung“ ermöglicht es Bürgern, bestimmte Fakten (z. B. „Ich bin über 18“ oder „Ich bin Staatsbürger“) nachzuweisen, um auf Dienste zuzugreifen, ohne die zugrunde liegenden persönlichen Daten, wie ihre vollständige Ausweisnummer oder ihr genaues Geburtsdatum, preiszugeben. Dies demonstriert eine leistungsstarke, praxisnahe Anwendung von Ethereum für ein sicheres, benutzerzentriertes und datenschutzfreundliches nationales Ausweissystem. + +#### 💡Fallstudie: QuarkID der Stadt Buenos Aires auf Ethereum [Layer 2](/layer-2/) ZKSync Era {#case-study-buenos-aires-quarkid} + +- Ausgabe von dezentralen Identitätsnachweisen an über [3,6 Millionen Benutzer](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo) bei der Einführung +- QuarkID ist ein Open-Source-Protokoll, das im Rahmen der UN-Ziele für nachhaltige Entwicklung als [Digital Public Good](https://www.digitalpublicgoods.net/r/quarkid) (digitales öffentliches Gut) anerkannt ist +- Betont ein „[Regierung-als-Benutzer](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo)“-Modell, bei dem die Stadt nicht Eigentümer des Protokolls ist, was den Bürgern volle Dateneigentümerschaft und Privatsphäre gewährt + +Im Jahr 2024 integrierte die Regierung der Stadt Buenos Aires (GCBA) QuarkID, das vom Sekretariat für Innovation und digitale Transformation der GCBA entwickelte Open-Source-„Framework für digitales Vertrauen“, in miBA, die offizielle App der Stadt für den Zugang der Einwohner zu Regierungsdienstleistungen und offiziellen Dokumenten. Bei der Einführung erhielten alle über 3,6 Millionen Benutzer von miBA dezentrale digitale Identitäten, die es ihnen ermöglichen, nachprüfbare digitale Dokumente und Zertifikate On-Chain zu verwalten und zu teilen, einschließlich Staatsbürgerschaftsnachweisen, Geburts-, Heirats- und Sterbeurkunden, Steuerunterlagen, Impfnachweisen und mehr. + +Das auf dem Ethereum [Layer-2](/layer-2/)-Netzwerk ZKSync Era aufbauende QuarkID-System verwendet ZKP-Technologie, um Bürgern die Peer-to-Peer-Verifizierung persönlicher Anmeldeinformationen über ihre Mobilgeräte zu ermöglichen – ohne unnötige persönliche Daten preiszugeben. Das Programm hebt ein „Regierung-als-Benutzer“-Modell hervor, bei dem die GCBA als ein Benutzer des quelloffenen, interoperablen QuarkID-Protokolls agiert, anstatt als zentralisierter Eigentümer aufzutreten. Diese ZKP-fähige Architektur bietet ein entscheidendes Datenschutzmerkmal: keine dritte Partei, nicht einmal die GCBA, kann nachverfolgen, wie, wann oder warum ein Bürger seine Anmeldeinformationen verwendet. Dieses erfolgreiche Programm bietet den Bürgern eine vollständige, selbstbestimmte Identität und Kontrolle über ihre sensiblen Daten, alles gesichert durch das weltweit verteilte Netzwerk von Ethereum. ## Was ist eine Attestierung? {#what-are-attestations} Eine Attestierung ist ein Anspruch einer Entität gegenüber einer anderen Entität. Wenn Sie in den Vereinigten Staaten leben, bestätigt der Führerschein des Fahrzeugministeriums (eine Entität), dass Sie (eine andere Entität) berechtigt sind, ein Auto zu fahren. -Attestierungen unterscheiden sich von Identifikatoren. Eine Attestierung _enthält_ Identifikatoren für den Verweis auf eine bestimmte Identität und stellt einen Anspruch gegenüber einem Attribut im Zusammenhang mit dieser Identität. Ihr Führerschein hat also Identifikatoren (Name, Geburtsdatum, Adresse), ist aber zugleich auch die Attestierung Ihres gesetzlichen Fahrrechts. +Attestierungen unterscheiden sich von Identifikatoren. Eine Attestierung _enthält_ Identifikatoren, um auf eine bestimmte Identität zu verweisen, und macht eine Aussage über ein Attribut, das mit dieser Identität zusammenhängt. Ihr Führerschein hat also Identifikatoren (Name, Geburtsdatum, Adresse), ist aber zugleich auch die Attestierung Ihres gesetzlichen Fahrrechts. -### Was sind dezentralisierte Identifikatoren? {#what-are-decentralized-identifiers} +### Was sind dezentralisierte Identifikatoren? Was sind dezentralisierte Identifikatoren? {#what-are-decentralized-identifiers} Klassische Identifikatoren, wie beispielsweise Ihr bürgerlicher Name oder Ihre E-Mail-Adresse, sind von Dritten abhängig - von Regierungen und E-Mail-Anbietern. Dezentralisierte Identifikatoren (DIDs) sind anders - sie werden nicht von einer zentralen Stelle ausgegeben, verwaltet oder kontrolliert. Dezentralisierte Identifikatoren werden von Individuen ausgegeben, gehalten und kontrolliert. Ein [Ethereum-Konto](/glossary/#account) ist ein Beispiel für einen dezentralisierten Identifikator. Sie haben die Möglichkeit, so viele Konten zu erstellen, wie Sie möchten, ohne dass Sie eine Erlaubnis von Dritten benötigen und ohne dass diese Konten in einem zentralen Register gespeichert werden müssen. -Dezentralisierte Identifikatoren sind auf verteilten Ledgers ([Blockchains](/glossary/#blockchain)) oder [Peer-to-Peer Netzwerken](/glossary/#peer-to-peer-network) gespeichert. Das macht DIDs [weltweit eindeutig, auflösbar mit hoher Verfügbarkeit und kryptographisch verifizierbar](https://w3c-ccg.github.io/did-primer/). Ein dezentralisierter Identifikator kann mit verschiedenen Entitäten verknüpft werden, darunter Personen, Organisationen oder staatliche Einrichtungen. +Dezentralisierte Identifikatoren werden auf Distributed Ledgers ([Blockchains](/glossary/#blockchain)) oder in [Peer-to-Peer-Netzwerken](/glossary/#peer-to-peer-network) gespeichert. Dies macht DIDs [weltweit einzigartig, mit hoher Verfügbarkeit auflösbar und kryptografisch verifizierbar](https://w3c-ccg.github.io/did-primer/). Ein dezentralisierter Identifikator kann mit verschiedenen Entitäten verknüpft werden, darunter Personen, Organisationen oder staatliche Einrichtungen. -## Was ermöglicht dezentralisierte Identifikatoren? {#what-makes-decentralized-identifiers-possible} +## Was ermöglicht dezentralisierte Identifikatoren? Was ermöglicht dezentralisierte Identifikatoren? {#what-makes-decentralized-identifiers-possible} -### 1. Öffentliche Schlüssel-Kryptografie {#public-key-cryptography} +### 1. Public-Key-Kryptografie {#public-key-cryptography} -Öffentliche Schlüssel-Kryptografie ist eine Maßnahme zur Informationssicherheit, die einen [öffentlichen Schlüssel](/glossary/#public-key) und einen [privaten Schlüssel](/glossary/#private-key) für eine Einheit generiert. Öffentliche Schlüssel-[Kryptografie](/glossary/#cryptography) wird in Blockchain Netzwerken verwendet, um Nutzeridentitäten zu authentifizieren und den Besitz von digitalen Assets nachzuweisen. +Public-Key-Kryptografie ist eine Informationssicherheitsmaßnahme, die einen [öffentlichen Schlüssel](/glossary/#public-key) und einen [privaten Schlüssel](/glossary/#private-key) für eine Entität generiert. Public-Key-[Kryptografie](/glossary/#cryptography) wird in Blockchain-Netzwerken verwendet, um Benutzeridentitäten zu authentifizieren und den Besitz von digitalen Vermögenswerten nachzuweisen. -Einige dezentralisierte Identifikatoren, wie z. B. ein Ethereum-Konto, haben öffentliche und private Schlüssel. Der öffentliche Schlüssel identifiziert den Controller des Kontos, während die privaten Schlüssel Nachrichten für dieses Konto signieren und entschlüsseln können. Öffentliche Schlüssel-Kryptografie liefert die nötigen Nachweise, um Einheiten zu authentifizieren und Nachahmung zu verhindern, indem [kryptografische Signaturen](https://andersbrownworth.com/blockchain/public-private-keys/) verwendet werden, um alle Ansprüche zu verifizieren. +Einige dezentralisierte Identifikatoren, wie z. B. ein Ethereum-Konto, haben öffentliche und private Schlüssel. Der öffentliche Schlüssel identifiziert den Controller des Kontos, während die privaten Schlüssel Nachrichten für dieses Konto signieren und entschlüsseln können. Public-Key-Kryptografie liefert die notwendigen Beweise, um Entitäten zu authentifizieren und Identitätsdiebstahl sowie die Verwendung gefälschter Identitäten zu verhindern, wobei [kryptografische Signaturen](https://andersbrownworth.com/blockchain/public-private-keys/) zur Verifizierung aller Behauptungen verwendet werden. ### 2. Dezentralisierte Datenspeicher {#decentralized-datastores} @@ -103,11 +129,11 @@ Eine Blockchain dient als überprüfbares Datenregister: ein offenes, dezentrali Wenn jemand die Gültigkeit eines dezentralen Identifikators bestätigen muss, kann er den zugehörigen öffentlichen Schlüssel in der Blockchain finden. Dies unterscheidet sich von traditionellen Identifikatoren, die eine Authentifizierung durch Dritte erfordern. -## Wie ermöglichen dezentralisierte Identifikatoren und Attestierungen dezentralisierte Identitäten? {#how-decentralized-identifiers-and-attestations-enable-decentralized-identity} +## Wie ermöglichen dezentralisierte Identifikatoren und Attestierungen dezentralisierte Identitäten? Wie ermöglichen dezentralisierte Identifikatoren und Attestierungen eine dezentralisierte Identität? {#how-decentralized-identifiers-and-attestations-enable-decentralized-identity} Die dezentralisierte Identität repräsentiert die Vorstellung, dass identitätsbezogene Informationen selbstkontrolliert, privat und übertragbar sein sollten. Dabei stellen dezentralisierte Identifikatoren und Attestierungen die Grundbausteine dar. -Im Zusammenhang mit dezentralisierten Identitäten sind Attestierungen (auch bekannt als [nachprüfbare Berechtigungsnachweise](https://www.w3.org/TR/vc-data-model/)) manipulationssichere, kryptografisch überprüfbare Angaben des Emittenten. Jede Attestierung oder jeder nachprüfbarer Berechtigungsnachweis einer Entität (z. B. einer Organisation) wird mit ihrer DID in Zusammenhang gebracht. +Im Kontext der dezentralisierten Identität sind Attestierungen (auch bekannt als [Verifiable Credentials](https://www.w3.org/TR/vc-data-model/) bzw. nachprüfbare Berechtigungsnachweise) manipulationssichere, kryptografisch verifizierbare Behauptungen des Ausstellers. Jede Attestierung oder jeder nachprüfbarer Berechtigungsnachweis einer Entität (z. B. einer Organisation) wird mit ihrer DID in Zusammenhang gebracht. Da DIDs auf der Blockchain gespeichert sind, kann jeder die Gültigkeit einer Attestierung überprüfen, indem man die DID des Emittenten auf Ethereum überprüft. Im Grunde funktioniert die Blockchain von Ethereum wie ein globales Verzeichnis, das die Überprüfung von DIDs, die mit bestimmten Entitäten verbunden sind, ermöglicht. @@ -115,77 +141,78 @@ Dezentralisierte Identifikatoren sind der Grund dafür, dass Attestierungen selb Dezentralisierte Identifikatoren sind auch entscheidend für den Schutz von persönlichen Daten mittels dezentralisierter Identität. Zum Beispiel, wenn eine Person einen Nachweis über eine Attestierung (z. B. Führerschein) einreicht, müssen die Verifizierenden die Gültigkeit der Informationen nicht überprüfen. Stattdessen benötigt der Verifizierende nur kryptografische Garantien über die Echtheit der Attestierung und die Identität der emittierenden Organisation, um festzustellen, ob der Nachweis gültig ist. -## Attestierungen im Zusammenhang mit einer dezentralisierten Identität {#types-of-attestations-in-decentralized-identity} +## Arten von Attestierungen in der dezentralisierten Identität {#types-of-attestations-in-decentralized-identity} Wie Informationen zu Attestierungen gespeichert und in einem auf Ethereum basierenden Ökosystem der Identität abgerufen werden, unterscheidet sich vom traditionellen Identitätsmanagement. Hier finden Sie einen Überblick einiger Ansätze zur Ausgabe, Speicherung und der Überprüfung von Attestierungen in dezentralisierten Identitätssystemen: -### Off-Chain-Attestierungen {#off-chain-attestations} +### Off-Chain-Attestierungen {#offchain-attestations} -Eine Sorge bei der On-Chain-Speicherung von Attestierungen besteht darin, dass sie möglicherweise Informationen enthalten, die Einzelpersonen privat halten möchten. Diese öffentliche Art der Ethereum-Blockchain macht sie zum Speichern solcher Attestierungen wenig attraktiv. +Ein Problem bei der Speicherung von Bescheinigungen in der Kette besteht darin, dass sie möglicherweise Informationen enthalten, die Einzelpersonen privat halten möchten. Diese öffentliche Art der Ethereum-Blockchain macht sie zum Speichern solcher Attestierungen wenig attraktiv. -Die Lösung besteht darin, Attestierungen auszustellen, die von Benutzern „off-chain" in digitalen Wallets gehalten werden, aber mit der DID des Ausstellers unterschrieben werden, die „on-chain" gespeichert sind. Diese Attestierungen sind als sogenannte [JSON Web Token](https://en.wikipedia.org/wiki/JSON_Web_Token) kodiert und enthalten die digitale Signatur des Emittenten. Das ermöglicht eine einfache Überprüfung von Off-Chain-Ansprüchen. +Die Lösung besteht darin, Bescheinigungen auszustellen, die von Benutzern außerhalb der Kette in digitalen Geldbörsen aufbewahrt, aber mit der in der Kette gespeicherten DID des Ausstellers signiert werden. Diese Attestierungen sind als [JSON Web Tokens](https://de.wikipedia.org/wiki/JSON_Web_Token) kodiert und enthalten die digitale Signatur des Ausstellers, was eine einfache Verifizierung von Off-Chain-Ansprüchen ermöglicht. -Hier ist ein hypothetisches Szenario zur Erklärung von Off-Chain-Attestierungen: +Hier ist ein hypothetisches Szenario zur Erklärung von Offchain Bestätigungen: 1. Eine Universität (der Emittent) stellt eine Attestierung aus (ein digitales akademisches Zertifikat), unterzeichnet sie mit ihren Schlüsseln und gibt sie an Bob (den Identitätseigentümer) aus. 2. Bob bewirbt sich für eine Stelle und möchte seine akademischen Qualifikationen gegenüber einem Arbeitgeber nachweisen. Aus diesem Grund teilt er seine Attestierung mit Hilfe seiner mobilen Wallet. Das Unternehmen (Verifizierender) kann dann die Gültigkeit der Attestierung überprüfen, indem es die Gültigkeit der DID des Emittenten (d. h. ihres öffentlichen Schlüssels auf Ethereum) bestätigt. -### Off-Chain-Attestierungen mit dauerhaftem Zugriff {#offchain-attestations-with-persistent-access} +### Off-Chain-Attestierungen mit persistentem Zugriff {#offchain-attestations-with-persistent-access} -Bei dieser Regelung werden Attestierungen in JSON-Dateien umgewandelt und off-chain gespeichert (idealerweise mit einem [dezentralen Cloud-Speicher](/developers/docs/storage/), einer Plattform wie IPFS oder Swarm). Ein [Hash](/glossary/#hash) der JSON-Datei wird jedoch on-chain gespeichert und über eine On-Chain-Datenerfassung mit einer DID verbunden. Die dazugehörige DID könnte entweder die des Emittenten der Attestierung oder des Empfängers sein. +Bei dieser Anordnung werden Attestierungen in JSON-Dateien umgewandelt und Off-Chain gespeichert (idealerweise auf einer [dezentralen Cloud-Speicherplattform](/developers/docs/storage/) wie IPFS oder Swarm). Ein [Hash](/glossary/#hash) der JSON-Datei wird jedoch On-Chain gespeichert und über ein On-Chain-Register mit einer DID verknüpft. Die dazugehörige DID könnte entweder die des Emittenten der Attestierung oder des Empfängers sein. Dieser Ansatz macht es möglich, dass Attestierungen eine Blockchain-basierte Langlebigkeit erlangen, wobei Informationen zu Ansprüchen verschlüsselt und überprüfbar bleiben. Er erlaubt auch eine selektive Offenlegung, da der Inhaber des privaten Schlüssels die Informationen entschlüsseln kann. ### On-Chain-Attestierungen {#onchain-attestations} -On-Chain-Attestierungen werden in [Smart Contracts](/glossary/#smart-contract) auf der Ethereum-Blockchain gehalten. Der Smart Contract (als Datenerfassung fungierend) ordnet eine Attestierung einem zugehörigen dezentralisierten On-Chain-Identifikator (einem öffentlichen Schlüssel) zu. +On-Chain-Attestierungen werden in [Smart Contracts](/glossary/#smart-contract) auf der Ethereum-Blockchain gehalten. Der Smart Contract (der als Register fungiert) ordnet eine Bescheinigung einem entsprechenden dezentralen Offchain Identifikator (einem öffentlichen Schlüssel) zu. -Im Folgenden zeigt ein Beispiel, wie On-Chain-Attestierungen in der Praxis funktionieren könnten: +Hier ist ein Beispiel, das zeigt, wie Offchain Bestätigungen in der Praxis funktionieren könnten: 1. Ein Unternehmen (XYZ Corp) plant, Eigentumsanteile mit einem Smart Contract zu verkaufen, möchte aber nur Käufer, die eine Hintergrundüberprüfung abgeschlossen haben. -2. XYZ Corp kann das Unternehmen Hintergrundüberprüfungen durchführen lassen, um On-Chain-Attestierungen auf Ethereum auszugeben. Mit dieser Attestierung wird bestätigt, dass eine Person die Hintergrundüberprüfung bestanden hat, ohne dass persönliche Daten freigegeben werden. +2. XYZ Corp kann das Unternehmen Hintergrundprüfungen durchführen lassen, um Offchain Bescheinigungen für Ethereum auszustellen. Mit dieser Attestierung wird bestätigt, dass eine Person die Hintergrundüberprüfung bestanden hat, ohne dass persönliche Daten freigegeben werden. 3. Durch den Verkauf von Aktien mittels Smart Contracts kann man den Datenerfassungsvertrag auf die Identität von geprüften Käufern hin untersuchen. Das macht es möglich, mit dem Smart Contract zu bestimmen, wer Aktien kaufen darf oder nicht. -### Seelengebundene Token und Identität {#soulbound} +### Soulbound-Tokens und Identität {#soulbound} -[Seelengebundene Token](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ([nicht-übertragbare NFTs](/glossary/#nft)) könnten benutzt werden, um Informationen zu sammeln, die einzigartig für ein bestimmtes Wallet sind. Dies erzeugt eine einzigartige On-Chain-Identität, die an eine bestimmte Ethereum-Adresse gebunden ist, die Token enthalten könnte, welche wiederum bestimmte Leistungen (z. B. Abschluss eines bestimmten Online-Kurses oder das Bestehen eines Schwellenwertes in einem Spiel) oder eine Gemeinschaftsbeteiligung darstellen. +[Soulbound-Tokens](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ([nicht übertragbare NFTs](/glossary/#nft)) könnten verwendet werden, um Informationen zu sammeln, die für ein bestimmtes Wallet einzigartig sind. Dies schafft effektiv eine einzigartige On-Chain-Identität, die an eine bestimmte Ethereum-Adresse gebunden ist und Tokens enthalten kann, die Erfolge (z. B. das Abschließen eines bestimmten Online-Kurses oder das Erreichen einer Schwellenpunktzahl in einem Spiel) oder die Teilnahme an der Community repräsentieren. -## Dezentrale Identitäten verwenden {#use-decentralized-identity} +## Dezentrale Identität verwenden {#use-decentralized-identity} Es gibt viele ehrgeizige Projekte, die Ethereum als Grundlage für dezentrale Identitätslösungen verwenden: -- **[Ethereum Name Service (ENS)](https://ens.domains/)** - _Ein dezentralisiertes Namenssystem für maschinenlesbare On-chain-Identifikatoren, wie Ethereum Wallet-Adressen, Content-Hashes und Metadaten._ -- **[SpruceID](https://www.spruceid.com/)** - _Ein dezentralisiertes Identitätsprojekt, das es Benutzern erlaubt, digitale Identitäten mit Hilfe von Ethereum-Konten und ENS-Profilen zu kontrollieren, statt sich auf Dienste Dritter zu verlassen._ -- **[Ethereum Attestation Service (EAS)](https://attest.sh/)** - _Ein dezentralisiertes Ledger/Protokoll zum Erstellen von On-Ketten- oder Off-Kettenbescheinigungen über irgendetwas._ -- **[Proof of Humanity](https://www.proofofhumanity.id)** - _Proof of Humanity (Beweis des Menschseins) ist ein auf Ethereum basierendes System zur Überprüfung der sozialen Identität._ -- **[BrightID](https://www.brightid.org/)**- _Ein dezentralisiertes quelloffenes Netzwerk zur sozialen Identität, das versucht, die Identitätsüberprüfung durch die Schaffung und Analyse eines sozialen Diagramms zu reformieren._ -- **[walt.id](https://walt.id)** — _Open-Source-Infrastruktur für dezentrale Identität und Wallets, die es Entwicklern und Organisationen ermöglicht, selbstbestimmte Identität und NFTs/SBTs zu nutzen._ -- **[Veramo](https://veramo.io/)** - _Ein JavaScript-Framework, dass es für jeden vereinfacht, kryptografisch überprüfbare Daten in ihren Applikationen zu nutzen._ +- **[Ethereum Name Service (ENS)](https://ens.domains/)** – _Ein dezentrales Benennungssystem für On-Chain-, maschinenlesbare Identifikatoren wie Ethereum-Wallet-Adressen, Content-Hashes und Metadaten._ +- **[Sign in with Ethereum (SIWE)](https://siwe.xyz/)** – _Offener Standard für die Authentifizierung mit Ethereum-Konten._ +- **[SpruceID](https://www.spruceid.com/)** – _Ein dezentrales Identitätsprojekt, das es Benutzern ermöglicht, ihre digitale Identität mit Ethereum-Konten und ENS-Profilen zu kontrollieren, anstatt sich auf Drittanbieterdienste zu verlassen._ +- **[Ethereum Attestation Service (EAS)](https://attest.org/)** – _Ein dezentrales Ledger/Protokoll zur Erstellung von On-Chain- oder Off-Chain-Attestierungen über beliebige Dinge._ +- **[Proof of Humanity](https://www.proofofhumanity.id)** – _Proof of Humanity (PoH, dt. Beweis der Menschlichkeit) ist ein auf Ethereum basierendes System zur Verifizierung sozialer Identitäten._ +- **[BrightID](https://www.brightid.org/)** – _Ein dezentrales, quelloffenes soziales Identitätsnetzwerk, das die Identitätsverifizierung durch die Erstellung und Analyse eines sozialen Graphen reformieren will._ +- **[walt.id](https://walt.id)** – _Open-Source-Infrastruktur für dezentrale Identität und Wallets, die es Entwicklern und Organisationen ermöglicht, Self-Sovereign Identity (selbstbestimmte Identität) und NFTs/SBTs zu nutzen._ +- **[Veramo](https://veramo.io/)** – _Ein JavaScript-Framework, das es jedem leicht macht, kryptografisch verifizierbare Daten in seinen Anwendungen zu verwenden._ -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} ### Artikel {#articles} -- [Blockchain-Nutzungsfälle: Blockchain in digitaler Identität](https://consensys.net/blockchain-use-cases/digital-identity/) — _ConsenSys_> -- [Was ist Ethereum ERC725? Eigenständiges Identitätsmanagement in der Blockchain](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam-Stadt_ -- [Wie die Blockchain das Problem der digitalen Identität lösen könnte](https://time.com/6142810/proof-of-humanity/)— _Andrew R. Chow_ -- [Was sind dezentralisierte Identitäten und warum sollten sie Sie interessieren?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_ -- [Einführung in die dezentrale Identität](https://walt.id/white-paper/digital-identity) – _Dominik Beron_ +- [Blockchain Use Cases: Blockchain in Digital Identity](https://consensys.net/blockchain-use-cases/digital-identity/) – _ConsenSys_ +- [Was ist Ethereum ERC725? [Self-Sovereign Identity Management on the Blockchain](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) – _Sam Town_ +- [How Blockchain Could Solve the Problem of Digital Identity](https://time.com/6142810/proof-of-humanity/) – _Andrew R. Chow_ +- [What Is Decentralized Identity And Why Should You Care?](https://web3.hashnode.com/what-is-decentralized-identity) – _Emmanuel Awosika_ +- [Introduction to Decentralized Identity](https://walt.id/white-paper/digital-identity) – _Dominik Beron_ ### Videos {#videos} -- [Dezentralisierte Identität (Bonus Livestream Session)](https://www.youtube.com/watch?v=ySHNB1za_SE&t=539s) — _Ein großartiges Erklärungsvideo über dezentrale Identität von Andreas Antonopolous_ -- [Anmelden mit Ethereum und dezentralisierter Identität mit Ceramic, IDX, React, und 3ID Connect](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _YouTube-Tutorial zum Aufbau eines Identitätsmanagementsystems zum Erstellen, Lesen und Aktualisieren des Profils von Benutzern mit ihrer Ethereum-Wallet von Nader Dabit_ -- [BrightID - Dezentralisierte Identität auf Ethereum](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Podcast Bankless Episode über BrightID, eine dezentrale Identitätslösung für Ethereum_ -- [Das Off-Chain-Internet: Dezentralisierte Identität & Überprüfbare Berechtigungsnachweise](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — EthDenver 2022 Präsentation von Evin McMullen -- [Erklärung zu überprüfbaren Anmeldeinformationen](https://www.youtube.com/watch?v=ce1IdSr-Kig) – YouTube-Erklärvideo mit Demo von Tamino Baumann +- [Decentralized Identity (Bonus Livestream Session)](https://www.youtube.com/watch?v=ySHNB1za_SE&t=539s) – _Ein großartiges Erklärvideo über dezentrale Identität von Andreas Antonopolous_ +- [Sign In with Ethereum and Decentralized Identity with Ceramic, IDX, React, and 3ID Connect](https://www.youtube.com/watch?v=t9gWZYJxk7c) – _YouTube-Tutorial von Nader Dabit zum Aufbau eines Identitätsmanagementsystems zum Erstellen, Lesen und Aktualisieren des Profils eines Benutzers über sein Ethereum-Wallet._ +- [BrightID - Decentralized Identity on Ethereum](https://www.youtube.com/watch?v=D3DbMFYGRoM) – _Bankless-Podcast-Episode über BrightID, eine dezentrale Identitätslösung für Ethereum_ +- [The Offchain Internet: Decentralized Identity & Verifiable Credentials](https://www.youtube.com/watch?v=EZ_Bb6j87mg) – EthDenver 2022 Präsentation von Evin McMullen +- [Verifiable Credentials Explained](https://www.youtube.com/watch?v=ce1IdSr-Kig) – YouTube-Erklärvideo mit Demo von Tamino Baumann -### Communities {#communities} +### Communitys {#communities} -- [ERC-725 Allianz auf GitHub](https://github.com/erc725alliance) — _Unterstützer des ERC725-Standards zur Identitätsverwaltung in der Ethereum-Blockchain_ -- [EthID Discord Server](https://discord.com/invite/ZUyG3mSXFD) — _Community für Enthusiasten und Entwickler, die am Anmelden mit Ethereum arbeiten_ -- [Veramo Labs](https://discord.gg/sYBUXpACh4) — _Eine Community von Entwicklern, die zum Aufbau eines Rahmens für überprüfbare Daten für Anwendungen beitragen_ -- [walt.id](https://discord.com/invite/AW8AgqJthZ) – _Eine Gemeinschaft von Entwicklern und Erstellern, die an Anwendungsfällen für dezentrale Identität in verschiedenen Branchen arbeiten_ +- [ERC-725 Alliance auf GitHub](https://github.com/erc725alliance) – _Unterstützer des ERC725-Standards für die Identitätsverwaltung auf der Ethereum-Blockchain_ +- [EthID Discord-Server](https://discord.com/invite/ZUyG3mSXFD) – _Community für Enthusiasten und Entwickler, die an Sign-in with Ethereum und dem Ethereum Follow Protocol arbeiten._ +- [Veramo Labs](https://discord.gg/sYBUXpACh4) – _Eine Community von Entwicklern, die zum Aufbau eines Frameworks für verifizierbare Daten für Anwendungen beitragen._ +- [walt.id](https://discord.com/invite/AW8AgqJthZ) – _Eine Community von Entwicklern und Buildern, die an Anwendungsfällen für dezentrale Identität in verschiedenen Branchen arbeiten._ diff --git a/public/content/translations/de/defi/index.md b/public/content/translations/de/defi/index.md index 794915bd28c..7739b1c333d 100644 --- a/public/content/translations/de/defi/index.md +++ b/public/content/translations/de/defi/index.md @@ -1,5 +1,6 @@ --- -title: Dezentrales Finanzwesen (DeFi) +title: Dezentrale Finanzen (DeFi) +metaTitle: Was ist DeFi? | Vorteile und Einsatzmöglichkeiten der dezentralen Finanzwirtschaft description: Eine Übersicht über DeFi auf Ethereum lang: de template: use-cases @@ -22,7 +23,7 @@ Es gibt eine boomende Kryptowirtschaft, in der Sie Assets leihen und verleihen k -## DeFi vs. das traditionelle Finanzsystem {#defi-vs-tradfi} +## DeFi vs. traditionelles Finanzwesen {#defi-vs-tradfi} Um das wahre Potenzial von DeFi erkennen zu können, ist es wichtig, die aktuellen Probleme des traditionellen Finanzsystems zu kennen. @@ -31,20 +32,20 @@ Um das wahre Potenzial von DeFi erkennen zu können, ist es wichtig, die aktuell - Traditionelle Finanzdienstleistungen können der Grund sein, dass Sie nicht bezahlt werden können. - Ihre persönlichen Daten sind praktisch eine versteckte Gebühr für Finanzdienstleistungen. - Regierungen und zentralisierte Institutionen können Märkte willkürlich schließen. -- Handelszeiten am Finanzmarkt sind häufig auf die Geschäftszeiten bestimmter Zeitzonen beschränkt. +- Die Handelszeiten sind oft auf die Geschäftszeiten einer bestimmten Zeitzone beschränkt. - Transfers von Geldmitteln können aufgrund der Prozesse, die Interaktionen von Personen umfassen, Tage dauern. - Bei vielen Finanzdienstleistungen sind oftmals Vermittler (z. B. Broker) zwischengeschaltet, für die Gebühren anfallen können. ### Ein Vergleich {#defi-comparison} -| DeFi | Traditionelles Finanzsystem | -| ------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Sie halten Ihr Geld selbst. | Ihr Geld liegt bei Dritten. | -| Sie kontrollieren, wofür Ihr Geld verwendet wird und wohin es fließt. | Sie müssen Unternehmen/Banken vertrauen, dass sie Ihr Geld nicht schlecht verwalten und beispielsweise Kredite an riskante Kreditnehmer vergeben. | -| Überweisungen erfolgen in wenigen Minuten. | Überweisungen können aufgrund von manuellen Prozessen Tage dauern. | -| Transaktionstätigkeiten erfolgen pseudonymisiert. | Finanzielle Vorgänge sind eng an Ihre Identität gekoppelt. | -| DeFi ist offen für jeden. | Sie müssen sich bewerben, um Finanzdienstleistungen in Anspruch nehmen zu können. | -| Märkte sind rund um die Uhr geöffnet. | Märkte schließen, da es Beschränkungen für die Arbeitszeit von Angestellten gibt. | +| DeFi | Traditionelles Finanzsystem | +| ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Sie halten Ihr Geld selbst. | Ihr Geld liegt bei Dritten. | +| Sie kontrollieren, wofür Ihr Geld verwendet wird und wohin es fließt. | Sie müssen Unternehmen/Banken vertrauen, dass sie Ihr Geld nicht schlecht verwalten und beispielsweise Kredite an riskante Kreditnehmer vergeben. | +| Überweisungen erfolgen in wenigen Minuten. | Überweisungen können aufgrund von manuellen Prozessen Tage dauern. | +| Transaktionstätigkeiten erfolgen pseudonymisiert. | Finanzielle Vorgänge sind eng an Ihre Identität gekoppelt. | +| DeFi ist offen für jeden. | Sie müssen sich bewerben, um Finanzdienstleistungen in Anspruch nehmen zu können. | +| Märkte sind rund um die Uhr geöffnet. | Märkte schließen, da es Beschränkungen für die Arbeitszeit von Angestellten gibt. | | Basiert auf dem Transparenzprinzip – jeder kann die Daten eines Produktes einsehen und überprüfen, wie das System funktioniert. | Finanzinstitute sind wie geschlossene Bücher: Es ist nicht möglich, ihre Kredithistorie, Aufzeichnungen der verwalteten Vermögenswerte oder Ähnliches einzusehen. | @@ -55,17 +56,17 @@ Um das wahre Potenzial von DeFi erkennen zu können, ist es wichtig, die aktuell Bitcoin war in vielerlei Hinsicht die erste DeFi-Anwendung. Mit Bitcoin können Sie den Wert selbst besitzen, kontrollieren und überall auf der Welt hinsenden. Bitcoin bietet vielen Menschen, die sich gegenseitig nicht vertrauen, die Möglichkeit, eine Einigung über einen aktuellen Transaktionsstatus und Stand aller Konten zu erzielen, ohne dass dafür ein vertrauenswürdiger Vermittler vonnöten ist. Bitcoin ist offen für jeden und niemand ist befugt, Regeln zu ändern. Die Regeln von Bitcoin, wie die Knappheit und Offenheit, sind in der Technologie niedergeschrieben. Es ist nicht wie im traditionellen Finanzwesen, wo Regierungen Geld drucken können, das Ihre Ersparnisse entwertet, und Unternehmen die Märkte schließen können. -Darauf baut Ethereum auf. Wie bei Bitcoin, können die Regeln sich nicht ändern und jeder hat Zugang dazu. Doch zusätzlich macht Ethereum dieses digitale Geld programmierbar, und zwar mit[Smart Contracts](/glossary/#smart-contract). Dies bietet über das Speichern und Senden von Werten hinaus noch viele weitere Möglichkeiten. +Darauf baut Ethereum auf. Wie bei Bitcoin, können die Regeln sich nicht ändern und jeder hat Zugang dazu. Aber es macht dieses digitale Geld auch programmierbar, indem [Smart Contracts](/glossary/#smart-contract) verwendet werden, sodass Sie über das Speichern und Senden von Werten hinausgehen können. ## Programmierbares Geld {#programmable-money} -Das klingt merkwürdig... „Warum würde ich mein Geld programmieren wollen?“ Das ist tatsächlich eher ein Standardmerkmal der Token auf Ethereum. Jeder kann Logik in Zahlungen programmieren. Auf diese Weise erhalten Sie die Kontrolle und Sicherheit wie bei Bitcoin in Verbindung mit Dienstleistungen, die von Finanzinstituten bereitgestellt werden. Das eröffnet Möglichkeiten für Kryptowährungen, die mit Bitcoin nicht gegeben sind, wie z. B. das Vergeben oder Beanspruchen von Krediten, Terminplanung von Zahlungen, Investitionen in Indexfonds und vieles mehr. +Das klingt seltsam ... „Warum sollte ich mein Geld programmieren wollen?“ Das ist tatsächlich eher ein Standardmerkmal der Token auf Ethereum. Jeder kann Logik in Zahlungen programmieren. Auf diese Weise erhalten Sie die Kontrolle und Sicherheit wie bei Bitcoin in Verbindung mit Dienstleistungen, die von Finanzinstituten bereitgestellt werden. Das eröffnet Möglichkeiten für Kryptowährungen, die mit Bitcoin nicht gegeben sind, wie z. B. das Vergeben oder Beanspruchen von Krediten, Terminplanung von Zahlungen, Investitionen in Indexfonds und vieles mehr. - +
Machen Sie sich mit unseren Vorschlägen für DeFi-Anwendungen vertraut und testen sie, wenn Sie neu bei Ethereum sind.
DeFi-Apps entdecken @@ -77,37 +78,37 @@ Das klingt merkwürdig... „Warum würde ich mein Geld programmieren wollen?“ Für fast alle Finanzdienstleistungen gibt es dezentrale Alternativen. Ethereum aber schafft zudem Möglichkeiten, komplett neue Finanzprodukte zu gestalten. Im Folgenden eine Liste mit Beispielen, die ständig länger wird: -- [Geld rund um die Welt senden](#send-money) -- [Geld rund um die Welt „streamen“](#stream-money) -- [Zugang zu stabilen Währungen](#stablecoins) -- [Kredite mit hinterlegten Sicherheiten aufnehmen](#lending) -- [Kredite ohne hinterlegte Sicherheiten aufnehmen](#flash-loans) -- [Krypto-Sparkonten eröffnen](#saving) -- [Mit Token handeln](#swaps) -- [Das eigene Portfolio vergrößern](#investing) +- [Geld um die ganze Welt senden](#send-money) +- [Geld um den Globus streamen](#stream-money) +- [Auf stabile Währungen zugreifen](#stablecoins) +- [Kredite mit Sicherheiten aufnehmen](#lending) +- [Kredite ohne Sicherheiten aufnehmen](#flash-loans) +- [Mit Krypto-Sparen beginnen](#saving) +- [Token handeln](#swaps) +- [Ihr Portfolio vergrößern](#investing) - [Ihre Ideen finanzieren](#crowdfunding) -- [Versicherungen abschließen](#insurance) -- [Das eigene Portfolio verwalten](#aggregators) +- [Versicherung abschließen](#insurance) +- [Ihr Portfolio verwalten](#aggregators) ### Geld schnell um die ganze Welt senden {#send-money} -Als Blockchain ist Ethereum für sichere und globale Transaktionen konzipiert. Wie auch Bitcoin macht Ethereum das weltweite Senden von Geld so einfach wie das Versenden einer E-Mail. Geben Sie einfach den [ENS-Namen](/glossary/#ens) des Empfängers (z. B. bob.eth) oder die Kontoadresse der Wallet ein und schon geht die Zahlung (typischerweise) innerhalb von Minuten direkt beim Empfänger ein. Zum Senden oder Empfangen von Zahlungen ist eine [Wallet](/wallets/) erforderlich. +Als Blockchain ist Ethereum für sichere und globale Transaktionen konzipiert. Wie auch Bitcoin macht Ethereum das weltweite Senden von Geld so einfach wie das Versenden einer E-Mail. Geben Sie einfach den [ENS-Namen](/glossary/#ens) des Empfängers (z. B. bob.eth) oder seine Kontoadresse aus Ihrer Wallet ein, und Ihre Zahlung geht (normalerweise) innerhalb weniger Minuten direkt an ihn. Um Zahlungen zu senden oder zu empfangen, benötigen Sie eine [Wallet](/wallets/). - Siehe Zahlungs-dApps + Zahlungs-Dapps ansehen #### Geld um die Welt „streamen“... {#stream-money} Über Ethereum lässt sich auch Geld streamen. So können Sie das Gehalt für Personen sekündlich überweisen und geben ihnen damit Zugang zu ihrem verdienten Geld, wann immer sie es gerade benötigen. Ein weiterer Anwendungsfall wäre beispielsweise das Mieten von Objekten, wie z. B. Schließfächer oder E-Scooter, auf sekündlicher Basis. -Und wenn Sie keine [ETH](/glossary/#ether) senden oder streamen wollen, weil sich der Wert so stark verändern kann, gibt es alternative Währungen auf Ethereum: [Stablecoins](/glossary/#stablecoin). +Und wenn Sie [ETH](/glossary/#ether) nicht senden oder streamen möchten, weil sich sein Wert so stark ändern kann, gibt es alternative Währungen auf Ethereum: [Stablecoins](/glossary/#stablecoin). -### Zugriff auf Stablecoins {#stablecoins} +### Zugriff auf stabile Währungen {#stablecoins} Die Volatilität von Kryptowährungen ist ein Problem für viele Finanzprodukte und allgemein für den Einsatz als Zahlungsmittel. Dieses Problem hat die DeFi-Community mit Stablecoins gelöst. Ihr Wert ist an ein anderes Asset gebunden, typischerweise beliebte Währungen wie der Dollar. @@ -127,28 +128,28 @@ Es gibt zwei etablierte Möglichkeiten, um Geld von dezentralen Anbietern zu lei - Pool-basiert, das heißt Kreditgeber stellen Geldmittel (Liquidität) für einen Pool bereit, aus dem Kreditnehmer die Mittel leihen können. - Siehe Lending-dApps + Kredit-Dapps ansehen Auf dezentrale Kreditanbieter zurückzugreifen, bietet viele Vorteile... -#### Geld leihen mit Privatsphäre {#borrowing-privacy} +#### Kreditaufnahme mit Datenschutz {#borrowing-privacy} Bei der Vergabe und Inanspruchnahme von Krediten dreht sich heutzutage alles um die beteiligten Einzelpersonen. Banken müssen vor einer Kreditvergabe wissen, ob man wahrscheinlich in der Lage ist, den Kredit zurückzuzahlen. -Eine dezentrale Kreditvergabe funktioniert vollständig ohne Identifikation der involvierten Parteien. Stattdessen muss der Kreditnehmer eine Sicherheit stellen, die der Kreditgeber automatisch erhält, wenn der Kredit nicht zurückgezahlt wird. Manche Kreditanbieter nehmen sogar [NFTs](/glossary/#nft) als Sicherheiten an. NFTs kann man sich wie eine Besitzurkunde für einen bestimmten Vermögenswert vorstellen. [Mehr zu NFTs](/nft/) +Eine dezentrale Kreditvergabe funktioniert vollständig ohne Identifikation der involvierten Parteien. Stattdessen muss der Kreditnehmer eine Sicherheit stellen, die der Kreditgeber automatisch erhält, wenn der Kredit nicht zurückgezahlt wird. Manche Kreditgeber akzeptieren sogar [NFTs](/glossary/#nft) als Sicherheit. NFTs kann man sich wie eine Besitzurkunde für einen bestimmten Vermögenswert vorstellen. [Mehr zu NFTs](/nft/) Das ermöglicht es, ohne Kreditchecks und Preisgabe von privaten Informationen Geld zu borgen. -#### Zugang zu globalen Geldmitteln {#access-global-funds} +#### Zugriff auf globale Geldmittel {#access-global-funds} -Wenn Sie auf einen dezentralen Kreditgeber setzen, erhalten Sie Zugang zu allen hinterlegten Assets überall auf der Welt und nicht nur zu denen, die im Depot Ihrer Bank oder Institution verwaltet werden. Damit werden Kredite leichter zugänglich und die Zinssätze verbessern sich. +Wenn Sie auf einen dezentralen Kreditgeber setzen, erhalten Sie Zugang zu allen hinterlegten Assets überall auf der Welt und nicht nur zu denen, die im Depot Ihrer Bank oder Institution verwaltet werden. Dadurch werden Kredite leichter zugänglich und die Zinssätze verbessern sich. #### Steuervorteile {#tax-efficiencies} Wenn Sie Geld leihen, erhalten Sie Zugang zu Assets und müssen nicht Ihr ETH verkaufen (ein steuerpflichtiger Vorgang). Stattdessen können Sie ETH als Sicherheit für einen Stablecoin-Kredit verwenden. Damit erhalten Sie den benötigten Cashflow, ohne Ihre ETH verkaufen zu müssen. Stablecoins sind Token, die als Zahlungsmittel wesentlich besser geeignet sind, da sie anders als ETH keinen Wertschwankungen unterliegen. [Mehr zu Stablecoins](#stablecoins) -#### Flash Loans {#flash-loans} +#### Flash-Loans {#flash-loans} Flash Loans, also Blitzkredite, sind eine experimentelle Form der dezentralen Kreditaufnahme. Dabei können Sie Geld leihen, ohne Sicherheiten oder persönliche Informationen hinterlegen zu müssen. @@ -172,27 +173,27 @@ Gäbe es an Handelsplatz B kurzfristig zu wenig Angebot von Assets, wodurch Sie Um das obige Beispiel in der etablierten Finanzwelt umzusetzen, benötigten Sie sehr viel Geld. Diese Strategien des Geldverdienens sind jenen mit großem bestehenden Vermögen vorbehalten. Flash Loans sind ein Beispiel einer Zukunft, in der der Besitz von Geld nicht die Voraussetzung dafür ist, Geld zu verdienen. - Mehr zu Flash Loans + Mehr zu Flash-Loans -### Jetzt mit dem Kryptosparen beginnen {#saving} +### Mit Krypto sparen {#saving} -#### Darlehen {#lending} +#### Kreditvergabe {#lending} Sie können Ihrer Krypto in Echtzeit beim Wachsen zusehen, indem Sie sie verleihen und Zinsen verdienen. Aktuell sind diese Zinssätze um einiges höher als bei lokalen Banken (wenn Sie das Glück haben, Zugang dazu zu haben). Hier ein Beispiel: -- Sie verleihen 100 Dai, ein [Stablecoin](/stablecoins/), an ein Produkt wie z. B. Aave. +- Sie verleihen Ihre 100 Dai, einen [Stablecoin](/stablecoins/), an ein Produkt wie Aave. - Sie erhalten einen Token, der für Ihr verliehenes Dai steht, also 100 Aave Dai (aDai). -- Ihr aDai steigt auf Grundlage der Zinssätze an und Sie können Ihr Guthaben in Ihrer Wallet wachsen sehen. Abhängig von der [APR](/glossary/#apr) kann Ihr Wallet-Guthaben beispielsweise nach ein paar Tagen und sogar nur ein paar Stunden 100,1234 anzeigen! +- Ihr aDai steigt auf Grundlage der Zinssätze an und Sie können Ihr Guthaben in Ihrer Wallet wachsen sehen. Abhängig vom [APR](/glossary/#apr) zeigt Ihr Wallet-Guthaben nach ein paar Tagen oder sogar Stunden einen Wert wie 100,1234 an! - Sie können dann jederzeit normales Dai in Höhe Ihres aDai-Guthabens abheben. - Zu Lending-dApps + Lending-Dapps ansehen -#### No-Loss-Lotterien {#no-loss-lotteries} +#### Verlustfreie Lotterien {#no-loss-lotteries} No-Loss-Lotterien wie zum Beispiel PoolTogether sind ein lustiger und innovativer Weg, Geld zu sparen. @@ -205,7 +206,7 @@ No-Loss-Lotterien wie zum Beispiel PoolTogether sind ein lustiger und innovative Der Gewinnpool wird aus allen Zinsen gewonnen, die durch das Verleihen der Ticketanzahlungen wie im Beispiel zum Verleihen oben generiert wurden. - PoolTogether testen + PoolTogether ausprobieren @@ -217,36 +218,36 @@ Auf Ethereum gibt es Tausende Token. Der Handel mit verschiedenen Token erfolgt Wenn Sie zum Beispiel die No-Loss-Lotterie PoolTogether (wie oben beschrieben) nutzen möchten, benötigen Sie einen Token wie Dai oder USDC. An diesen DEXs können Sie Ihr ETH gegen solche Token eintauschen. Sobald Sie fertig sind, ist es wieder möglich, diese Token zurückzutauschen. - Zu Token-Handesplätzen + Token-Börsen ansehen -### Erweitertes Trading {#trading} +### Fortgeschrittener Handel {#trading} Für Trader, die sich mehr Kontrolle wünschen, gibt es fortgeschrittenere Optionen. Limit Orders, Perpetuals, Margin Trading und vieles mehr ist möglich. Mit dezentralem Trading erhalten Sie Zugang zu globaler Liquidität. Der Markt schließt nie und Sie haben immer volle Kontrolle über Ihre Assets. Wenn Sie sich für einen zentralen Handelsplatz entscheiden, müssen Sie Ihre Assets vor dem Handeln zuerst hinterlegen und darauf vertrauen, dass der Anbieter diese sicher verwahrt. Während Ihre Assets bei dem Anbieter hinterlegt sind, sind sie dem Risiko von Hackerangriffen ausgesetzt. - Zu Trading-dApps + Trading-Dapps ansehen -### Das eigene Portfolio vergrößern {#investing} +### Ihr Portfolio vergrößern {#investing} Auf Ethereum gibt es auch Produkte für das Portfoliomanagement, deren Ziel es ist, Ihr Portfolio mit einer Strategie Ihrer Wahl zu vergrößern. Das erfolgt automatisch, ist offen für jeden und Sie benötigen keinen realen Manager, der einen Anteil an Ihren Gewinnen beansprucht. -Ein gutes Beispiel ist der [DeFi Pulse Index Fund (DPI)](https://defipulse.com/blog/defi-pulse-index/). Es handelt sich um einen Fonds, der automatisch ein Rebalancing durchführt, um sicherzustellen, dass Ihr Portfolio immer die besten DeFi-Token nach Marktkapitalisierung enthält. Sie werden niemals irgendwelche Details verwalten müssen und können jederzeit Abhebungen aus dem Fonds tätigen. +Ein gutes Beispiel ist der [DeFi Pulse Index-Fonds (DPI)](https://defipulse.com/blog/defi-pulse-index/). Es handelt sich um einen Fonds, der automatisch ein Rebalancing durchführt, um sicherzustellen, dass Ihr Portfolio immer die besten DeFi-Token nach Marktkapitalisierung enthält. Sie werden niemals irgendwelche Details verwalten müssen und können jederzeit Abhebungen aus dem Fonds tätigen. - Zu Investment-dApps + Investment-Dapps ansehen -### Eigene Ideen finanzieren {#crowdfunding} +### Ihre Ideen finanzieren {#crowdfunding} Ethereum ist die ideale Platform für Crowdfunding: @@ -255,12 +256,12 @@ Ethereum ist die ideale Platform für Crowdfunding: - Spendensammler können automatische Erstattungen einrichten, wenn es beispielsweise eine bestimmte Frist und einen Mindestbetrag gibt, die bzw. der nicht eingehalten oder erreicht wird. - Zu Crowdfunding-dApps + Crowdfunding-Dapps ansehen #### Quadratische Finanzierung {#quadratic-funding} -Ethereum ist Open-Source-Software und ein Großteil der bisherigen Arbeit wurde von der Community finanziert. Das hat zur Entwicklung eines interessanten neuen Fundraising-Modells geführt: die quadratische Finanzierung. Damit lässt sich die Art und Weise, wie wir in Zukunft alle Arten von öffentlichen Gütern finanzieren, verbessern. +Ethereum ist Open-Source-Software und ein Großteil der bisherigen Arbeit wurde von der Community finanziert. Das hat zur Entwicklung eines interessanten neuen Fundraising-Modells geführt: die quadratische Finanzierung. Dieses Modell hat das Potenzial die Art und Weise zu verbessern, wie wir in Zukunft alle Arten von öffentlichen Gütern finanzieren. Über die quadratische Finanzierung wird sichergestellt, dass die Projekte mit dem größten individuellen Bedarf auch die meisten Mittel erhalten. Mit anderen Worten: Projekte, die das Leben der meisten Menschen verbessern können. So funktioniert es: @@ -272,7 +273,7 @@ Ethereum ist Open-Source-Software und ein Großteil der bisherigen Arbeit wurde Projekt A mit 100 Spenden zu je 1 Euro könnte also mehr Mittel erhalten als Projekt B mit einer einzelnen Spende von 10.000 Euro (abhängig von der Größe des übereinstimmenden Pools). - Zu quadratischer Finanzierung + Mehr über quadratische Finanzierung @@ -281,10 +282,10 @@ Projekt A mit 100 Spenden zu je 1 Euro könnte also mehr Mittel erhalten als Pro Eine dezentralisierte Versicherung zielt darauf ab, Versicherungen billiger und transparenter zu machen sowie Versicherungsfälle schneller auszuzahlen. Mit einem höherem Grad an Automatisierung wird der Versicherungsschutz erschwinglicher und die Auszahlungen erfolgen wesentlich schneller. Die Daten, die zur Entscheidung über Ihren Versicherungsfall genutzt werden, sind vollkommen transparent. -Bei Ethereum-Produkten gibt es wie auch bei jeder anderen Software Fehler und Exploits. Derzeit liegt beispielsweise bei vielen Versicherungsprodukten in diesem Bereich der Schwerpunkt auf dem Schutz der Benutzer vor finanziellen Verlusten. Es gibt jedoch Projekte, die damit beginnen, einen Versicherungsschutz für alles Unwägbarkeiten aufzubauen, die das Leben uns bescheren kann. Ein gutes Beispiel ist die Ernteversicherung von Etherisc. Es wird versucht, [Kleinbauern in Kenia gegen Dürren und Überschwemmungen abzusichern](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc). Dezentrale Versicherungen können Landwirten, denen herkömmliche Versicherungen oft zu teuer sind, einen erschwinglichen Versicherungsschutz bieten. +Ethereum Produkte können wie jede andere Software an Fehlern und Exploits leiden. Derzeit liegt beispielsweise bei vielen Versicherungsprodukten in diesem Bereich der Schwerpunkt auf dem Schutz der Benutzer vor finanziellen Verlusten. Es gibt jedoch Projekte, die damit beginnen, einen Versicherungsschutz für alles Unwägbarkeiten aufzubauen, die das Leben uns bescheren kann. Ein gutes Beispiel hierfür ist Etheriscs „Crop Cover“, das [Kleinbauern in Kenia vor Dürren und Überschwemmungen schützen](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc) soll. Dezentrale Versicherungen können Landwirten, denen herkömmliche Versicherungen oft zu teuer sind, einen erschwinglichen Versicherungsschutz bieten. - Zu Versicherungs-dApps + Versicherungs-Dapps ansehen @@ -294,7 +295,7 @@ Bei Ethereum-Produkten gibt es wie auch bei jeder anderen Software Fehler und Ex Bei all diesen Entwicklungen brauchen Sie einen Weg, um alle Ihre Investitionen, Darlehen und Trades im Auge zu behalten. Es gibt eine Reihe von Produkten, mit denen Sie alle Ihre DeFi-Aktivitäten zentral koordinieren können. Das ist der Vorteil der offenen Architektur von DeFi. Teams können Schnittstellen entwickeln, über die Sie nicht nur Ihr Guthaben für alle Produkte sehen, sondern zusätzlich auch deren Funktionen nutzen können. Das finden Sie vielleicht nützlich, wenn Sie sich umfassender mit DeFi vertraut machen. - Zu Portfolio-dApps + Portfolio-Dapps ansehen @@ -323,21 +324,21 @@ Ethereum ist aus mehreren Gründen die perfekte Grundlage für DeFi: DeFi ist praktisch ein Ebenenmodell: 1. Die Blockchain: Ethereum enthält den Transaktionsverlauf und den Status der Konten. -2. Die Assets: [ETH](/what-is-ether/) und die anderen Token (Währungen). -3. Die Protokolle – [Smart Contracts](/glossary/#smart-contract), die die Funktionalität bereitstellen, z.B. einen Dienst, der die dezentrale Ausleihe von Vermögenswerten ermöglicht. -4. [Die Anwendungen](/apps/): Produkte die wir benutzen, um Protokolle zu verwalten und auf diese zuzugreifen. +2. Die Vermögenswerte – [ETH](/what-is-ether/) und die anderen Token (Währungen). +3. Die Protokolle – [Smart Contracts](/glossary/#smart-contract), die die Funktionalität bereitstellen, zum Beispiel ein Dienst, der die dezentrale Kreditvergabe von Vermögenswerten ermöglicht. +4. [Die Anwendungen](/apps/) – die Produkte, die wir verwenden, um die Protokolle zu verwalten und auf sie zuzugreifen. -Merke: Vieles von DeFi nutzt den [ERC-20-Standard](/glossary/#erc-20). Anwendungen in DeFi nutzen einen Wrapper namens „Wrapped Ether“ (WETH) für ETH. [Erfahren Sie mehr über Wrapped Ether](/wrapped-eth). +Hinweis: Ein Großteil von DeFi verwendet den [ERC-20-Standard](/glossary/#erc-20). Anwendungen in DeFi verwenden einen Wrapper für ETH namens Wrapped Ether (WETH). [Erfahren Sie mehr über Wrapped Ether](/wrapped-eth). -## DeFi aufbauen {#build-defi} +## DeFi entwickeln {#build-defi} DeFi ist eine Open-Source-Bewegung. DeFi-Protokolle und -Anwendungen sind für jeden offen, um sie zu überprüfen, aufzuspalten und zu verbessern. Durch diese kombinierten Ebenen oder Layer (sie teilen alle die gleiche Basis-Blockchain und Assets) können Protokolle vermischt und aufeinander abgestimmt werden, um neue einzigartige Möglichkeiten zu schaffen. - Mehr zum Erstellen von dApps + Mehr zum Erstellen von Dapps -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} ### DeFi-Daten {#defi-data} @@ -346,18 +347,19 @@ DeFi ist eine Open-Source-Bewegung. DeFi-Protokolle und -Anwendungen sind für j ### DeFi-Artikel {#defi-articles} -- [Ein Leitfaden für Einsteiger in DeFi](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) – _Sid Coelho-Prabhu, 6. Januar 2020_ +- [Ein Leitfaden für Anfänger zu DeFi](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) – _Sid Coelho-Prabhu, 6. Januar 2020_ +- [EEA DeFi Risk Assessment Guidelines](https://entethalliance.org/specs/defi-risks/) – Ein von der Branche unterstützter Überblick, wie man die wichtigsten Risiken in DeFi-Protokollen identifiziert und bewertet. ### Videos {#videos} -- [Finanzmathematik – mehr erfahren über dezentralisierte Finanzmärkte](https://finematics.com/) – _Videos zu DeFi_ -- [The Defiant](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq) - _DeFi-Grundlagen: Alles, was Sie wissen müssen, um in diesem gelegentlich verblüffenden Bereich durchzustarten._ -- [Whiteboard-Krypto](https://youtu.be/17QRFlml4pA) _Was ist DeFi?_ +- [Finematics – Bildung im Bereich dezentrales Finanzwesen](https://finematics.com/) – _Videos zu DeFi_ +- [The Defiant](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq) – _DeFi-Grundlagen: Alles, was Sie für den Einstieg in diesen manchmal verwirrenden Bereich wissen müssen._ +- [Whiteboard Crypto](https://youtu.be/17QRFlml4pA) – _Was ist DeFi?_ -### Communities {#communities} +### Communitys {#communities} -- [DeFi Llama Discord Server](https://discord.defillama.com/) -- [DeFi Pulse Discord Server](https://discord.gg/Gx4TCTk) +- [DeFi Llama Discord-Server](https://discord.defillama.com/) +- [DeFi Pulse Discord-Server](https://discord.gg/Gx4TCTk) diff --git a/public/content/translations/de/desci/index.md b/public/content/translations/de/desci/index.md index 7c5049acdcd..397e4ad0f3e 100644 --- a/public/content/translations/de/desci/index.md +++ b/public/content/translations/de/desci/index.md @@ -14,11 +14,11 @@ summaryPoint3: Baut auf der Open-Science-Bewegung auf. ## Was ist dezentralisierte Wissenschaft (DeSci)? {#what-is-desci} -Die dezentralisierte Wissenschaft (DeSci) ist eine Bewegung mit dem Ziel, eine öffentliche Infrastruktur für die faire und gerechte Finanzierug, Schaffung, Überprüfung, Zueignung, Speicherung und Verbreitung von wissenschaftlichem Wissen mithilfe des [Web3](/glossary/#web3)-Stack zu errichten. +Dezentralisierte Wissenschaft (DeSci) ist eine Bewegung, die darauf abzielt, eine öffentliche Infrastruktur für die Finanzierung, Erstellung, Überprüfung, Anerkennung, Speicherung und Verbreitung von wissenschaftlichem Wissen fair und gerecht unter Verwendung des [Web3](/glossary/#web3)-Stacks aufzubauen. DeSci zielt darauf ab, ein Ökosystem zu schaffen, in dem Wissenschaftler ermutigt werden, ihre Forschungsergebnisse offen zu teilen und Anerkennung für ihre Arbeit zu erhalten. Gleichzeitig wird Fachleuten, die ihre eigenen Leistungen einbringen möchten, der Zugang zur Forschung ermöglicht. DeSci arbeitet mit der Idee, dass wissenschaftliche Erkenntnisse für alle zugänglich und der Prozess der wissenschaftlichen Forschung transparent sein sollte. DeSci schafft ein dezentraleres und verteiltes wissenschaftliches Forschungsmodell, das widerstandsfähiger gegen Zensur und Kontrolle durch zentrale Behörden ist. DeSci hofft, eine Umgebung zu schaffen, in der neue und unkonventionelle Ideen gedeihen können, indem der Zugang zu Finanzierung, wissenschaftlichen Werkzeugen und Kommunikationskanälen dezentralisiert wird. -Die dezentralisierte Wissenschaft ermöglicht eine vielfältigere Finanzierung aus verschiedenen Quellen (von [DAOs](/glossary/#dao) über [quadratische Spenden](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) bis hin zu Crowdfunding und mehr), einen leichteren Zugang zu Daten und Methoden sowie Anreize für die Reproduzierbarkeit. +Dezentrale Wissenschaft ermöglicht vielfältigere Finanzierungsquellen (von [DAOs](/glossary/#dao) über [quadratische Spenden](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) bis hin zu Crowdfunding und mehr), einen leichteren Zugang zu Daten und Methoden und bietet Anreize für Reproduzierbarkeit. ### Juan Benet - Die DeSci-Bewegung @@ -28,16 +28,16 @@ Die dezentralisierte Wissenschaft ermöglicht eine vielfältigere Finanzierung a Eine unvollständige Liste von zentralen Problemen in der Wissenschaft und wie dezentralisierte Wissenschaft dazu beitragen kann, diese Probleme anzugehen -| **Dezentralisierte Wissenschaft** | **Traditionelle Wissenschaft** | -| -------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Die Verteilung von Geldmitteln wird **von der Öffentlichkeit bestimmt**, indem Mechanismen wie quadratische Spenden oder DAOs genutzt werden. | Kleine, geschlossene, **zentralisierte Gruppen** kontrollieren die Verteilung von Geldmitteln. | -| Sie arbeiten mit Kollegen aus **der ganzen Welt** zusammen. | Finanzierungsorganisationen und Heimatinstitutionen **limitieren** Ihre Kollaborationen. | -| Finanzierungsentscheidungen finden online und **transparent** statt. Es werden neue Finanzierungsmechanismen erforscht. | Finanzierungsentscheidungen werden mit langer Bearbeitungszeit und **limitierter Transparenz** durchgeführt. Es gibt nur wenige Finanzierungsmechanismen. | -| Die gemeinsame Nutzung von Labor-Dienstleistungen wird leichter und transparenter durch [Web3](/glossary/#web3)-Technologie. | Die gemeinsame Nutzung von Labor-Dienstleistungen ist meist **langsam und undurchsichtig**. | -| **Neue Veröffentlichungsmodelle**, die Web3-Primitiven für Vertrauen, Transparenz und universellen Zugriff nutzen, können entwickelt werden. | Sie veröffentlichen über etablierte Wege, die oft als **ineffizient, voreingenommen and ausbeuterisch** eingestuft werden. | -| Sie können **Tokens und Reputation durch Peer-Review-Arbeit verdienen**. | Ihre **Peer-Review-Arbeit ist unbezahlt**, was für gewinnorientierte Herausgeber von Vorteil ist. | -| **Sie besitzen das geistige Eigentum (IP)**, das Sie generieren und verteilen es den transparenten Bedingungen entsprechend. | **Ihre Heimatinstitution besitzt das IP**, das Sie generieren. Der Zugang zum IP ist nicht sichtbar. | -| **Das Teilen von allen durchgeführten Forschungsarbeiten**, einschließlich der Daten von erfolglosen Versuchen, indem alle Schritte On-Chain sind. | **Publikations-Bias** heißt, dass Forscher eher Experimente mit erfolgreichen Ergebnissen veröffentlichen. | +| **Dezentralisierte Wissenschaft** | **Traditionelle Wissenschaft** | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Die Verteilung der Mittel wird **von der Öffentlichkeit** mittels Mechanismen wie quadratischen Spenden oder DAOs **bestimmt**. | Kleine, geschlossene, **zentralisierte Gruppen** kontrollieren die Verteilung der Mittel. | +| Sie arbeiten mit Kollegen aus **der ganzen Welt** in dynamischen Teams zusammen. | Finanzierungsorganisationen und Heimateinrichtungen **beschränken** Ihre Zusammenarbeit. | +| Finanzierungsentscheidungen werden online und **transparent** getroffen. Es werden neue Finanzierungsmechanismen erforscht. | Finanzierungsentscheidungen werden mit einer langen Bearbeitungszeit und **begrenzter Transparenz** getroffen. Es gibt nur wenige Finanzierungsmechanismen. | +| Der Austausch von Labordienstleistungen wird durch den Einsatz der [Web3](/glossary/#web3)-Technologie einfacher und transparenter. | Der Austausch von Laborressourcen ist oft **langsam und undurchsichtig**. | +| Es können **neue Veröffentlichungsmodelle** entwickelt werden, die Web3-Primitive für Vertrauen, Transparenz und universellen Zugang nutzen. | Sie veröffentlichen über etablierte Wege, die häufig als **ineffizient, voreingenommen und ausbeuterisch** eingestuft werden. | +| Sie können **Token und Reputation für das Peer-Reviewing** von Arbeiten **verdienen**. | Ihre **Peer-Review-Arbeit ist unbezahlt** und kommt gewinnorientierten Verlagen zugute. | +| **Sie besitzen das geistige Eigentum (IP)**, das Sie generieren, und verteilen es gemäß transparenter Bedingungen. | **Ihre Heimateinrichtung besitzt das geistige Eigentum**, das Sie generieren. Der Zugang zum IP ist nicht sichtbar. | +| **Die gesamte Forschung teilen**, einschließlich der Daten aus erfolglosen Bemühungen, indem alle Schritte on-chain festgehalten werden. | **Publikations-Bias** bedeutet, dass Forscher eher Experimente mit erfolgreichen Ergebnissen teilen. | ## Ethereum und DeSci {#ethereum-and-desci} @@ -47,11 +47,11 @@ Ein dezentralisiertes Wissenschaftssystem erfordert robuste Sicherheit, minimale DeSci baut das spezifische Instrumentarium, um die traditionelle akademische Welt in die digitale Welt zu integrieren. Im Folgenden finden Sie eine Auswahl von Anwendungsfällen, die Web3 der wissenschaftlichen Gemeinschaft bieten kann. -### Veröffentlichung (Publishing) {#publishing} +### Veröffentlichung {#publishing} -Das wissenschaftliche Publizieren ist bekanntermaßen problematisch, weil es von Verlagen verwaltet wird, die auf die kostenlose Arbeit von Wissenschaftlern, Gutachtern und Redakteuren angewiesen sind, um die Veröffentlichungen zu erstellen, dann aber exorbitante Veröffentlichungsgebühren verlangen. Die Öffentlichkeit, die in der Regel indirekt durch Steuern für das Werk und die Veröffentlichungskosten gezahlt hat, kann oft nicht auf dasselbe Werk zugreifen, ohne den Verleger erneut zu bezahlen. Die Gesamtkosten für die Publikation einzelner wissenschaftlicher Arbeiten belaufen sich oft auf fünfstellige Beträge (USD), wodurch das gesamte Konzept wissenschaftlicher Erkenntnisse als [öffentliches Gut](/glossary/#public-goods) untergraben wird, während gleichzeitig enorme Gewinne für eine kleine Gruppe von Verlegern erzielt werden. +Das wissenschaftliche Publizieren ist bekanntermaßen problematisch, weil es von Verlagen verwaltet wird, die auf die kostenlose Arbeit von Wissenschaftlern, Gutachtern und Redakteuren angewiesen sind, um die Veröffentlichungen zu erstellen, dann aber exorbitante Veröffentlichungsgebühren verlangen. Die Öffentlichkeit, die in der Regel indirekt durch Steuern für das Werk und die Veröffentlichungskosten gezahlt hat, kann oft nicht auf dasselbe Werk zugreifen, ohne den Verleger erneut zu bezahlen. Die Gesamtkosten für die Veröffentlichung einzelner wissenschaftlicher Arbeiten belaufen sich oft auf fünfstellige Beträge ($ USD), was das gesamte Konzept wissenschaftlicher Erkenntnisse als [öffentliches Gut](/glossary/#public-goods) untergräbt, während gleichzeitig enorme Gewinne für eine kleine Gruppe von Verlegern erzielt werden. -Kostenlose und frei zugängliche Plattformen gibt es in Form von Preprint-Servern, wie [ArXiv](https://arxiv.org/). Diesen Plattformen mangelt es jedoch an Qualitätskontrollen, [Anti-Sybil-Mechanismen](/glossary/#anti-sybil). Sie verfolgen in der Regel keine Qualitätskriterien auf Artikelniveau, was bedeutet, dass sie in der Regel nur dazu dienen, die Arbeiten zu veröffentlichen, ehe sie bei einem traditionellen Verlag eingereicht werden. SciHub macht auch publizierte Arbeiten frei zugänglich. Dies geschieht jedoch nicht auf legalem Weg, sondern erst, nachdem die Verlage ihre Bezahlung erhalten haben und die Arbeit in ein strenges Urheberrecht verpackt wurde. Dies hinterlässt eine kritische Lücke für zugängliche wissenschaftliche Publikationen und empirischen Daten mit einem eingebetteten Legitimationsmechanismus und Motivationsmodell. Die Werkzeuge für den Aufbau eines solchen Systems gibt es in Web3. +Kostenlose und frei zugängliche Plattformen gibt es in Form von Preprint-Servern, [wie ArXiv](https://arxiv.org/). Diesen Plattformen mangelt es jedoch an Qualitätskontrollen und [Anti-Sybil-Mechanismen](/glossary/#anti-sybil). Sie verfolgen in der Regel keine Metriken auf Artikelebene, was bedeutet, dass sie normalerweise nur dazu dienen, Arbeiten vor der Einreichung bei einem traditionellen Verlag bekannt zu machen. SciHub macht auch publizierte Arbeiten frei zugänglich. Dies geschieht jedoch nicht auf legalem Weg, sondern erst, nachdem die Verlage ihre Bezahlung erhalten haben und die Arbeit in ein strenges Urheberrecht verpackt wurde. Dies hinterlässt eine kritische Lücke für zugängliche wissenschaftliche Publikationen und empirischen Daten mit einem eingebetteten Legitimationsmechanismus und Motivationsmodell. Die Werkzeuge für den Aufbau eines solchen Systems gibt es in Web3. ### Reproduzierbarkeit und Replizierbarkeit {#reproducibility-and-replicability} @@ -60,29 +60,30 @@ Reproduzierbarkeit und Replizierbarkeit sind die Grundvoraussetzungen für quali - Reproduzierbare Ergebnisse können mehrfach nacheinander vom selben Team mit derselben Methodik erzielt werden. - Reproduzierbare Ergebnisse können von einer anderen Gruppe mit demselben Versuchsaufbau erzielt werden. -Neue Web3-native Tools können sicherstellen, dass Reproduzierbarkeit und Replizierbarkeit die Basis für Forschungsergebnisse sind. Damit können wir Qualitätsforschung in das technologische Umfeld der akademischen Welt einbinden. Web3 bietet die Möglichkeit, [Attestierungen](/glossary/#attestation) für jeden Analysekomponenten zu schaffen: die rohen Daten, den Rechner und das Anwendungsergebnis. Der Vorteil von Konsens-Systemen besteht darin, dass durch die Schaffung eines vertrauenswürdigen Netzwerks zur Pflege dieser Komponenten jeder Netzwerkteilnehmer für die Nachvollziehbarkeit der Berechnung und die Validierung jedes Ergebnisses verantwortlich sein kann. +Neue Web3-native Tools können sicherstellen, dass Reproduzierbarkeit und Replizierbarkeit die Basis für Forschungsergebnisse sind. Damit können wir Qualitätsforschung in das technologische Umfeld der akademischen Welt einbinden. Web3 bietet die Möglichkeit, [Attestierungen](/glossary/#attestation) für jede Analysekomponente zu erstellen: die Rohdaten, die Berechnungs-Engine und das Anwendungsergebnis. Der Vorteil von Konsens-Systemen besteht darin, dass durch die Schaffung eines vertrauenswürdigen Netzwerks zur Pflege dieser Komponenten jeder Netzwerkteilnehmer für die Nachvollziehbarkeit der Berechnung und die Validierung jedes Ergebnisses verantwortlich sein kann. ### Finanzierung {#funding} -Das derzeitige Standardmodell der Wissenschaftsförderung besteht darin, dass Einzelpersonen oder Forschergruppen schriftliche Anträge bei einer Förderorganisation einreichen. Die Bewertung der Anträge und die anschließende Durchführung von Interviews mit den Antragstellern erfolgt durch ein kleines Gremium, das sich aus vertrauenswürdigen Personen zusammensetzt, bevor die Mittel an einen kleinen Kreis von Antragstellern vergeben werden. Abgesehen von der Entstehung von Engpässen, die manchmal zu **jahrelangen Wartezeiten** zwischen der Beantragung eines Zuschusses und dem Erhalten eines Zuschusses führen, ist dieses Modell dafür bekannt, höchst **anfällig für die Neigungen, Eigeninteressen und Politik** des Überprüfungsgremiums zu sein. +Das derzeitige Standardmodell der Wissenschaftsförderung besteht darin, dass Einzelpersonen oder Forschergruppen schriftliche Anträge bei einer Förderorganisation einreichen. Die Bewertung der Anträge und die anschließende Durchführung von Interviews mit den Antragstellern erfolgt durch ein kleines Gremium, das sich aus vertrauenswürdigen Personen zusammensetzt, bevor die Mittel an einen kleinen Kreis von Antragstellern vergeben werden. Abgesehen davon, dass Engpässe entstehen, die zu mitunter **jahrelangen Wartezeiten** zwischen der Beantragung und dem Erhalt eines Zuschusses führen, ist dieses Modell bekanntermaßen sehr **anfällig für die Voreingenommenheit, die Eigeninteressen und die Politik** des Prüfungsausschusses. Studien haben gezeigt, dass die Bewilligungsgremien bei der Auswahl von qualitativ hochwertigen Anträgen schlecht abschneiden: Gleiche Anträge, die verschiedenen Gremien vorgelegt werden, führen zu sehr unterschiedlichen Ergebnissen. Aufgrund der Mittelknappheit konzentrierten sie sich auf einen kleineren Pool älterer Forscher mit intellektuell konservativeren Projekten. Dies hat zu einer extrem wettbewerbsorientierten Förderlandschaft geführt, die falsche Anreize setzt und die Innovation im Keim erstickt. -Web3 hat das Potenzial, dieses kaputte Finanzierungsmodell zu durchbrechen, indem es mit verschiedenen Anreizmodellen experimentiert, die von DAOs und Web3 im Allgemeinen entwickelt werden. [Retroaktive Fördermittel für öffentliche Güter](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c), [quadratische Förderung](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), [DAO Governance](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead) und [tokenisierte Anreizstrukturen](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design) sind einige der Web3-Tools, die die Wissenschaftsförderung revolutionieren könnten. +Web3 hat das Potenzial, dieses kaputte Finanzierungsmodell zu durchbrechen, indem es mit verschiedenen Anreizmodellen experimentiert, die von DAOs und Web3 im Allgemeinen entwickelt werden. [Retroaktive Finanzierung öffentlicher Güter](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c), [quadratische Finanzierung](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), [DAO-Governance](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead) und [tokenisierte Anreizstrukturen](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design) sind einige der Web3-Tools, die die Wissenschaftsfinanzierung revolutionieren könnten. ### IP-Eigentum und -Entwicklung {#ip-ownership} -Geistiges Eigentum (IP) ist ein Hauptproblem der traditionellen Wissenschaft: Es bleibt in Universitäten stecken oder wird in Biotechs nicht genutzt und ist schwierig zu bewerten. Allerdings ist das Eigentum an digitalen Gütern (wie z. B. wissenschaftlichen Daten oder Aufsätzen) ein Bereich, in dem Web3 mit seinen [Non-Fungible Token (NFTs)](/glossary/#nft) eine sehr gute Lösung bietet. +Geistiges Eigentum (IP) ist ein Hauptproblem der traditionellen Wissenschaft: Es bleibt in Universitäten stecken oder wird in Biotechs nicht genutzt und ist schwierig zu bewerten. Der Besitz von digitalen Vermögenswerten (wie z. B. wissenschaftlichen Daten oder Artikeln) ist jedoch etwas, das Web3 mit [nicht fungiblen Token (NFTs)](/glossary/#nft) außergewöhnlich gut umsetzt. Auf die gleiche Weise, wie NFTs Einnahmen für zukünftige Transaktionen an den ursprünglichen Ersteller zurückgeben können, können Sie transparente Wertzuweisungsketten einrichten, um Forscher, Verwaltungsorgane (wie DAOs) oder sogar die Personen, deren Daten gesammelt werden, zu belohnen. -[IP-NFTs](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) können auch als Schlüssel zu einem dezentralisierten Datenspeicher für die durchgeführten Forschungsexperimente fungieren und zur NFT- und [DeFi](/glossary/#defi)-Finanzierung beitragen (von der Fraktionalisierung bis zu Lending Pools und Value Appraisal). Es ermöglicht auch nativen On-Chain-Einheiten als DAOs wie etwa [VitaDAO](https://www.vitadao.com/), direkt in der Kette zu recherchieren. Die Einführung von nicht übertragbaren ["soulbound"-Token](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) könnte ebenfalls eine wichtige Rolle in DeSci spielen, da sie es Einzelpersonen ermöglichen, ihre Erfahrung und ihre Referenzen in Verbindung mit ihrer Ethereum-Adresse nachzuweisen. +[IP-NFTs](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) können auch als Schlüssel zu einem dezentralen Daten-Repository der durchgeführten Forschungsexperimente dienen und an die Finanzialisierung von NFT und [DeFi](/glossary/#defi) (von der Fraktionierung über Lending-Pools bis hin zur Wertermittlung) anknüpfen. Es ermöglicht auch nativen On-Chain-Entitäten wie DAOs wie [VitaDAO](https://www.vitadao.com/), Forschung direkt on-chain durchzuführen. +Die Einführung von nicht übertragbaren [„Soulbound“-Token](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) könnte ebenfalls eine wichtige Rolle in DeSci spielen, da sie es Einzelpersonen ermöglichen, ihre Erfahrung und ihre Referenzen in Verbindung mit ihrer Ethereum-Adresse nachzuweisen. -### Datenspeicherung, Zugriff und Architektur {#data-storage} +### Datenspeicherung, -zugriff und -architektur {#data-storage} Wissenschaftliche Daten können durch Web3-Modelle viel leichter zugänglich gemacht werden, und die verteilte Speicherung erlaubt es der Forschung, katastrophale Ereignisse zu überleben. -Ausgangspunkt muss ein System sein, auf das jede dezentrale Identität mit verifizierbaren Berechtigungsnachweisen zugreift. Dies ermöglicht die sichere Replikation sensibler Daten durch vertrauenswürdige Parteien, Redundanz und Widerstandsfähigkeit gegen Zensur, die Reproduktion von Ergebnissen und sogar die Möglichkeit der Zusammenarbeit mehrerer Parteien und das Hinzufügen neuer Daten zu einem Datensatz. Vertrauliche Datenverarbeitungsmethoden wie [Compute-to-Data](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol) bieten alternative Zugriffsmechanismen zur Replikation von Rohdaten und zur Schaffung vertrauenswürdiger Forschungsumgebungen für besonders sensible Daten. Trusted Research Environments (vertrauenswürdige Forschungsumgebungen) wurden [vom NHS](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb) als bahnbrechende Lösung für Datenschutz und Zusammenarbeit genannt, da sie ein Ökosystem schaffen, in dem Forscher vor Ort sicher mit Daten arbeiten können, indem sie standardisierte Umgebungen für die gemeinsame Nutzung von Code und Verfahren verwenden. +Ausgangspunkt muss ein System sein, auf das jede dezentrale Identität mit verifizierbaren Berechtigungsnachweisen zugreift. Dies ermöglicht die sichere Replikation sensibler Daten durch vertrauenswürdige Parteien, Redundanz und Widerstandsfähigkeit gegen Zensur, die Reproduktion von Ergebnissen und sogar die Möglichkeit der Zusammenarbeit mehrerer Parteien und das Hinzufügen neuer Daten zu einem Datensatz. Vertrauliche Berechnungsmethoden wie [Compute-to-Data](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol) bieten alternative Zugriffsmechanismen zur Replikation von Rohdaten und schaffen so vertrauenswürdige Forschungsumgebungen für die sensibelsten Daten. Trusted Research Environments wurden [vom NHS zitiert](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb) als eine zukunftsorientierte Lösung für Datenschutz und Zusammenarbeit, da sie ein Ökosystem schaffen, in dem Forscher mithilfe standardisierter Umgebungen für den Austausch von Code und Verfahren sicher vor Ort mit Daten arbeiten können. Flexible Web3-Datenlösungen unterstützen die oben genannten Szenarien. Sie bilden die Grundlage für eine wirklich offene Wissenschaft, in der Forscher ohne Zugangsbeschränkungen oder Gebühren öffentliche Güter schaffen können. Öffentliche Web3-Datenlösungen wie IPFS, Arweave und Filecoin werden für die Dezentralisierung optimiert. dClimate bietet beispielsweise universellen Zugang zu Klima- und Wetterdaten, auch von Wetterstationen und Vorhersagemodellen. @@ -90,46 +91,49 @@ Flexible Web3-Datenlösungen unterstützen die oben genannten Szenarien. Sie bil Erkunden Sie Projekte und werden Sie Teil der DeSci-Gemeinschaft. -- [DeSci.Global: globale Ereignisse und Termine](https://desci.global) -- [Blockchain für Science Telegram](https://t.me/BlockchainForScience) -- [Molecule: fördern und eigene Forschungsprojekte finanzieren lassen](https://www.molecule.xyz/) -- [VitaDAO: langfristige Forschung finanziert durch gesponserte Forschungsverträge](https://www.vitadao.com/) -- [ResearchHub: wissenschaftliche Ergebnisse veröffentlichen und in Diskurs mit Partnern gehen](https://www.researchhub.com/) -- [dClimate API: Klimadaten abfragen, die von einer dezentralen Gemeinschaft erfasst werden](https://www.dclimate.net/) -- [DeSci Foundation: DeSci Publishing Tool Builder](https://descifoundation.org/) -- [DeSci.World: One-Stop-Shop für Benutzer, mit dezentralisierter Wissenschaft](https://desci.world) -- [OceanDAO: DAO regelte die Finanzierung der datenbezogenen Wissenschaft](https://oceanprotocol.com/) -- [OpScientia: offene dezentrale wissenschaftliche Workflows](https://opsci.io/research/) -- [Bio.xyz: Erhalten Sie Mittel für Ihr Biotech-DAO oder desci-Projekt](https://www.bio.xyz/) -- [Flamming-Protokoll: Open-Source-Datenwirtschaft, die die kollaborative biomedizinische Entdeckung fördert](http://flemingprotocol.io/) +- [DeSci.Global: Kalender für globale Events und Meetups](https://desci.global) +- [Blockchain for Science Telegram](https://t.me/BlockchainForScience) +- [Molecule: Fördern Sie Ihre Forschungsprojekte und lassen Sie sie finanzieren](https://www.molecule.xyz/) +- [VitaDAO: Finanzierung durch gesponserte Forschungsverträge für die Langlebigkeitsforschung erhalten](https://www.vitadao.com/) +- [ResearchHub: Veröffentlichen Sie ein wissenschaftliches Ergebnis und treten Sie mit Fachkollegen in den Dialog](https://www.researchhub.com/) +- [dClimate API: Klimadaten abfragen, die von einer dezentralen Community erfasst werden](https://www.dclimate.net/) +- [DeSci Foundation: Entwickler von DeSci-Publishing-Tools](https://descifoundation.org/) +- [DeSci.World: One-Stop-Shop für Benutzer zum Ansehen und Mitwirken an dezentraler Wissenschaft](https://desci.world) +- [OceanDAO: DAO-gesteuerte Finanzierung für datenbezogene Wissenschaft](https://oceanprotocol.com/) +- [Opscientia: offene dezentrale Wissenschafts-Workflows](https://opsci.io/research/) +- [Bio.xyz: Lassen Sie sich für Ihr Biotech-DAO oder DeSci-Projekt finanzieren](https://www.bio.xyz/) +- [Fleming-Protokoll: Open-Source-Datenwirtschaft, die die kollaborative biomedizinische Entdeckung fördert](http://flemingprotocol.io/) - [Active Inference Institute](https://www.activeinference.org/) -- [IdeaMarkets: Ermöglicht dezentralisierte wissenschaftliche Glaubwürdigkeit](https://ideamarket.io/) +- [IdeaMarkets: Dezentralisierte wissenschaftliche Glaubwürdigkeit ermöglichen](https://ideamarket.io/) - [DeSci Labs](https://www.desci.com/) -- [ValleyDAO: eine offene, globale Gemeinschaft, die Geldmittel und translationale Unterstützung für die Forschung von synthetischer Biologie bietet](https://www.valleydao.bio) -- [Cerebrum DAO: Sourcing- und Nurturing-Lösungen, um Gehirn-Fitness voranzubringen und Neurodegeneration vorzubeugen](https://www.cerebrumdao.com/) -- [CryoDAO: Förderung von Mondflug-Forschung im Feld von Kältekonservierung](https://www.cryodao.org) +- [ValleyDAO: eine offene, globale Gemeinschaft, die Finanzierung und translationale Unterstützung für die Forschung im Bereich der synthetischen Biologie bietet](https://www.valleydao.bio) +- [Cerebrum DAO: Lösungen zur Förderung der Gehirngesundheit und zur Vorbeugung von Neurodegeneration beschaffen und fördern](https://www.cerebrumdao.com/) +- [CryoDAO: Finanzierung von Moonshot-Forschung im Bereich der Kryokonservierung](https://www.cryodao.org) +- [Elata: Mitspracherecht bei der Zukunft der psychiatrischen Medizin](https://www.elata.bio/) -Wir freuen uns über Vorschläge für neue Projekte, die in die Liste aufgenommen werden sollen – bitte lesen Sie dazu unsere [Listing Policy](/contributing/adding-desci-projects/)! +Wir freuen uns über Vorschläge für neue Projekte, die wir auflisten können – sehen Sie sich unsere [Auflistungsrichtlinie](/contributing/adding-desci-projects/) an, um loszulegen! -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [DeSci Wiki von Jocelynn Pearl und Ultrarare](https://docs.google.com/document/d/1aQC6zn-eXflSmpts0XGE7CawbUEHwnL6o-OFXO52PTc/edit#) -- [Ein Leitfaden für die dezentrale Biotechnologie von Jocelynn Perl für die Zukunft von a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) -- [Die Argumente für DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) -- [Anleitung zu DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Dezentralisierte Wissenschaftsressourcen](https://www.vincentweisser.com/desci) -- [Die Biopharma-IP-NFTs von Molecule – Eine technische Beschreibung](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) -- [Aufbau zuverlässiger Wissenschaftssysteme von Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) -- [Paul Kohlhaas – DeSci: die Zukunft der dezentralisierten Wissenschaft (Podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) -- [Eine aktive Inferenz-Ontologie für die dezentralisierte Wissenschaft: von aufgestellten Sensemaking bis zu den epistemischen Commons](https://zenodo.org/record/6320575) -- [DeSci: die Zukunft der Forschung von Samuel Akinosho](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec) -- [Science Funding (Epilog: DeSci und neue Kryptoprimitive) von Nadia](https://nadia.xyz/science-funding) -- [Dezentralisierung ist eine Dezentralisierung der Arzneimittelentwicklung](https://medium.com/id-theory/decentralisation-is-disrupting-drug-development-28b5ba5d447f) +- [Ein Leitfaden für dezentrale Biotechnologie von Jocelynn Pearl für a16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/) +- [Argumente für DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) +- [Leitfaden zu DeSci](https://future.com/what-is-decentralized-science-aka-desci/) +- [Ressourcen zur dezentralen Wissenschaft](https://www.vincentweisser.com/desci) +- [Molecule’s Biopharma IP-NFTs – Eine technische Beschreibung](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) +- [Aufbau von vertrauenslosen Wissenschaftssystemen von Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) +- [Paul Kohlhaas – DeSci: Die Zukunft der dezentralen Wissenschaft (Podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) +- [Eine aktive Inferenz-Ontologie für die dezentralisierte Wissenschaft: vom situierten Sensemaking zu den epistemischen Commons](https://zenodo.org/record/6320575) +- [DeSci: Die Zukunft der Forschung von Samuel Akinosho](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec) +- [Wissenschaftsfinanzierung (Epilog: DeSci und neue Krypto-Primitive) von Nadia](https://nadia.xyz/science-funding) +- [Dezentralisierung revolutioniert die Medikamentenentwicklung](https://medium.com/id-theory/decentralisation-is-disrupting-drug-development-28b5ba5d447f) +- [Was ist DeSci – Dezentrale Wissenschaft?](https://usadailytimes.com/2022/09/12/what-is-desci-decentralized-science/) ### Videos {#videos} -- [Was ist die dezentralisierte Wissenschaft?](https://www.youtube.com/watch?v=-DeMklVWNdA) -- [Gespräch zwischen Vitalik Buterin und dem Wissenschaftler Aubrey de Grey über den Schnittpunkt der Langlebigkeitsforschung und Kryptographie](https://www.youtube.com/watch?v=x9TSJK1widA) -- [Wissenschaftliche Veröffentlichung ist kaputt. Kann Web3 das reparieren?](https://www.youtube.com/watch?v=WkvzYgCvWj8) -- [Juan Benet - DeSci, unabhängige Labore und datenintensive Wissenschaft im großen Maßstab](https://www.youtube.com/watch?v=zkXM9H90g_E) -- [Sebastian Brunemeier – Wie DeSci die biomedizinische Forschung verändern kann & Risikokapital](https://www.youtube.com/watch?v=qB4Tc3FcVbM) +- [Was ist dezentrale Wissenschaft?](https://www.youtube.com/watch?v=-DeMklVWNdA) +- [Gespräch zwischen Vitalik Buterin und dem Wissenschaftler Aubrey de Grey über die Schnittstelle von Langlebigkeitsforschung und Krypto](https://www.youtube.com/watch?v=x9TSJK1widA) +- [Wissenschaftliche Veröffentlichung ist kaputt. Kann Web3 es reparieren?](https://www.youtube.com/watch?v=WkvzYgCvWj8) +- [Juan Benet – DeSci, Unabhängige Labore & Datenwissenschaft im großen Maßstab](https://www.youtube.com/watch?v=zkXM9H90g_E) +- [Sebastian Brunemeier – Wie DeSci die biomedizinische Forschung und Risikokapital transformieren kann](https://www.youtube.com/watch?v=qB4Tc3FcVbM) +- [Paige Donner – Werkzeuge für die offene Wissenschaft mit Web3 und der Blockchain](https://www.youtube.com/watch?v=nC-2QWQ-lgw&t=17s) diff --git a/public/content/translations/de/developers/docs/accounts/index.md b/public/content/translations/de/developers/docs/accounts/index.md index 80ce328c50d..e475beb3483 100644 --- a/public/content/translations/de/developers/docs/accounts/index.md +++ b/public/content/translations/de/developers/docs/accounts/index.md @@ -4,18 +4,18 @@ description: Eine Erklärung der Ethereum-Konten – ihre Datenstrukturen und ih lang: de --- -Ein Ethereum-Konto ist eine Entität mit einem Ether(ETH)-Guthaben, welche Transaktionen bei Ethereum durchführen kann. Konten können benutzerkontrolliert oder als intelligenter Vertrag bereitgestellt werden. +Ein Ethereum-Account besitzt ein Ether (ETH)-Guthaben und kann Nachrichten auf Ethereum senden. Konten können benutzerkontrolliert oder als intelligenter Vertrag bereitgestellt werden. ## Voraussetzungen {#prerequisites} -Als Vorbereitung auf die Inhalte dieser Seite empfehlen wir Ihnen, zunächst unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. -## Kontotypen {#types-of-account} +## Kontoarten {#types-of-account} Ethereum hat zwei Kontotypen: - Konten im externen Besitz (EOA) – kontrolliert von jeder beliebigen Person mit den privaten Schlüsseln -- Vertragskonto – ein auf dem Netwerk eröffneter Smart Contract, gesteuert durch Code. Erfahre mehr über [intelligente Verträge](/developers/docs/smart-contracts/). +- Vertragskonto – ein auf dem Netwerk eröffneter Smart Contract, gesteuert durch Code. Erfahre mehr über [Smart Contracts](/developers/docs/smart-contracts/) Beide Kontotypen haben die Möglichkeit @@ -34,20 +34,21 @@ Beide Kontotypen haben die Möglichkeit **Vertrag** - Die Erstellung eines Vertrags ist mit Kosten verbunden, da diese Netzwerkspeicher verwenden. -- Transaktionen können nur als Antwort auf den Erhalt einer Transaktion gesendet werden. +- Kann nur dann Nachrichten senden, wenn eine Transaktion empfangen wird. - Transaktionen von einem externen Konto auf ein Vertragskonto können einen Code auslösen, der viele verschiedene Aktionen ausführt, z. B. die Übertragung von Token oder sogar die Erstellung eines neuen Vertrags. - Vertragskonten haben keine privaten Schlüssel. Stattdessen werden sie durch die Logik vom Smart Contract Code gesteuert. -## Analyse eines Kontos {#an-account-examined} +## Ein Konto im Detail {#an-account-examined} Ethereum-Konten haben vier Bereiche: -- `Nonce` – ein Zähler, der die Anzahl der von einem externen Konto gesendeten Transaktionen oder die Anzahl der von einem Vertragskonto erstellten Verträge angibt. Für jedes Konto kann nur eine Transaktion mit einem bestimmten Nonce-Wert ausgeführt werden. Das schützt vor Wiederholungsangriffen, bei denen signierte Transaktionen wiederholt gesendet und erneut ausgeführt werden. -- `Balance` – die Anzahl von wei, die diese Adresse besitzt. Wei ist eine Stückelung der ETH und es gibt 1e+18 wei pro ETH. -- `codeHash` – Dieser Hash bezieht sich auf den _code_ eines Kontos auf der Ethereum Virtual Machine (EVM). In Vertragskonten sind Codefragmente einprogrammiert, die verschiedene Operationen ausführen können. Dieser EVM-Code wird ausgeführt, wenn das Konto einen Nachrichtenaufruf erhält. Er kann im Gegensatz zu den anderen Kontofeldern nicht geändert werden. Alle diese Codefragmente werden in der Zustandsdatenbank unter den entsprechenden Hashes gespeichert und können später abgerufen werden. Dieser Hash-Wert wird als codeHash bezeichnet. Bei externen Konten ist das Feld codeHash der Hash einer leeren Zeichenfolge. -- `StorageRoot` – manchmal auch bekannt als Speicher-Hash. Ein 256-Bit-Hash des Wurzelknotens eines Merkle-Patricia-Tries, der den Speicherinhalt des Kontos codiert (eine Zuordnung zwischen 256-Bit-Integer-Werten), codiert in den Trie als eine Zuordnung vom Keccak-256-Bit-Hash der 256-Bit-Integer-Schlüssel zu den RLP-codierten 256-Bit-Integer-Werten. Dieser Trie kodiert den Hash des Speicherinhalts dieses Kontos und ist standardmäßig leer. +- `nonce` – Ein Zähler, der die Anzahl der von einem externen Konto gesendeten Transaktionen oder die Anzahl der von einem Vertragskonto erstellten Verträge angibt. Für jedes Konto kann nur eine Transaktion mit einem bestimmten Nonce-Wert ausgeführt werden. Das schützt vor Wiederholungsangriffen, bei denen signierte Transaktionen wiederholt gesendet und erneut ausgeführt werden. +- `balance` – Die Anzahl der Wei, die diese Adresse besitzt. Wei ist eine Stückelung der ETH und es gibt 1e+18 wei pro ETH. +- `codeHash` – Dieser Hash bezieht sich auf den _Code_ eines Kontos auf der Ethereum Virtual Machine (EVM). In Vertragskonten sind Codefragmente einprogrammiert, die verschiedene Operationen ausführen können. Dieser EVM-Code wird ausgeführt, wenn das Konto einen Nachrichtenaufruf erhält. Er kann im Gegensatz zu den anderen Kontofeldern nicht geändert werden. Alle diese Codefragmente werden in der Zustandsdatenbank unter den entsprechenden Hashes gespeichert und können später abgerufen werden. Dieser Hash-Wert wird als codeHash bezeichnet. Bei externen Konten ist das Feld codeHash der Hash einer leeren Zeichenfolge. +- `storageRoot` – Manchmal auch als Storage-Hash bekannt. Ein 256-Bit-Hash des Wurzelknotens eines [Merkle-Patricia-Tries](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/), der die Speicherinhalte des Kontos kodiert (eine Zuordnung zwischen 256-Bit-Integer-Werten), die im Trie als eine Zuordnung vom Keccak-256-Bit-Hash der 256-Bit-Integer-Schlüssel zu den RLP-kodierten 256-Bit-Integer-Werten kodiert ist. Dieser Trie kodiert den Hash des Speicherinhalts dieses Kontos und ist standardmäßig leer. -![Ein Diagramm, das die Funktionsweise eines Kontos zeigt](./accounts.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Ein Diagramm, das den Aufbau eines Kontos zeigt](./accounts.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ ## Externe Konten und Schlüsselpaare {#externally-owned-accounts-and-key-pairs} @@ -67,32 +68,32 @@ Beispiel: `fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f` -Der öffentliche Schlüssel wird mithilfe des [Elliptic Curve Digital Signature Algorithm](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) aus dem privaten Schlüssel generiert. Du erhältst eine öffentliche Adresse für dein Konto, indem du die letzten 20 Bytes des Keccak-256-Hashes des öffentlichen Schlüssels nimmst und `0x` an den Anfang setzt. +Der öffentliche Schlüssel wird aus dem privaten Schlüssel unter Verwendung des [Elliptic Curve Digital Signature Algorithm](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) generiert. Du erhältst eine öffentliche Adresse für dein Konto, indem du die letzten 20 Bytes des Keccak-256-Hashes des öffentlichen Schlüssels nimmst und `0x` an den Anfang setzt. -Das bedeutet, dass ein Konto in externem Besitz (EOA) eine 42-stellige Adresse hat (ein 20-Byte-Segment, das aus 40 hexadezimalen Zeichen und dem Präfix `0x` besteht). +Das bedeutet, dass ein externes Konto (Externally Owned Account, EOA) eine 42-stellige Adresse hat (ein 20-Byte-Segment, das aus 40 hexadezimalen Zeichen plus dem `0x`-Präfix besteht). Beispiel: `0x5e97870f263700f46aa00d967821199b9bc5a120` -Das folgende Beispiel zeigt, wie Sie mit dem Signatur-Tool [Clef](https://geth.ethereum.org/docs/tools/clef/introduction) ein neues Konto erstellen. Clef ist ein Kontenverwaltungs- und Signierungs-Tool, das zusammen mit dem Ethereum-Client [Geth](https://geth.ethereum.org) erhältlich ist. Der Befehl `clef newaccount` erstellt ein neues Schlüsselpaar und speichert es in einem verschlüsselten Schlüsselspeicher. +Das folgende Beispiel zeigt, wie du mit einem Signier-Tool namens [Clef](https://geth.ethereum.org/docs/tools/clef/introduction) ein neues Konto erstellst. Clef ist ein Tool zur Kontoverwaltung und zum Signieren, das mit dem Ethereum-Client [Geth](https://geth.ethereum.org) gebündelt ist. Der Befehl `clef newaccount` erstellt ein neues Schlüsselpaar und speichert es in einem verschlüsselten Keystore. ``` -> clef newaccount --keystore +> clef newaccount --keystore -Please enter a password for the new account to be created: -> +Bitte gib ein Passwort für das neu zu erstellende Konto ein: +> ------------ -INFO [10-28|16:19:09.156] Your new key was generated address=0x5e97870f263700f46aa00d967821199b9bc5a120 -WARN [10-28|16:19:09.306] Please backup your key file path=/home/user/go-ethereum/data/keystore/UTC--2022-10-28T15-19-08.000825927Z--5e97870f263700f46aa00d967821199b9bc5a120 -WARN [10-28|16:19:09.306] Please remember your password! -Generated account 0x5e97870f263700f46aa00d967821199b9bc5a120 +INFO [10-28|16:19:09.156] Dein neuer Schlüssel wurde generiert address=0x5e97870f263700f46aa00d967821199b9bc5a120 +WARN [10-28|16:19:09.306] Bitte sichere deine Schlüsseldatei path=/home/user/go-ethereum/data/keystore/UTC--2022-10-28T15-19-08.000825927Z--5e97870f263700f46aa00d967821199b9bc5a120 +WARN [10-28|16:19:09.306] Bitte merke dir dein Passwort! +Erstelltes Konto 0x5e97870f263700f46aa00d967821199b9bc5a120 ``` -[Dokumentation für Geth](https://geth.ethereum.org/docs) +[Geth-Dokumentation](https://geth.ethereum.org/docs) -Es ist möglich, neue öffentliche Schlüssel von deinem privaten Schlüssel abzuleiten, aber nicht, einen privaten Schlüssel von öffentlichen Schlüsseln abzuleiten. Es ist unabdingbar, Ihren privaten Schlüssel sicher aufzubewahren und – wie der Name schon sagt – **PRIVAT** zu halten. +Es ist möglich, neue öffentliche Schlüssel von deinem privaten Schlüssel abzuleiten, aber du kannst keinen privaten Schlüssel von öffentlichen Schlüsseln ableiten. Es ist unerlässlich, deine privaten Schlüssel sicher aufzubewahren und – wie der Name schon sagt – **PRIVAT** zu halten. Du benötigst einen privaten Schlüssel, um Nachrichten und Transaktionen zu signieren, die eine Signatur nach außen anzeigen. Andere können dann die Unterschrift verwenden, um deinen öffentlichen Schlüssel abzuleiten und den Autor der Nachricht zu verifizieren. In Ihrer Anwendung können Sie eine JavaScript-Bibliothek nutzen, um Transaktionen zum Netzwerk zu senden. @@ -106,11 +107,11 @@ Beispiel: Die Vertragsadresse wird in der Regel angegeben, wenn ein Vertrag an die Ethereum Blockchain versendet wird. Diese Adresse stammt von der Erstelleradresse und der Anzahl der Transaktionen, die von dieser Adresse versendet werden (die „nonce“). -## Schlüssel für Validatoren {#validators-keys} +## Validator-Schlüssel {#validators-keys} Es gibt einen weiteren Schlüsseltyp in Ethereum, der mit dem Wechsel von Proof-of-Work zu Proof-of-Stake für den Konsensmechanismus eingeführt wurde. Dieser nennt sich BLS-Schlüssel und wird verwendet, um Validatoren zu identifizieren. Diese Schlüssel lassen sich sehr effizient aggregieren, um die Bandbreite zu reduzieren, die das Netzwerk benötigt, um einen Konsens zu erzielen. Ohne diese Schlüsselaggregation wäre der minimale Stake für Validatoren viel höher. -[Mehr über Schlüssel für Validatoren](/developers/docs/consensus-mechanisms/pos/keys/). +[Mehr über Validator-Schlüssel](/developers/docs/consensus-mechanisms/pos/keys/). ## Ein Hinweis zu Wallets {#a-note-on-wallets} @@ -124,11 +125,11 @@ Austin führt Sie durch Hash-Funktionen und Schlüsselpaare. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Ethereum Accounts verstehen](https://info.etherscan.com/understanding-ethereum-accounts/) – Etherscan +- [Ethereum-Konten verstehen](https://info.etherscan.com/understanding-ethereum-accounts/) – Etherscan -_Gibt es Community-Resourcen, die Sie hilfreich fanden? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} diff --git a/public/content/translations/de/developers/docs/apis/backend/index.md b/public/content/translations/de/developers/docs/apis/backend/index.md index 9b76ebe5038..cb1ef85c75a 100644 --- a/public/content/translations/de/developers/docs/apis/backend/index.md +++ b/public/content/translations/de/developers/docs/apis/backend/index.md @@ -4,9 +4,9 @@ description: Eine Einführung in die Ethereum-Client-APIs, über die Sie mit der lang: de --- -Damit eine Softwareanwendung mit der Ethereum-Blockchain interagieren kann (z. B. Lesen von Blockchain-Daten und/oder Senden von Transaktionen an das Netzwerk), muss es sich mit einem Ethereum-Knoten verbinden. +Damit eine Softwareanwendung mit der Ethereum-Blockchain interagieren kann (d. h. Blockchain-Daten lesen und/oder Transaktionen an das Netzwerk senden), muss sie sich mit einem Ethereum-Node verbinden. -Zu diesem Zweck implementiert jeder Ethereum-Client die [JSON-RPC](/developers/docs/apis/json-rpc/)-Spezifikation, sodass eine einheitliche Sammlung von [Methoden](/developers/docs/apis/json-rpc/#json-rpc-methods) zur Verfügung steht, auf die Anwendungen sich verlassen können. +Zu diesem Zweck implementiert jeder Ethereum-Client die [JSON-RPC](/developers/docs/apis/json-rpc/)-Spezifikation, sodass ein einheitlicher Satz von [Methoden](/developers/docs/apis/json-rpc/#json-rpc-methods) zur Verfügung steht, auf die sich Anwendungen verlassen können. Wenn Sie eine bestimmte Programmiersprache verwenden möchten, um sich mit einem Ethereum-Knoten zu verbinden, können Sie auf eine der komfortablen Bibliotheken in diesem Ökosystem zurückgreifen, die Ihnen das Leben erleichtern. Mit diesen Programmbibliotheken können Entwickler intuitive, einzeilige Methoden schreiben, um JSON-RPC-Anfragen („unter der Haube“) zu initialisieren, die mit Ethereum interagieren. @@ -16,16 +16,16 @@ Es könnte hilfreich sein, den [Ethereum-Stack](/developers/docs/ethereum-stack/ ## Warum eine Bibliothek verwenden? {#why-use-a-library} -Durch Abstraktion vereinfachen diese Programmbibliotheken die komplexe direkte Interaktion mit einem Ethereum-Knoten. Zudem bieten sie auch Dienstprogrammfunktionen (z. B. ETH in GWei umwandeln), so dass Sie als Entwickler weniger Zeit mit den Problemstellungen der Ethereum-Clients verbringen müssen und sich stärker auf die einzigartige Funktion Ihrer Anwendung konzentrieren können. +Durch Abstraktion vereinfachen diese Programmbibliotheken die komplexe direkte Interaktion mit einem Ethereum-Knoten. Sie bieten auch Hilfsfunktionen (z. B. die Umrechnung von ETH in Gwei), sodass Sie als Entwickler weniger Zeit mit den Feinheiten von Ethereum-Clients verbringen und sich mehr auf die einzigartige Funktionalität Ihrer Anwendung konzentrieren können. ## Verfügbare Bibliotheken {#available-libraries} -### Infrastruktur- und Knoten-Dienste {#infrastructure-and-node-services} +### Infrastruktur- und Node-Dienste {#infrastructure-and-node-services} -**Alchemy-****_Ehereum-Entwicklungsplattform_** +**Alchemy –** **_Ethereum-Entwicklungsplattform._** - [alchemy.com](https://www.alchemy.com/) -- [Dokumentation](https://docs.alchemy.com/) +- [Dokumentation](https://www.alchemy.com/docs/) - [GitHub](https://github.com/alchemyplatform) - [Discord](https://discord.com/invite/alchemyplatform) @@ -35,13 +35,13 @@ Durch Abstraktion vereinfachen diese Programmbibliotheken die komplexe direkte I - [Dokumentation](https://docs.allthatnode.com) - [Discord](https://discord.gg/GmcdVEUbJM) -**Blast by Bware Labs -** **_Dezentrale APIs für Ethereum Mainnet und Testnetzwerke._** +**Blast by Bware Labs –** **_Dezentrale APIs für Ethereum-Mainnet und Testnets._** - [blastapi.io](https://blastapi.io/) - [Dokumentation](https://docs.blastapi.io) -- [Discord](https://discord.gg/bwarelabs) +- [Discord](https://discord.gg/SaRqmRUjjQ) -**BlockPi -** **_Bereitstellung von effizienteren und schnellen RPC-Diensten_** +**BlockPi –** **_Bereitstellung effizienterer und schnellerer RPC-Dienste_** - [blockpi.io](https://blockpi.io/) - [Dokumentation](https://docs.blockpi.io/) @@ -53,111 +53,116 @@ Durch Abstraktion vereinfachen diese Programmbibliotheken die komplexe direkte I - [cloudflare-eth.com](https://www.cloudflare.com/application-services/products/web3/) **Etherscan – Blockexplorer und Transaktions-API** + - [Dokumentation](https://docs.etherscan.io/) -**GetBlock-** **_Blockchain als Dienstleistung für Web3-Entwicklung_** +**Blockscout - ein Open-Source-Block-Explorer** + +- [Dokumentation](https://docs.blockscout.com/) + +**GetBlock –** **_Blockchain-as-a-Service für die Web3-Entwicklung_** - [GetBlock.io](https://getblock.io/) -- [Dokumentation](https://getblock.io/docs/) +- [Dokumentation](https://docs.getblock.io/) -**Infura –** **_Die Ethereum-API als Dienst_** +**Infura –** **_Die Ethereum-API als Service._** - [infura.io](https://infura.io) - [Dokumentation](https://docs.infura.io/api) - [GitHub](https://github.com/INFURA) -**Node RPC – _kostengünstiger EVM-JSON-RPC-Anbieter_** +**Node RPC – _Kostengünstiger EVM-JSON-RPC-Anbieter_** - [noderpc.xyz](https://www.noderpc.xyz/) - [Dokumentation](https://docs.noderpc.xyz/node-rpc) -**NOWNodes - _Full Nodes und Block Explorers._** +**NOWNodes – _Full Nodes und Block-Explorer._** - [NOWNodes.io](https://nownodes.io/) -- [Dokumentation](https://documenter.getpostman.com/view/13630829/TVmFkLwy#intro) +- [Dokumentation](https://nownodes.gitbook.io/documentation) -**QuickNode –** **_Blockchain-Infrastruktur als Dienstleistung_** +**QuickNode –** **_Blockchain-Infrastruktur as a Service._** - [quicknode.com](https://quicknode.com) - [Dokumentation](https://www.quicknode.com/docs/welcome) - [Discord](https://discord.gg/quicknode) -**Rivet –** **_Ethereum- und Ethereum Classic-APIs als Service unterstützt durch Open-Source-Software_** +**Rivet –** **_Ethereum- und Ethereum-Classic-APIs as a Service, betrieben mit Open-Source-Software._** - [rivet.cloud](https://rivet.cloud) - [Dokumentation](https://rivet.cloud/docs/) - [GitHub](https://github.com/openrelayxyz/ethercattle-deployment) -**Zmok –** **_geschwindigkeitsorientierte Ethereum-Nodes als JSON-RPC-/WebSockets-API_** +**Zmok –** **_Geschwindigkeitsorientierte Ethereum-Nodes als JSON-RPC/WebSockets-API._** - [zmok.io](https://zmok.io/) - [GitHub](https://github.com/zmok-io) - [Dokumentation](https://docs.zmok.io/) - [Discord](https://discord.gg/fAHeh3ka6s) -### Entwicklungswerkzeuge {#development-tools} +### Entwicklerwerkzeuge {#development-tools} -**ethers-kt – ** **_asynchrone, hochleistungsfähige Kotlin-/Java-/Android-Bibliothek für EVM-basierte Blockchains._** +**ethers-kt –** **_Asynchrone, hochleistungsfähige Kotlin-/Java-/Android-Bibliothek für EVM-basierte Blockchains._** - [GitHub](https://github.com/Kr1ptal/ethers-kt) - [Beispiele](https://github.com/Kr1ptal/ethers-kt/tree/master/examples) - [Discord](https://discord.gg/rx35NzQGSb) -**Nethereum -** **_Eine Open Source .NET Integration-Library für Blockchain_** +**Nethereum –** **_Eine Open-Source-.NET-Integrationsbibliothek für die Blockchain._** - [GitHub](https://github.com/Nethereum/Nethereum) - [Dokumentation](http://docs.nethereum.com/en/latest/) - [Discord](https://discord.com/invite/jQPrR58FxX) -**Python Tooling –** **_eine Auswahl von Programmbibliotheken für Ethereum-Interaktion über Python_** +**Python-Tooling –** **_Eine Vielzahl von Bibliotheken für die Interaktion mit Ethereum über Python._** -- [py.ethereum.org](https://python.ethereum.org/) +- [py.ethereum.org](https://snakecharmers.ethereum.org/) - [web3.py GitHub](https://github.com/ethereum/web3.py) -- [web3.py Chat](https://gitter.im/ethereum/web3.py) +- [web3.py-Chat](https://gitter.im/ethereum/web3.py) -**Tatum –** **_die ultimative Blockchain-Entwicklungsplattform_** +**Tatum –** **_Die ultimative Blockchain-Entwicklungsplattform._** - [Tatum](https://tatum.io/) - [GitHub](https://github.com/tatumio/) - [Dokumentation](https://docs.tatum.io/) - [Discord](https://discord.gg/EDmW3kjTC9) -**web3j –** **_eine Java-/Android-/Kotlin-/Scala -Integrationsbibliothek für Ethereum_** +**web3j –** **_Eine Java/Android/Kotlin/Scala-Integrationsbibliothek für Ethereum._** - [GitHub](https://github.com/web3j/web3j) -- [Dokumente](https://docs.web3j.io/) +- [Docs](https://docs.web3j.io/) - [Gitter](https://gitter.im/web3j/web3j) ### Blockchain-Dienste {#blockchain-services} -**BlockCypher –** **_Ethereum-Web-APIs_** +**BlockCypher –** **_Ethereum-Web-APIs._** - [blockcypher.com](https://www.blockcypher.com/) - [Dokumentation](https://www.blockcypher.com/dev/ethereum/) -**Chainbase -** **_All-in-One web3-Dateninfrastruktur für Ethereum._** +**Chainbase –** **_All-in-one-Web3-Dateninfrastruktur für Ethereum._** - [chainbase.com](https://chainbase.com/) - [Dokumentation](https://docs.chainbase.com/) - [Discord](https://discord.gg/Wx6qpqz4AF) -**Chainstack -** **_Elastische und dedizierte Ethereum-Nodes als Dienst._** +**Chainstack –** **_Elastische und dedizierte Ethereum-Nodes as a Service._** - [chainstack.com](https://chainstack.com) -- [Dokumentation](https://docs.chainbase.com/docs) -- [Ethereum API-Referenz](https://docs.chainstack.com/reference/ethereum-getting-started) +- [Dokumentation](https://docs.chainstack.com/) +- [Ethereum-API-Referenz](https://docs.chainstack.com/reference/ethereum-getting-started) -**Coinbase Cloud Node -** **_Blockchain Infrastruktur-API._** +**Coinbase Cloud Node –** **_Blockchain-Infrastruktur-API._** -- [Coinbase Cloud Node](https://www.coinbase.com/cloud) -- [Dokumentation](https://docs.cloud.coinbase.com/) +- [Coinbase Cloud Node](https://www.coinbase.com/developer-platform) +- [Dokumentation](https://docs.cdp.coinbase.com/) -**DataHub von Figment -** **_Web3-API-Dienste mit Ethereum-Mainnet und -Testnets_** +**DataHub by Figment –** **_Web3-API-Dienste mit Ethereum-Mainnet und Testnets._** - [DataHub](https://www.figment.io/) - [Dokumentation](https://docs.figment.io/) -**Moralis -** **_EVM API-Anbieter auf Unternehmensebene._** +**Moralis –** **_EVM-API-Anbieter auf Unternehmensebene._** - [moralis.io](https://moralis.io) - [Dokumentation](https://docs.moralis.io/) @@ -165,43 +170,42 @@ Durch Abstraktion vereinfachen diese Programmbibliotheken die komplexe direkte I - [Discord](https://moralis.io/joindiscord/) - [Forum](https://forum.moralis.io/) -**NFTPort -** **_Ethereum Daten- und Mint-APIs._** +**NFTPort –** **_Ethereum-Daten- und Mint-APIs._** - [nftport.xyz](https://www.nftport.xyz/) - [Dokumentation](https://docs.nftport.xyz/) - [GitHub](https://github.com/nftport/) - [Discord](https://discord.com/invite/K8nNrEgqhE) -**Tokenview -** **_Die allgemeine API-Plattform für die Multi-Crypto-Blockchain._** +**Tokenview –** **_Die allgemeine Plattform für Multi-Krypto-Blockchain-APIs._** - [services.tokenview.io](https://services.tokenview.io/) - [Dokumentation](https://services.tokenview.io/docs?type=api) - [GitHub](https://github.com/Tokenview) -**Watchdata –** **_bietet einen einfachen und zuverlässigen API-Zugriff auf die Ethereum-Blockchain_** +**Watchdata –** **_Bietet einfachen und zuverlässigen API-Zugriff auf die Ethereum-Blockchain._** - [Watchdata](https://watchdata.io/) - [Dokumentation](https://docs.watchdata.io/) - [Discord](https://discord.com/invite/TZRJbZ6bdn) -**Covalent –** **_erweiterte Blockchain-APIs für über 200 Ketten._** +**Covalent –** **_Angereicherte Blockchain-APIs für über 200 Chains._** - [covalenthq.com](https://www.covalenthq.com/) - [Dokumentation](https://www.covalenthq.com/docs/api/) - [GitHub](https://github.com/covalenthq) - [Discord](https://www.covalenthq.com/discord/) - -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} _Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} -- [Knotenpunkte und Clients](/developers/docs/nodes-and-clients/) +- [Nodes und Clients](/developers/docs/nodes-and-clients/) - [Entwicklungs-Frameworks](/developers/docs/frameworks/) -## Ähnliche Tutorials {#related-tutorials} +## Verwandte Tutorials {#related-tutorials} -- [Web3js einrichten, um die Ethereum-Blockchain in JavaScript zu nutzen](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Leitfaden für die Einrichtung von web3.js in Ihrem Projekt._ -- [Aufruf eines intelligenten Vertrags mit JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Mit dem DAI-Token können Sie die Funktion „Verträge aufrufen“ mit JavaScript verwenden._ +- [Web3.js einrichten, um die Ethereum-Blockchain in JavaScript zu verwenden](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Anleitung, um web3.js in Ihrem Projekt einzurichten._ +- [Einen Smart Contract aus JavaScript aufrufen](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Sehen Sie am Beispiel des DAI-Tokens, wie man Vertragsfunktionen mit JavaScript aufruft._ diff --git a/public/content/translations/de/developers/docs/apis/javascript/index.md b/public/content/translations/de/developers/docs/apis/javascript/index.md index 24cde103297..d07f1a48a71 100644 --- a/public/content/translations/de/developers/docs/apis/javascript/index.md +++ b/public/content/translations/de/developers/docs/apis/javascript/index.md @@ -4,38 +4,40 @@ description: Eine Einführung in die JavaScript-Client-Bibliotheken, über die S lang: de --- -Damit eine Web-Anwendung mit der Ethereum-Blockchain interagieren kann (z. B. Auslesen von Blockchain-Daten und/oder Senden von Transaktionen an das Netzwerk), muss sie sich mit einem Ethereum-Node verbinden. +Damit eine Web-Anwendung mit der Ethereum-Blockchain interagieren kann (d. h. Blockchain-Daten lesen und/oder Transaktionen an das Netzwerk senden), muss sie sich mit einem Ethereum-Node verbinden. -Zu diesem Zweck implementiert jeder Ethereum-Client die [JSON-RPC](/developers/docs/apis/json-rpc/)-Spezifikation, damit es einen einheitlichen Satz von [Methoden](/developers/docs/apis/json-rpc/#json-rpc-methods) gibt, auf die sich Anwendungen verlassen können. +Zu diesem Zweck implementiert jeder Ethereum-Client die [JSON-RPC](/developers/docs/apis/json-rpc/)-Spezifikation, sodass es einen einheitlichen Satz von [Methoden](/developers/docs/apis/json-rpc/#json-rpc-methods) gibt, auf die sich Anwendungen verlassen können. Wenn Sie sich über JavaScript mit einem Ethereum-Node verbinden möchten, ist das auch über VanillaJavaScript möglich. Doch es existieren noch weitere Lösungen in Programmbibliotheken in diesem Ökosystem, die das alles viel einfacher machen. Mit diesen Programmbibliotheken können Entwickler intuitive, einzeilige Methoden schreiben, um JSON-RPC-Anfragen („unter der Haube“) zu initialisieren, die mit Ethereum interagieren. -Bitte beachten Sie, dass seit [der Zusammenführung](/roadmap/merge/) zwei verbundene Teile von Ethereum-Software benötigt werden, um einen Knoten zu betreiben. Ein Ausführungsclient und ein Konsensclient. Bitte stellen Sie sicher, dass Ihr Knoten sowohl über einen Ausführungs- als auch einen Konsensclient verfügt. Wenn sich Ihr Knoten nicht auf einem lokalen Rechner (Ihr Knoten läuft z. B. auf einer AWS-Instanz) befindet, müssen Sie die IP-Adressen im Tutorial entsprechend anpassen. Für weitere Informationen schauen Sie sich unsere Seite zum [Betreiben eines Knotens](/developers/docs/nodes-and-clients/run-a-node/) an. +Bitte beachten Sie, dass seit [dem Merge](/roadmap/merge/) zwei verbundene Teile der Ethereum-Software – ein Ausführungs-Client und ein Konsens-Client – erforderlich sind, um einen Node zu betreiben. Bitte stellen Sie sicher, dass Ihr Knoten sowohl über einen Ausführungs- als auch einen Konsensclient verfügt. Wenn sich Ihr Node nicht auf Ihrem lokalen Rechner befindet (z. B. wenn er auf einer AWS-Instanz ausgeführt wird), aktualisieren Sie die IP-Adressen im Tutorial entsprechend. Weitere Informationen finden Sie auf unserer Seite über das [Betreiben eines Nodes](/developers/docs/nodes-and-clients/run-a-node/). ## Voraussetzungen {#prerequisites} -Sie müssen JavaScript verstehen. Zusätzlich ist es hilfreich, wenn Sie den [Ethereum-Stack](/developers/docs/ethereum-stack/) und [Ethereum-Clients](/developers/docs/nodes-and-clients/) ebenfalls verstehen. +Neben dem Verständnis von JavaScript könnte es hilfreich sein, den [Ethereum-Stack](/developers/docs/ethereum-stack/) und die [Ethereum-Clients](/developers/docs/nodes-and-clients/) zu verstehen. -## Warum eine Programmbibliothek verwenden? {#why-use-a-library} +## Warum eine Bibliothek verwenden? {#why-use-a-library} -Mit diesen Programmbibliotheken lässt sich die direkte Interaktion mit einem Ethereum-Node erheblich vereinfachen. Zudem bieten sie Dienstprogrammfunktionen (z. B. Umwandlung von ETH zu GWei), so dass Sie als Entwickler weniger Zeit damit verbringen, Probleme mit Ethereum-Clients zu lösen, und sich auf die einzigartigen Funktionen Ihrer Applikation konzentrieren können. +Durch Abstraktion vereinfachen diese Programmbibliotheken die komplexe direkte Interaktion mit einem Ethereum-Knoten. Sie bieten auch Hilfsfunktionen (z. B. die Umrechnung von ETH in Gwei), sodass Sie als Entwickler weniger Zeit mit den Feinheiten von Ethereum-Clients verbringen und sich mehr auf die einzigartige Funktionalität Ihrer Anwendung konzentrieren können. -## Eigenschaften von Programmbibliotheken {#library-features} +## Bibliotheksfunktionen {#library-features} -### Verbindung mit Ethereum-Nodes {#connect-to-ethereum-nodes} +### Mit Ethereum-Nodes verbinden {#connect-to-ethereum-nodes} Sie können sich über einen Provider und diese Bibliotheken mit Ethereum verbinden und die Daten auslesen – über JSON-RPC, INFURA, Etherscan, Alchemy oder MetaMask. +> **Warnung:** Web3.js wurde am 4. März 2025 archiviert. [Lesen Sie die Ankündigung](https://blog.chainsafe.io/web3-js-sunset/). Ziehen Sie für neue Projekte die Verwendung alternativer Bibliotheken wie [ethers.js](https://ethers.org) oder [viem](https://viem.sh) in Betracht. + **Ether-Beispiel** ```js -// Ein BrowserProvider umschließt einen standardmäßigen Web3-Provider, der -// von MetaMask als window.ethereum in jede Seite injiziert wird +// Ein BrowserProvider umschließt einen Standard-Web3-Provider, +// den MetaMask als window.ethereum in jede Seite injiziert const provider = new ethers.BrowserProvider(window.ethereum) -// Das MetaMask-Plugin ermöglicht auch das Signieren von Transaktionen, um -// Ether zu senden und bezahlte Statusänderungen innerhalb der Blockchain vorzunehmen. -// Dazu benötigen wir den Unterzeichner vom Konto... +// Das MetaMask-Plugin ermöglicht auch das Signieren von Transaktionen, +// um Ether zu senden und für Zustandsänderungen in der Blockchain zu bezahlen. +// Dafür benötigen wir den Signierer des Kontos... const signer = provider.getSigner() ``` @@ -68,7 +70,7 @@ Sobald die Einrichtung abgeschlossen ist, können Sie folgende Abfragen für die - Ressourcen-Schätzung - Smart-Contract-Ereignisse - Netzwerk-ID -- und weitere... +- und mehr... ### Wallet-Funktionalität {#wallet-functionality} @@ -77,7 +79,7 @@ Diese Programmbibliotheken bieten Ihnen die Funktionalität, um Wallets zu erste Hier ist ein Beispiel von Ethers ```js -// Erstelle eine Wallet-Instanz aus einem Mnemonik... +// Erstellen einer Wallet-Instanz aus einer Mnemonic... mnemonic = "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol" walletMnemonic = Wallet.fromPhrase(mnemonic) @@ -88,15 +90,15 @@ walletPrivateKey = new Wallet(walletMnemonic.privateKey) walletMnemonic.address === walletPrivateKey.address // true -// Die Adresse als Promise gemäß der Signer API +// Die Adresse als Promise gemäß der Signer-API walletMnemonic.getAddress() // { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' } -// Die Wallet-Adresse ist auch synchron verfügbar +// Eine Wallet-Adresse ist auch synchron verfügbar walletMnemonic.address // '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' -// Die internen kryptographischen Komponenten +// Die internen kryptografischen Komponenten walletMnemonic.privateKey // '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db' walletMnemonic.publicKey @@ -110,7 +112,7 @@ walletMnemonic.mnemonic // phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol' // } -// Hinweis: Ein Wallet, das mit einem privaten Schlüssel erstellt wurde, hat keine +// Hinweis: Eine Wallet, die mit einem privaten Schlüssel erstellt wurde, hat keine // Mnemonic (die Ableitung verhindert dies) walletPrivateKey.mnemonic // null @@ -128,8 +130,8 @@ tx = { walletMnemonic.signTransaction(tx) // { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' } -// Die Connect-Methode gibt eine neue Instanz des -// Wallets zurück, die mit einem Provider verbunden ist +// Die connect-Methode gibt eine neue Instanz des +// mit einem Provider verbundenen Wallets zurück wallet = walletMnemonic.connect(provider) // Abfragen des Netzwerks @@ -138,33 +140,33 @@ wallet.getBalance() wallet.getTransactionCount() // { Promise: 0 } -// Ether senden +// Senden von Ether wallet.sendTransaction(tx) ``` -[Lesen Sie die ganzen Dokumente](https://docs.ethers.io/v5/api/signer/#Wallet) +[Lesen Sie die vollständige Dokumentation](https://docs.ethers.io/v5/api/signer/#Wallet) Einmal eingerichtet, können Sie: - Konten erstellen - Transaktionen senden - Transaktionen signieren -- und weitere... +- und mehr... -### Mit den Funktionen von Smart Contracts interagieren {#interact-with-smart-contract-functions} +### Mit Smart-Contract-Funktionen interagieren {#interact-with-smart-contract-functions} JavaScript-Client-Bibliotheken ermöglichen Ihrer Anwendung, Smart Contract-Funktionen aufzurufen. Dafür lesen sie die Application Binary Interface (ABI) eines kompilierten Vertrags. Die ABI erklärt im Wesentlichen die Funktionen des Vertrags im JSON-Format und erlaubt die Verwendung wie ein normales JavaScript-Objekt. -Also folgender Solidity-Vertrag: +Folgender Solidity-Vertrag würde... ```solidity contract Test { uint a; address d = 0x12345678901234567890123456789012; - function Test(uint testInt) { a = testInt;} + constructor(uint testInt) { a = testInt;} event Event(uint indexed b, bytes32 c); @@ -177,7 +179,7 @@ contract Test { } ``` -Würde in nachfolgendem JSON resultieren: +... zu nachfolgendem JSON werden: ```json [{ @@ -213,11 +215,11 @@ Dies bedeutet Sie können: - Sie können einen Vertrag bereitstellen. - Und mehr... -### Dienstprogrammfunktionen {#utility-functions} +### Hilfsfunktionen {#utility-functions} Die Dienstprogrammfunktionen stellen Ihnen praktische Verknüpfungen bereit, die das Entwickeln mit Ethereum erleichtern. -ETH-Werte sind standardmäßig in Wei. 1 ETH = 1.000.000.000.000.000.000.000.000 WEI – sprich, Sie haben es mit vielen Zahlen zu tun. `web3.utils.toWei` konvertiert für Sie Ether in Wei. +ETH-Werte sind standardmäßig in Wei. 1 ETH = 1.000.000.000.000.000.000.000.000 WEI – sprich, Sie haben es mit vielen Zahlen zu tun. `web3.utils.toWei` konvertiert Ether für Sie in Wei. Das sieht in Ether wie folgt aus: @@ -232,60 +234,56 @@ ethers.utils.formatEther(balance) // '2.337132817842795605' ``` -- [Web3js-Dienstprogrammfunktionen](https://docs.web3js.org/api/web3-utils) -- [Ethers-Dienstprogrammfunktionen](https://docs.ethers.io/v5/api/utils/) +- [Web3.js-Hilfsfunktionen](https://docs.web3js.org/api/web3-utils) +- [Ethers-Hilfsfunktionen](https://docs.ethers.org/v6/api/utils/) -## Verfügbare Programmbibliotheken {#available-libraries} +## Verfügbare Bibliotheken {#available-libraries} -**Web3.js –** **_Ethereum-JavaScript-API_** +**Web3.js –** **_Ethereum-JavaScript-API._** -- [Dokumentation](https://docs.web3js.org/) -- [GitHub](https://github.com/ethereum/web3.js/) +- [Dokumentation](https://docs.web3js.org) +- [GitHub](https://github.com/ethereum/web3.js) -**Ethers.js –** **_Eine vollständige Ethereum-Wallet-Implementierung und Dienstprogramme in JavaScript und TypeScript_** +**Ethers.js –** **_Eine vollständige Ethereum-Wallet-Implementierung und Dienstprogramme in JavaScript und TypeScript._** -- [Dokumentation](https://docs.ethers.io/) -- [GitHub](https://github.com/ethers-io/ethers.js/) +- [Ethers.js-Startseite](https://ethers.org/) +- [Dokumentation](https://docs.ethers.io) +- [GitHub](https://github.com/ethers-io/ethers.js) -**The Graph –** **_Ein Protokoll für die Indizierung von Ethereum- und IPFS-Daten und Abfragen mit GraphQL_** +**The Graph –** **_Ein Protokoll zur Indizierung von Ethereum- und IPFS-Daten und deren Abfrage mit GraphQL._** -- [The Graph](https://thegraph.com/) -- [Graph Explorer](https://thegraph.com/explorer/) -- [Dokumentation](https://thegraph.com/docs/) -- [GitHub](https://github.com/graphprotocol/) +- [The Graph](https://thegraph.com) +- [Graph Explorer](https://thegraph.com/explorer) +- [Dokumentation](https://thegraph.com/docs) +- [GitHub](https://github.com/graphprotocol) - [Discord](https://thegraph.com/discord) -**light.js –** **_Eine reaktive High-Level-JS-Bibliothek, die für leichte Clients optimiert wurde._** - -- [GitHub](https://github.com/openethereum/js-libs/tree/master/packages/light.js) - - -**Alchemyweb3 –** **_Wrapper um Web3.js mit automatischen Wiederholungen und erweiterten APIs_** +**Alchemy SDK –** **_Ein Wrapper um Ethers.js mit erweiterten APIs._** -- [Dokumentation](https://docs.alchemy.com/reference/api-overview) -- [GitHub](https://github.com/alchemyplatform/alchemy-web3) +- [Dokumentation](https://www.alchemy.com/docs) +- [GitHub](https://github.com/alchemyplatform/alchemy-sdk-js) -**Alchemy NFT API –** **_API für den Abruf von NFT-Daten, einschließlich Eigentumsrechten, Metadatenattributen und mehr._** - -- [Dokumentation](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) -- [GitHub](https://github.com/alchemyplatform/alchemy-web3) - -**Viem -** **_Schnittstelle in TypeScript für Ethereum._** +**viem –** **_TypeScript-Schnittstelle für Ethereum._** - [Dokumentation](https://viem.sh) - [GitHub](https://github.com/wagmi-dev/viem) -## Weiterführende Informationen {#further-reading} +**Drift –** **_TypeScript-Meta-Bibliothek mit integriertem Caching, Hooks und Test-Mocks._** + +- [Dokumentation](https://ryangoree.github.io/drift/) +- [GitHub](https://github.com/ryangoree/drift/) + +## Weiterführende Lektüre {#further-reading} _Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} -- [Knotenpunkte und Clients](/developers/docs/nodes-and-clients/) +- [Nodes und Clients](/developers/docs/nodes-and-clients/) - [Entwicklungs-Frameworks](/developers/docs/frameworks/) -## Ähnliche Tutorials {#related-tutorials} +## Verwandte Tutorials {#related-tutorials} -- [Web3js einrichten, um die Ethereum-Blockchain in JavaScript zu nutzen](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Leitfaden für die Einrichtung von web3.js in Ihrem Projekt._ -- [Aufruf eines intelligenten Vertrags mit JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Mit dem DAI-Token können Sie die Funktion „Verträge aufrufen“ mit JavaScript verwenden._ -- [Transaktionen über web3 und Alchemy senden](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– Schritt-für-Schritt-Komplettlösung zum Senden von Transaktionen aus dem Backend._ +- [Web3.js einrichten, um die Ethereum-Blockchain in JavaScript zu verwenden](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Anleitung, um web3.js in Ihrem Projekt einzurichten._ +- [Einen Smart Contract aus JavaScript aufrufen](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Sehen Sie am Beispiel des DAI-Tokens, wie man Vertragsfunktionen mit JavaScript aufruft._ +- [Transaktionen mit Web3 und Alchemy senden](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– Schritt-für-Schritt-Anleitung zum Senden von Transaktionen vom Backend aus._ diff --git a/public/content/translations/de/developers/docs/apis/json-rpc/index.md b/public/content/translations/de/developers/docs/apis/json-rpc/index.md index ad51b54df9a..fe8d61cb2d4 100644 --- a/public/content/translations/de/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/de/developers/docs/apis/json-rpc/index.md @@ -6,31 +6,31 @@ lang: de Damit eine Software-Anwendung mit der Ethereum-Blockchain interagieren kann – entweder um Blockchain-Daten zu lesen oder Transaktionen an das Netzwerk zu senden – muss sie mit einem Ethereum-Knoten verbunden werden. -Zu diesem Zweck implementiert jeder [Ethereum-Client](/developers/docs/nodes-and-clients/#execution-clients) eine [JSON-RPC-Spezifikation](https://github.com/ethereum/execution-apis), sodass eine einheitliche Methode vorliegt, auf die sich Anwendungen verlassen können, unabhängig von der spezifischen Nodes oder Client Implementierung. +Zu diesem Zweck implementiert jeder [Ethereum-Client](/developers/docs/nodes-and-clients/#execution-clients) eine [JSON-RPC-Spezifikation](https://github.com/ethereum/execution-apis), sodass ein einheitlicher Satz von Methoden vorhanden ist, auf den sich Anwendungen unabhängig von der spezifischen Node- oder Client-Implementierung verlassen können. -[JSON-RPC](https://www.jsonrpc.org/specification) ist ein zustandsloses, leichtgewichtiges Remote-Prozeduraufruf-(RPC)-Protokoll. Es definiert mehrere Datenstrukturen und die Regeln für deren Verarbeitung. Sie ist transportunabhängig, da die Konzepte innerhalb eines Prozesses, über Sockets, über HTTP oder in vielen verschiedenen Nachrichtenübermittlungsumgebungen verwendet werden können. Verwendet wird dabei das Datenformat JSON (RFC 4627). +[JSON-RPC](https://www.jsonrpc.org/specification) ist ein zustandsloses, schlankes Remote-Prozeduraufruf- (RPC) Protokoll. Es definiert mehrere Datenstrukturen und die Regeln für deren Verarbeitung. Sie ist transportunabhängig, da die Konzepte innerhalb eines Prozesses, über Sockets, über HTTP oder in vielen verschiedenen Nachrichtenübermittlungsumgebungen verwendet werden können. Verwendet wird dabei das Datenformat JSON (RFC 4627). ## Client-Implementierungen {#client-implementations} -Ethereum-Clients können bei der Implementierung der JSON-RPC-Spezifikation jeweils unterschiedliche Programmiersprachen verwenden. Weitere Details zu den einzelnen Programmiersprachen finden Sie in der [Client-Dokumentation](/developers/docs/nodes-and-clients/#execution-clients). Es wird empfohlen, dass Sie sich mit den neuesten Informationen zur API-Unterstützung in der Dokumentation des jeweiligen Clients vertraut machen. +Ethereum-Clients können bei der Implementierung der JSON-RPC-Spezifikation jeweils unterschiedliche Programmiersprachen verwenden. Weitere Details zu bestimmten Programmiersprachen finden Sie in der jeweiligen [Client-Dokumentation](/developers/docs/nodes-and-clients/#execution-clients). Es wird empfohlen, dass Sie sich mit den neuesten Informationen zur API-Unterstützung in der Dokumentation des jeweiligen Clients vertraut machen. -## Komfortable Bibliotheken {#convenience-libraries} +## Convenience-Bibliotheken {#convenience-libraries} -Es ist möglich, über die JSAON-RPC-API direkt mit Ethereum-Clients zu interagieren, doch für dApp-Entwickler gibt es häufig einfachere Optionen. Es gibt viele [JavaScript-](/developers/docs/apis/javascript/#available-libraries) und [Backend-API-](/developers/docs/apis/backend/#available-libraries) Bibliotheken, die Wrapper für die JSON-RPC-API bereitstellen. Mithilfe dieser Bibliotheken können Entwickler intuitive, einzeilige Methoden in der Programmiersprache ihrer Wahl schreiben, um JSON-RPC-Anforderungen (unter der Haube) zu initialisieren, die mit Ethereum interagieren. +Es ist möglich, über die JSAON-RPC-API direkt mit Ethereum-Clients zu interagieren, doch für dApp-Entwickler gibt es häufig einfachere Optionen. Es existieren viele [JavaScript-](/developers/docs/apis/javascript/#available-libraries) und [Backend-API-](/developers/docs/apis/backend/#available-libraries)Bibliotheken, die Wrapper für die JSON-RPC-API bereitstellen. Mithilfe dieser Bibliotheken können Entwickler intuitive, einzeilige Methoden in der Programmiersprache ihrer Wahl schreiben, um JSON-RPC-Anforderungen (unter der Haube) zu initialisieren, die mit Ethereum interagieren. -## Konsensclient-APIs {#consensus-clients} +## Konsens-Client-APIs {#consensus-clients} -Diese Seite befasst sich hauptsächlich mit der JSON-RPC-API, die von Ethereum-Ausführungsclients verwendet wird. Konsensclients haben jedoch auch eine RPC-API, mit der Benutzer Informationen über den Knoten abfragen sowie Beacon-Blöcke, Beacon-Zustand und andere konsensbezogene Informationen direkt von einem Knoten anfordern können. Diese API ist auf der Webseite [Beacon API](https://ethereum.github.io/beacon-APIs/#/) dokumentiert. +Diese Seite befasst sich hauptsächlich mit der JSON-RPC-API, die von Ethereum-Ausführungsclients verwendet wird. Konsensclients haben jedoch auch eine RPC-API, mit der Benutzer Informationen über den Knoten abfragen sowie Beacon-Blöcke, Beacon-Zustand und andere konsensbezogene Informationen direkt von einem Knoten anfordern können. Diese API ist auf der [Beacon-API-Webseite](https://ethereum.github.io/beacon-APIs/#/) dokumentiert. Es wird auch eine interne API für die Kommunikation zwischen Clients innerhalb eines Knotens verwendet, d. h. sie ermöglicht es dem Konsensclient und dem Ausführungsclient, Daten auszutauschen. Dies wird als „Engine API“ bezeichnet und die Spezifikationen sind auf [GitHub](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) verfügbar. -## Spezifikationen des Ausführungsclients {#spec} +## Ausführungs-Client-Spezifikation {#spec} -[ Lesen Sie die vollständige JSON-RPC-API-Spezifikation auf GitHub](https://github.com/ethereum/execution-apis). Diese API ist auf der [Execution API-Webseite](https://ethereum.github.io/execution-apis/api-documentation/) dokumentiert und enthält einen Inspector, mit dem Sie alle verfügbaren Methoden ausprobieren können. +[Lesen Sie die vollständige JSON-RPC-API-Spezifikation auf GitHub](https://github.com/ethereum/execution-apis). Diese API ist auf der [Execution API Webseite](https://ethereum.github.io/execution-apis/) dokumentiert und enthält einen Inspector, um alle verfügbaren Methoden auszuprobieren. ## Konventionen {#conventions} -### Hexadezimalwert-Kodierung {#hex-encoding} +### Hex-Wert-Kodierung {#hex-encoding} In JSON werden zwei Schlüssel-Datentypen übertragen: Roh-Byte-Arrays und Mengen. Beide werden mit einer Hex-Kodierung übertragen, haben jedoch unterschiedliche Anforderungen an das Format. @@ -58,9 +58,9 @@ Hier sind einige Beispiele: - FALSCH: 0xf0f0f (muss eine gerade Anzahl von Ziffern haben) - FALSCH: 004200 (muss 0x als Präfix hinzufügen) -### Der Standardblockparameter {#default-block} +### Der Block-Parameter {#block-parameter} -Die folgenden Methoden haben einen zusätzlichen Standardblockparameter: +Die folgenden Methoden haben einen Blockparameter: - [eth_getBalance](#eth_getbalance) - [eth_getCode](#eth_getcode) @@ -68,36 +68,36 @@ Die folgenden Methoden haben einen zusätzlichen Standardblockparameter: - [eth_getStorageAt](#eth_getstorageat) - [eth_call](#eth_call) -Wenn Anfragen gestellt werden, die den Zustand von Ethereum beeinflussen, bestimmt der letzte Standardblockparameter die Höhe des Blocks. +Wenn Anfragen gestellt werden, die den Status von Ethereum abfragen, bestimmt der angegebene Blockparameter die Höhe des Blocks. -Folgende Optionen sind für den Standardblockparameter möglich: +Für den Blockparameter sind folgende Optionen möglich: -- `HEX String` - eine ganzzahlige Blocknummer -- `String „frühestes“` für den frühesten/Genesis-Block -- `String "latest"` – für den neuesten vorgeschlagenen Block -- `String „sicher“` - für den neuesten sicheren Block -- `String „finalisiert“` - für den neuesten finalisierten Block -- `String „ausstehend“` - für den ausstehenden Zustand/Transaktionen +- `HEX-String` – eine ganzzahlige Blocknummer +- `String „earliest“` für den frühesten/Genesis-Block +- `String „latest“` – für den letzten vorgeschlagenen Block +- `String „safe“` – für den letzten sicheren Head-Block +- `String „finalized“` – für den letzten finalisierten Block +- `String „pending“` – für den ausstehenden Zustand/die ausstehenden Transaktionen ## Beispiele -Auf dieser Seite stellen wir Beispiele dafür bereit, wie man einzelne JSON_RPC API-Endpunkte mit dem Befehlszeilenwerkzeug [curl](https://curl.se) verwendet. Diese Beispiele für einzelne Endpunkte finden sich im Abschnitt [Curl-Beispiele](#curl-examples) unten. Weiter unten auf der Seite stellen wir auch ein [End-to-End-Beispiel](#usage-example) bereit, wie man mithilfe eines Geth-Nodes, der JSON_RPC API und curl einen Smart Contract kompiliert und bereitstellt. +Auf dieser Seite stellen wir Beispiele für die Verwendung einzelner JSON-RPC-API-Endpunkte mit dem Kommandozeilen-Tool [curl](https://curl.se) zur Verfügung. Diese Beispiele für einzelne Endpunkte finden Sie weiter unten im Abschnitt [Curl-Beispiele](#curl-examples). Weiter unten auf der Seite stellen wir außerdem ein [End-to-End-Beispiel](#usage-example) für das Kompilieren und Bereitstellen eines Smart Contracts unter Verwendung eines Geth-Nodes, der JSON-RPC-API und curl bereit. ## Curl-Beispiele {#curl-examples} -Beispiele zur Verwendung der JSON_RPC-API durch Ausführen von [curl](https://curl.se)-Anfragen an einem Ethereum-Knoten werden unten bereitgestellt. Jedes Beispiel enthält eine Beschreibung des spezifischen Endpunkts, seiner Parameter, seines Rückgabetyps und ein Beispiel dafür, wie es verwendet werden sollte. +Nachfolgend finden Sie Beispiele für die Verwendung der JSON-RPC-API durch Senden von [curl](https://curl.se)-Anfragen an einen Ethereum-Node. Jedes Beispiel enthält eine Beschreibung des spezifischen Endpunkts, seiner Parameter, seines Rückgabetyps und ein Beispiel dafür, wie es verwendet werden sollte. -Es kann sein, dass die curl-Anfragen eine Fehlermeldung im Zusammenhang mit dem Inhaltstyp zurückgeben. Das liegt daran, dass die Option `--data` den Inhaltstyp auf `application/x-www-form-urlencoded` festlegt. Wenn Ihr Knoten sich darüber beschwert, setzen Sie den Header manuell, indem Sie am Anfang des Aufrufs `-H "Content-Type: application/json"` platzieren. In den Beispielen ist auch die URL/IP & Port-Kombination nicht enthalten, die als letztes Argument an curl übergeben werden muss (z. B. `127.0.0.1:8545`). Ein vollständiger curl-Aufruf, der diese zusätzlichen Daten enthält, hat folgende Form: +Es kann sein, dass die curl-Anfragen eine Fehlermeldung im Zusammenhang mit dem Inhaltstyp zurückgeben. Das liegt daran, dass die Option `--data` den Inhaltstyp auf `application/x-www-form-urlencoded` setzt. Wenn Ihr Node sich darüber beschwert, setzen Sie den Header manuell, indem Sie `-H "Content-Type: application/json"` an den Anfang des Aufrufs stellen. Die Beispiele enthalten auch nicht die URL/IP- und Port-Kombination, die das letzte an curl übergebene Argument sein muss (z. B. `127.0.0.1:8545`). Ein vollständiger curl-Aufruf, der diese zusätzlichen Daten enthält, hat folgende Form: ```shell curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545 ``` -## Kommunikation, Zustand, Verlauf {#gossip-state-history} +## Gossip, Zustand, Verlauf {#gossip-state-history} -Eine Handvoll Kernmethoden von JSON-RPC erfordern Daten aus dem Ethereum-Netzwerk und gehören in drei Hauptkategorien: _Kommunikation, Zustand, Verlauf_. Verwenden Sie die Links in diesen Abschnitten, um zu jeder Methode zu springen, oder verwenden Sie das Inhaltsverzeichnis, um die gesamte Liste der Methoden zu durchsuchen. +Eine Handvoll zentraler JSON-RPC-Methoden erfordern Daten aus dem Ethereum-Netzwerk und lassen sich in drei Hauptkategorien einteilen: _Gossip, Zustand und Verlauf_. Verwenden Sie die Links in diesen Abschnitten, um zu jeder Methode zu springen, oder verwenden Sie das Inhaltsverzeichnis, um die gesamte Liste der Methoden zu durchsuchen. -### Kommunikationsmethoden {#gossip-methods} +### Gossip-Methoden {#gossip-methods} > Diese Methoden verfolgen die Spitze der Blockchain. Das ist der Weg, wie Transaktionen sich im Netzwerk verbreiten, in Blöcke aufgenommen werden und wie Clients von neuen Blöcken erfahren. @@ -136,26 +136,26 @@ Eine Handvoll Kernmethoden von JSON-RPC erfordern Daten aus dem Ethereum-Netzwer Sie können das [Playground-Tool](https://ethereum-json-rpc.com) verwenden, um die API-Methoden zu entdecken und auszuprobieren. Es zeigt Ihnen auch, welche Methoden und Netzwerke von verschiedenen Knotenanbietern unterstützt werden. -## JSON-RPC API-Methoden {#json-rpc-methods} +## JSON-RPC-API-Methoden {#json-rpc-methods} -### web3_ClientVersion {#web3_clientversion} +### web3_clientVersion {#web3_clientversion} Gibt die aktuelle Client-Version zurück. **Parameter** -Keine +Keine (None) -**Rückgaben** +**Rückgabewerte** -`String` - Die aktuelle Client-Version +`String` – Die aktuelle Client-Version **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' -// Result +// Ergebnis { "id":67, "jsonrpc":"2.0", @@ -165,26 +165,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[], ### web3_sha3 {#web3_sha3} -Gibt Keccak-256 (_nicht_ der standardisierte SHA3-256) von den gegebenen Daten zurück. +Gibt den Keccak-256 (_nicht_ den standardisierten SHA3-256) der angegebenen Daten zurück. **Parameter** -1. `DATA` – die Daten, die in einen SHA3-Hash konvertiert werden sollen +1. `DATA` – Die Daten, die in einen SHA3-Hash umgewandelt werden sollen ```js params: ["0x68656c6c6f20776f726c64"] ``` -**Rückgabewert** +**Rückgabewerte** -`DATA` - Das SHA3-Ergebnis des gegebenen Strings. +`DATA` – Das SHA3-Ergebnis des angegebenen Strings. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}' -// Result +// Ergebnis { "id":64, "jsonrpc": "2.0", @@ -198,24 +198,24 @@ Gibt die aktuelle Netzwerk-ID zurück. **Parameter** -Keine +Keine (None) -**Rückgabewert** +**Rückgabewerte** -`String` - Die aktuelle Netzwerk-ID. +`String` – Die aktuelle Netzwerk-ID. -Die vollständige Liste der aktuellen Netzwerk-IDs ist verfügbar unter [chainlist.org](https://chainlist.org). Einige häufige sind: +Die vollständige Liste der aktuellen Netzwerk-IDs ist unter [chainlist.org](https://chainlist.org) verfügbar. Einige häufige sind: - `1`: Ethereum Mainnet -- `11155111`: Sepolia Testnetz -- `560048` : Hoodi Testnetz +- `11155111`: Sepolia Testnet +- `560048` : Hoodi-Testnet **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}' -// Result +// Ergebnis { "id":67, "jsonrpc": "2.0", @@ -225,22 +225,22 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67 ### net_listening {#net_listening} -Gibt `true` zurück, wenn der Client aktiv auf Netzwerkverbindungen hört. +Gibt `true` zurück, wenn der Client aktiv auf Netzwerkverbindungen lauscht. **Parameter** -Keine +Keine (None) -**Rückgabewert** +**Rückgabewerte** -`Boolean` - `true`, wenn zuhörend, ansonsten `false`. +`Boolean` – `true`, wenn gelauscht wird, andernfalls `false`. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}' -// Result +// Ergebnis { "id":67, "jsonrpc":"2.0", @@ -254,18 +254,18 @@ Gibt die Anzahl der aktuell mit dem Client verbundenen Peers zurück. **Parameter** -Keine +Keine (None) -**Rückgabewert** +**Rückgabewerte** -`QUANTITY` - Ganzzahlwert, der die Anzahl der verbundenen Peers repräsentiert. +`QUANTITY` – Ganzzahl der Anzahl der verbundenen Peers. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}' -// Result +// Ergebnis { "id":74, "jsonrpc": "2.0", @@ -275,22 +275,22 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id": ### eth_protocolVersion {#eth_protocolversion} -Gibt die aktuelle Ethereum-Protokollversion zurück. Beachten Sie, dass diese Methode [nicht in Geth verfügbar](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924) ist. +Gibt die aktuelle Ethereum-Protokollversion zurück. Beachten Sie, dass diese Methode in [Geth nicht verfügbar ist](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924). **Parameter** -Keine +Keine (None) -**Rückgabewert** +**Rückgabewerte** -`String` - Die aktuelle Ethereum-Protokollversion +`String` – Die aktuelle Ethereum-Protokollversion **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}' -// Result +// Ergebnis { "id":67, "jsonrpc": "2.0", @@ -300,21 +300,25 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[] ### eth_syncing {#eth_syncing} -Gibt ein Objekt mit Daten zum Synchronisierungsstatus oder `false` zurück. +Gibt ein Objekt mit Daten über den Synchronisierungsstatus oder `false` zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** -Keine +Keine (None) -**Rückgabewert** +**Rückgabewerte** -Die genauen Rückgabedaten variieren je nach Client-Implementierung. Alle Clients geben `False` zurück, wenn der Knoten nicht synchronisiert wird, und alle Clients geben die nachfolgenden Felder zurück. +Die genauen Rückgabedaten variieren je nach Client-Implementierung. Alle Clients geben `False` zurück, wenn der Node nicht synchronisiert wird, und alle Clients geben die folgenden Felder zurück. -`Object|Boolean` – ein Objekt mit Synchronisierungsstatus-Daten oder `FALSE`, wenn nicht synchronisiert wird: +`Object|Boolean`, Ein Objekt mit Synchronisierungsstatusdaten oder `FALSE`, wenn nicht synchronisiert wird: -- `startingBlock`: `QUANTITY` - Der Block, bei dem der Import begonnen hat (wird nur zurückgesetzt, nachdem die Synchronisierung ihren Kopf erreicht hat) -- `currentBlock`: `QUANTITY` - Der aktuelle Block, identisch zu eth_blockNumber -- `highestBlock`: `QUANTITY` - Der geschätzte höchste Block +- `startingBlock`: `QUANTITY` – Der Block, bei dem der Import gestartet wurde (wird erst zurückgesetzt, nachdem die Synchronisierung ihren Head erreicht hat) +- `currentBlock`: `QUANTITY` – Der aktuelle Block, wie bei eth_blockNumber +- `highestBlock`: `QUANTITY` – Der geschätzte höchste Block Die einzelnen Clients können jedoch auch zusätzliche Daten liefern. Beispielsweise gibt Geth Folgendes zurück: @@ -362,9 +366,9 @@ Weitere Einzelheiten finden Sie in der Dokumentation zu Ihrem jeweiligen Client. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -374,7 +378,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1} highestBlock: '0x454' } } -// Or when not syncing +// Oder wenn nicht synchronisiert wird { "id":1, "jsonrpc": "2.0", @@ -386,20 +390,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1} Gibt die Coinbase-Adresse des Clients zurück. + + Endpunkt im Playground ausprobieren + + +> **Hinweis:** Diese Methode ist seit **v1.14.0** veraltet und wird nicht mehr unterstützt. Der Versuch, diese Methode zu verwenden, führt zu dem Fehler „Method not supported“. + **Parameter** Keine (None) -**Rückgaben** +**Rückgabewerte** -`DATA`, 20 Byte – die aktuelle Coinbase-Adresse. +`DATA`, 20 Bytes – die aktuelle Coinbase-Adresse. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":64}' -// Result +// Ergebnis { "id":64, "jsonrpc": "2.0", @@ -411,20 +421,24 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":6 Gibt die Ketten-ID zurück, die für das Unterzeichnen der Replay-geschützten Transaktionen verwendet wird. + + Endpunkt im Playground ausprobieren + + **Parameter** Keine (None) -**Rückgaben** +**Rückgabewerte** -`chainId` – Hexadezimalwert als String, der die Ganzzahl der aktuellen Ketten-ID repräsentiert. +`chainId`, Hexadezimalwert als String, der die Ganzzahl der aktuellen Ketten-ID darstellt. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}' -// Result +// Ergebnis { "id":67, "jsonrpc": "2.0", @@ -434,20 +448,24 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67 ### eth_mining {#eth_mining} -Gibt `true` zurück, wenn der Client aktiv neue Blöcke mint. Dies kann für Proof-of-Work-Netzwerke nur `true` zurückgeben und ist möglicherweise seit [der Zusammenführung](/roadmap/merge/) in einigen Clients nicht mehr verfügbar. +Gibt `true` zurück, wenn der Client aktiv neue Blöcke schürft. Dies kann nur bei Proof-of-Work-Netzwerken `true` zurückgeben und ist bei einigen Clients seit [The Merge](/roadmap/merge/) möglicherweise nicht mehr verfügbar. + + + Endpunkt im Playground ausprobieren + **Parameter** Keine (None) -**Rückgaben** +**Rückgabewerte** -`Boolean` – gibt `true` zurück, wenn der Client aktiv mint, andernfalls `false`. +`Boolean` – gibt `true` zurück, wenn der Client schürft, andernfalls `false`. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}' // { @@ -459,22 +477,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71} ### eth_hashrate {#eth_hashrate} -Gibt die Anzahl der Hashes pro Sekunde zurück, mit der der Knoten mint. Dies kann für Proof-of-Work-Netzwerke nur `true` zurückgeben und ist möglicherweise seit [der Zusammenführung](/roadmap/merge/) in einigen Clients nicht mehr verfügbar. +Gibt die Anzahl der Hashes pro Sekunde zurück, mit der der Knoten mint. Dies kann nur bei Proof-of-Work-Netzwerken `true` zurückgeben und ist bei einigen Clients seit [The Merge](/roadmap/merge/) möglicherweise nicht mehr verfügbar. + + + Endpunkt im Playground ausprobieren + **Parameter** Keine (None) -**Rückgaben** +**Rückgabewerte** `QUANTITY` – Anzahl der Hashes pro Sekunde. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":71}' -// Result +// Ergebnis { "id":71, "jsonrpc": "2.0", @@ -486,20 +508,24 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":7 Gibt eine Schätzung des aktuellen Preises pro Gas in Wei zurück. Der Besu-Client prüft beispielsweise die letzten 100 Blöcke und gibt standardmäßig den mittleren Preis pro Gas-Einheit zurück. + + Endpunkt im Playground ausprobieren + + **Parameter** Keine (None) -**Rückgaben** +**Rückgabewerte** -`QUANTITY` – Ganzzahl des aktuellen Gas-Preises in Wei. +`QUANTITY` – Ganzzahl des aktuellen Gaspreises in Wei. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}' -// Result +// Ergebnis { "id":73, "jsonrpc": "2.0", @@ -511,20 +537,24 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":7 Gibt eine Liste von Adressen zurück, die dem Client gehören. + + Endpunkt im Playground ausprobieren + + **Parameter** Keine (None) -**Rückgaben** +**Rückgabewerte** -`Array of DATA`, 20 Byte – Adressen, die dem Client gehören. +`Array von DATA`, 20 Bytes – Adressen, die dem Client gehören. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -534,22 +564,26 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1 ### eth_blockNumber {#eth_blocknumber} -Gibt die Zahl des aktuellsten Blocks zurück. +Gibt die Nummer des neuesten Blocks zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** Keine (None) -**Rückgaben** +**Rückgabewerte** -`QUANTITY` – Ganzzahl der Blocknummer, auf der sich der Client derzeit befindet. +`QUANTITY` – Ganzzahl der aktuellen Blocknummer, auf der sich der Client befindet. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}' -// Result +// Ergebnis { "id":83, "jsonrpc": "2.0", @@ -559,27 +593,31 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id ### eth_getBalance {#eth_getbalance} -Gibt das Guthaben des Kontos einer bestimmten Adresse zurück. +Gibt das Guthaben des Kontos an einer bestimmten Adresse zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** -1. `DATA`, 20 Bytes - Adresse, deren Guthaben überprüft werden soll. -2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +1. `DATA`, 20 Bytes – Adresse, deren Guthaben geprüft werden soll. +2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"] ``` -**Rückgaben** +**Rückgabewerte** -`QUANTITY` – Ganzzahl für den aktuellen Saldo in Wei. +`QUANTITY` – Ganzzahl des aktuellen Guthabens in Wei. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -591,30 +629,35 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407 Gibt den Wert aus einer Speicherposition an einer angegebenen Adresse zurück. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `DATA`, 20 Bytes - Adresse des Speichers. -2. `QUANTITY` - Ganzzahlwert der Position im Speicher. -3. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"`, `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +1. `DATA`, 20 Bytes – Adresse des Speichers. +2. `QUANTITY` – Ganzzahl der Position im Speicher. +3. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) -**Rückgaben** +**Rückgabewerte** `DATA` – der Wert an dieser Speicherposition. -**Beispiel:** Die Berechnung der richtigen Position hängt vom abzurufenden Speicher ab. Betrachten Sie den folgenden Contract, der unter `0x295a70b2de5e3953354a6a8344e616ed314d7251` von der Adresse `0x391694e7e0b0cce554cb130d723a9d27458f9298` bereitgestellt wurde. +**Beispiel** +Die Berechnung der korrekten Position hängt vom abzurufenden Speicher ab. Betrachten Sie den folgenden Contract, der unter `0x295a70b2de5e3953354a6a8344e616ed314d7251` von der Adresse `0x391694e7e0b0cce554cb130d723a9d27458f9298` bereitgestellt wurde. ``` contract Storage { uint pos0; mapping(address => uint) pos1; - function Storage() { + constructor() { pos0 = 1234; pos1[msg.sender] = 5678; } } ``` -Das Abrufen des Wertes von pos0 ist simpel: +Das Abrufen des Wertes von pos0 ist einfach: ```js curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545 @@ -658,28 +701,32 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ Gibt die Anzahl der von einer Adresse _gesendeten_ Transaktionen zurück. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `DATA`, 20 Bytes - Adresse. -2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +1. `DATA`, 20 Bytes – Adresse. +2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ "0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "latest", // state at the latest block + "latest", // Zustand des neuesten Blocks ] ``` -**Rückgaben** +**Rückgabewerte** `QUANTITY` – Ganzzahl der Anzahl der von dieser Adresse gesendeten Transaktionen. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1","latest"],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -691,15 +738,19 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params Gibt die Anzahl der Transaktionen in einem Block zurück, von einem Block, der dem angegebenen Block-Hash entspricht. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `DATA`, 32 Bytes - Hash eines Blocks +1. `DATA`, 32 Bytes – Hash eines Blocks ```js params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"] ``` -**Rückgaben** +**Rückgabewerte** `QUANTITY` – Ganzzahl der Anzahl der Transaktionen in diesem Block. @@ -720,9 +771,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHa Gibt die Anzahl der Transaktionen in einem Block zurück, der der angegebenen Blocknummer entsprechen. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `QUANTITY|TAG` – Ganzzahl einer Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block). +1. `QUANTITY|TAG` – eine Ganzzahl einer Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter). ```js params: [ @@ -730,7 +785,7 @@ params: [ ] ``` -**Rückgaben** +**Rückgabewerte** `QUANTITY` – Ganzzahl der Anzahl der Transaktionen in diesem Block. @@ -751,17 +806,21 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNu Gibt die Anzahl der Onkel in einem Block zurück, der dem angegebenen Block-Hash entspricht. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `DATA`, 32 Bytes - Hash eines Blocks +1. `DATA`, 32 Bytes – Hash eines Blocks ```js params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"] ``` -**Rückgaben** +**Rückgabewerte** -`QUANTITY` – Ganzzahl für die Anzahl der Onkel in diesem Block. +`QUANTITY` – Ganzzahl der Anzahl der Uncles in diesem Block. **Beispiel** @@ -780,9 +839,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","p Gibt die Anzahl der Onkel in einem Block zurück, der der angegebenen Blocknummer entspricht. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `QUANTITY|TAG` – Ganzzahl einer Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +1. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ @@ -790,9 +853,9 @@ params: [ ] ``` -**Rückgaben** +**Rückgabewerte** -`QUANTITY` – Ganzzahl für die Anzahl der Onkel in diesem Block. +`QUANTITY` – Ganzzahl der Anzahl der Uncles in diesem Block. **Beispiel** @@ -811,10 +874,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber", Gibt den Code an einer angegebenen Adresse zurück. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `DATA`, 20 Bytes - Adresse -2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +1. `DATA`, 20 Bytes – Adresse +2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ @@ -823,7 +890,7 @@ params: [ ] ``` -**Rückgaben** +**Rückgabewerte** `DATA` – der Code von der angegebenen Adresse. @@ -842,27 +909,27 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA ### eth_sign {#eth_sign} -Die Unterzeichnungsmethode berechnet eine Ethereum-spezifische Signatur mit: `sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`. +Die sign-Methode berechnet eine Ethereum-spezifische Signatur mit: `sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`. -Durch das Hinzufügen eines Präfixes zur Nachricht wird die berechnete Signatur als Ethereum-spezifische Signatur erkennbar. Das verhindert Missbrauch, bei dem eine bösartige dApp beliebige Daten (z. B. Transaktionen) signieren und die Signatur nutzen kann, um sich als das Opfer auszugeben. +Durch das Hinzufügen eines Präfixes zur Nachricht wird die berechnete Signatur als Ethereum-spezifische Signatur erkennbar. Dies verhindert einen Missbrauch, bei dem eine böswillige Dapp beliebige Daten (z. B. eine Transaktion) signieren und die Signatur verwenden kann, um sich als das Opfer auszugeben. Hinweis: Die zum Signieren verwendete Adresse muss entsperrt sein. **Parameter** -1. `DATA`, 20 Bytes - Adresse -2. `DATA`, N Bytes - Nachricht zum Signieren +1. `DATA`, 20 Bytes – Adresse +2. `DATA`, N Bytes – zu signierende Nachricht -**Rückgaben** +**Rückgabewerte** `DATA`: Signatur **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"],"id":1}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -872,31 +939,31 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d37 ### eth_signTransaction {#eth_signtransaction} -Signiert eine Transaktion, die zu einem späteren Zeitpunkt an das Netzwerk gesendet werden kann, indem sie mit [eth_sendRawTransaction](#eth_sendrawtransaction) verwendet wird. +Signiert eine Transaktion, die zu einem späteren Zeitpunkt mit [eth_sendRawTransaction](#eth_sendrawtransaction) an das Netzwerk übermittelt werden kann. **Parameter** -1. `Objekt` - Das Transaktionsobjekt +1. `Object` – Das Transaktionsobjekt - `type`: -- `from`: `DATA`, 20 Bytes - Die Adresse, von der die Transaktion gesendet wird. -- `to`: `DATA`, 20 Bytes - (Optional beim Erstellen eines neuen Vertrags) Die Adresse, an die die Transaktion gerichtet ist. -- `gas`: `MENGE` - (Optional, Standard: 90000) Ganzzahlwert des Gases, das für die Transaktionsausführung bereitgestellt wurde. Es wird ungenutztes Gas zurückgegeben. -- `gasPrice`: `QUANTITY` – (optional, Standard: noch zu bestimmen) Ganzzahl von gasPrice, die für jedes bezahlte Gas verwendet wird, in Wei. -- `value`: `QUANTITY` – (optional) Ganzzahl des Werts, der mit dieser Transaktion gesendet wird, in Wei. -- `data`: `DATA` - Der kompilierte Code eines Vertrags ODER der Hash der aufgerufenen Methode Signatur und kodierter Parameter. -- `nonce`: `QUANTITY` - (Optional) Ganzzahlwert einer Nonce. Dies ermöglicht es, eigene ausstehende Transaktionen mit der gleichen Nonce zu überschreiben. +- `from`: `DATA`, 20 Bytes – Die Adresse, von der die Transaktion gesendet wird. +- `to`: `DATA`, 20 Bytes – (optional bei der Erstellung eines neuen Vertrags) Die Adresse, an die die Transaktion gerichtet ist. +- `gas`: `QUANTITY` – (optional, Standard: 90000) Ganzzahl des für die Transaktionsausführung bereitgestellten Gases. Es wird ungenutztes Gas zurückgegeben. +- `gasPrice`: `QUANTITY` – (optional, Standard: wird noch festgelegt) Ganzzahl des Gaspreises, der für jedes bezahlte Gas in Wei verwendet wird. +- `value`: `QUANTITY` – (optional) Ganzzahl des mit dieser Transaktion gesendeten Werts in Wei. +- `data`: `DATA` – Der kompilierte Code eines Vertrags ODER der Hash der aufgerufenen Methodensignatur und der kodierten Parameter. +- `nonce`: `QUANTITY` – (optional) Ganzzahl einer Nonce. Dies ermöglicht es, eigene ausstehende Transaktionen mit der gleichen Nonce zu überschreiben. -**Rückgaben** +**Rückgabewerte** -`DATA` – das RLP-codierte Transaktionsobjekt, das vom angegebenen Konto signiert wurde. +`DATA`, Das RLP-kodierte Transaktionsobjekt, das vom angegebenen Konto signiert wurde. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction","params": [{"data":"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675","from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155","gas": "0x76c0","gasPrice": "0x9184e72a000","to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567","value": "0x9184e72a"}]}' -// Result +// Ergebnis { "id": 1, "jsonrpc": "2.0", @@ -906,19 +973,19 @@ curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction"," ### eth_sendTransaction {#eth_sendtransaction} -Erstellt eine neue Nachrichtenanruftransaktion oder eine Contract-Erstellung, wenn das Datenfeld Code enthält, und signiert sie mit dem im `from`-Feld angegebenen Konto. +Erstellt eine neue Nachrichtenaufruf-Transaktion oder eine Vertragserstellung, wenn das Datenfeld Code enthält, und signiert sie mit dem in `from` angegebenen Konto. **Parameter** -1. `Objekt` - Das Transaktionsobjekt +1. `Object` – Das Transaktionsobjekt -- `from`: `DATA`, 20 Bytes - Die Adresse, von der die Transaktion gesendet wird. -- `to`: `DATA`, 20 Bytes - (Optional beim Erstellen eines neuen Vertrags) Die Adresse, an die die Transaktion gerichtet ist. -- `gas`: `MENGE` - (Optional, Standard: 90000) Ganzzahlwert des Gases, das für die Transaktionsausführung bereitgestellt wurde. Es wird ungenutztes Gas zurückgegeben. -- `gasprice`: `QUANTITY` – (Optional, Standard: Noch zu bestimmen) Ganzzahlwert des Gaspreises, der für jedes bezahlte Gas verwendet wird. -- `Value`: `QUANTITY` - (Optional) Ganzzahlwert des mit dieser Transaktion gesendeten Werts. -- `input`: `DATA` – der kompilierte Code eines Contracts ODER der Hash der aufgerufenen Methodensignatur und der codierten Parameter. -- `nonce`: `QUANTITY` - (Optional) Ganzzahlwert einer Nonce. Dies ermöglicht es, eigene ausstehende Transaktionen mit der gleichen Nonce zu überschreiben. +- `from`: `DATA`, 20 Bytes – Die Adresse, von der die Transaktion gesendet wird. +- `to`: `DATA`, 20 Bytes – (optional bei der Erstellung eines neuen Vertrags) Die Adresse, an die die Transaktion gerichtet ist. +- `gas`: `QUANTITY` – (optional, Standard: 90000) Ganzzahl des für die Transaktionsausführung bereitgestellten Gases. Es wird ungenutztes Gas zurückgegeben. +- `gasPrice`: `QUANTITY` – (optional, Standard: wird noch festgelegt) Ganzzahl des Gaspreises, der für jedes bezahlte Gas verwendet wird. +- `value`: `QUANTITY` – (optional) Ganzzahl des mit dieser Transaktion gesendeten Werts. +- `input`: `DATA` – Der kompilierte Code eines Vertrags ODER der Hash der aufgerufenen Methodensignatur und der kodierten Parameter. +- `nonce`: `QUANTITY` – (optional) Ganzzahl einer Nonce. Dies ermöglicht es, eigene ausstehende Transaktionen mit der gleichen Nonce zu überschreiben. ```js params: [ @@ -934,18 +1001,18 @@ params: [ ] ``` -**Rückgaben** +**Rückgabewerte** -`DATA`, 32 Byte – der Transaktions-Hash oder der Null-Hash, wenn die Transaktion noch nicht verfügbar ist. +`DATA`, 32 Bytes – der Transaktionshash oder der Null-Hash, wenn die Transaktion noch nicht verfügbar ist. -Verwenden Sie [eth_getTransactionReceipt](#eth_gettransactionreceipt), um die Contract-Adresse zu erhalten, nachdem die Transaktion in einem Block vorgeschlagen wurde, wenn Sie einen Contract erstellt haben. +Verwenden Sie [eth_getTransactionReceipt](#eth_gettransactionreceipt), um die Vertragsadresse zu erhalten, nachdem die Transaktion in einem Block vorgeschlagen wurde, als Sie einen Vertrag erstellt haben. **Beispiel** ```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}' -// Result +// Anfrage +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{siehe oben}],"id":1}' +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -967,18 +1034,18 @@ params: [ ] ``` -**Rückgaben** +**Rückgabewerte** -`DATA`, 32 Byte – der Transaktions-Hash oder der Null-Hash, wenn die Transaktion noch nicht verfügbar ist. +`DATA`, 32 Bytes – der Transaktionshash oder der Null-Hash, wenn die Transaktion noch nicht verfügbar ist. -Verwenden Sie [eth_getTransactionReceipt](#eth_gettransactionreceipt), um die Contract-Adresse zu erhalten, nachdem die Transaktion in einem Block vorgeschlagen wurde, wenn Sie einen Contract erstellt haben. +Verwenden Sie [eth_getTransactionReceipt](#eth_gettransactionreceipt), um die Vertragsadresse zu erhalten, nachdem die Transaktion in einem Block vorgeschlagen wurde, als Sie einen Vertrag erstellt haben. **Beispiel** ```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}' -// Result +// Anfrage +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{siehe oben}],"id":1}' +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -988,31 +1055,35 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params" ### eth_call {#eth_call} -Führt sofort einen neuen Nachrichtenaufruf aus, ohne eine Transaktion auf der Blockchain zu erstellen. Wird häufig für die Ausführung von Smart-Contract-Funktionen mit Leseberechtigung verwendet, zum Beispiel `balanceOf` für einen ERC-20-Contract. +Führt einen neuen Message Call sofort aus, ohne eine Transaktion auf der Blockchain zu erstellen. Wird oft für die Ausführung schreibgeschützter Smart-Contract-Funktionen verwendet, zum Beispiel `balanceOf` für einen ERC-20-Vertrag. + + + Endpunkt im Playground ausprobieren + **Parameter** -1. `Object` - Das Transaktionsaufrufobjekt +1. `Object` – Das Transaktionsaufruf-Objekt -- `from`: `DATA`, 20 Bytes - (Optional) Die Adresse, von der die Transaktion gesendet wird. +- `from`: `DATA`, 20 Bytes – (optional) Die Adresse, von der die Transaktion gesendet wird. - `to`: `DATA`, 20 Bytes – Die Adresse, an die die Transaktion gerichtet ist. -- `gas`: `QUANTITY` - (Optional) Ganzzahlwert des für die Transaktionsausführung bereitgestellten Gases. eth_call verbraucht kein Gas, aber dieser Parameter kann von einigen Ausführungen benötigt werden. -- `gasprice`: `QUANTITY` - (Optional) Ganzzahlwert des Gaspreises, der für jedes bezahlte Gas verwendet wird -- `value`: `QUANTITY` - (Optional) Ganzzahlwert des mit dieser Transaktion gesendeten Werts -- `input`: `DATA` – (optional) Hash der Methodensignatur und der codierten Parameter. Einzelheiten finden Sie unter [Ethereum-Contract-ABI in der Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/abi-spec.html). +- `gas`: `QUANTITY` – (optional) Ganzzahl des für die Transaktionsausführung bereitgestellten Gases. eth_call verbraucht kein Gas, aber dieser Parameter kann von einigen Ausführungen benötigt werden. +- `gasPrice`: `QUANTITY` – (optional) Ganzzahl des für jedes bezahlte Gas verwendeten Gaspreises. +- `value`: `QUANTITY` – (optional) Ganzzahl des mit dieser Transaktion gesendeten Werts. +- `input`: `DATA` – (optional) Hash der Methodensignatur und der kodierten Parameter. Details hierzu finden Sie unter [Ethereum Contract ABI in der Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/abi-spec.html). -2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block) +2. `QUANTITY|TAG` – ganzzahlige Blocknummer oder der String `"latest"`, `"earliest"`, `"pending"`, `"safe"` oder `"finalized"`, siehe den [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter) -**Rückgaben** +**Rückgabewerte** -`DATA` – der Rückgabewert des ausgeführten Vertrages. +`DATA` – der Rückgabewert des ausgeführten Vertrags. **Beispiel** ```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}' -// Result +// Anfrage +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{siehe oben}],"id":1}' +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1024,20 +1095,24 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}] Generiert und gibt eine Schätzung zurück, wie viel Gas erforderlich ist, damit die Transaktion abgeschlossen werden kann. Die Transaktion wird nicht zur Blockchain hinzugefügt. Beachten Sie, dass die Schätzung aus verschiedenen Gründen, einschließlich der EVM-Mechanik und der Leistung des Knotens, erheblich höher sein kann als die tatsächlich von der Transaktion verbrauchte Gas-Menge. + + Endpunkt im Playground ausprobieren + + **Parameter** -Siehe [eth_call](#eth_call)-Parameter – mit der Ausnahme, dass alle Eigenschaften optional sind. Wenn kein Gas-Limit angegeben ist, verwendet Geth das Block-Gas-Limit aus dem anstehenden Block als Obergrenze. Infolgedessen reicht die zurückgegebene Schätzung möglicherweise nicht aus, um die Abfrage/Transaktion auszuführen, wenn die Gas-Menge höher als das ausstehende Block-Gas-Limit ist. +Siehe [eth_call](#eth_call) Parameter, außer dass alle Eigenschaften optional sind. Wenn kein Gas-Limit angegeben ist, verwendet Geth das Block-Gas-Limit aus dem anstehenden Block als Obergrenze. Daher reicht die zurückgegebene Schätzung möglicherweise nicht aus, um den Aufruf/die Transaktion auszuführen, wenn die Gasmenge höher ist als das Gaslimit des ausstehenden Blocks. -**Rückgaben** +**Rückgabewerte** -`QUANTITY` – die verbrauchte Gas-Menge. +`QUANTITY` – die Menge des verbrauchten Gases. **Beispiel** ```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see above}],"id":1}' -// Result +// Anfrage +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{siehe oben}],"id":1}' +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1049,10 +1124,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see Gibt Informationen zu einem Block per Hash zurück. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `DATA`, 32 Bytes - Hash eines Blocks. -2. `Boolean` - Bei `true` werden die vollständigen Transaktionsobjekte zurückgegeben, bei `false` nur die Hashes der Transaktionen. +1. `DATA`, 32 Bytes – Hash eines Blocks. +2. `Boolean` – Wenn `true`, werden die vollständigen Transaktionsobjekte zurückgegeben, wenn `false`, nur die Hashes der Transaktionen. ```js params: [ @@ -1061,41 +1140,40 @@ params: [ ] ``` -**Rückgaben** +**Rückgabewerte** -`Object` – ein Blockobjekt oder `null`, wenn kein Block gefunden wurde: +`Object` – Ein Block-Objekt oder `null`, wenn kein Block gefunden wurde: -- `number`: `QUANTITY` - Die Blocknummer. `null`, wenn es ein ausstehender Block ist. -- `hash`: `DATA`, 32 Bytes - Hash des Blocks. `null`, wenn es ein ausstehender Block ist. -- `parentHash`: `DATA`, 32 Bytes - Hash des übergeordneten Blocks. -- `nonce`: `DATA`, 8 Bytes - Hash des generierten Proof-of-Work. `null`, wenn es ein ausstehender Block ist. -- `sha3Uncles`: `DATA`, 32 Bytes - SHA3 der Onkeldaten im Block. -- `logsBloom`: `DATA`, 256 Bytes - Der Bloom-Filter für die Protokolle des Blocks. `null`, wenn es ein ausstehender Block ist. -- `TransaktionsRoot`: `DATA`, 32 Bytes - Das Stammverzeichnis der Transaktions-Trie des Blocks. +- `number`: `QUANTITY` – die Blocknummer. `null`, wenn es ein ausstehender Block ist. +- `hash`: `DATA`, 32 Bytes – Hash des Blocks. `null`, wenn es ein ausstehender Block ist. +- `parentHash`: `DATA`, 32 Bytes – Hash des übergeordneten Blocks. +- `nonce`: `DATA`, 8 Bytes – Hash des generierten Proof-of-Work. `null`, wenn es ein ausstehender Block ist, `0x0` für Proof-of-Stake-Blöcke (seit The Merge) +- `sha3Uncles`: `DATA`, 32 Bytes – SHA3 der Uncle-Daten im Block. +- `logsBloom`: `DATA`, 256 Bytes – der Bloom-Filter für die Protokolle des Blocks. `null`, wenn es ein ausstehender Block ist. +- `transactionsRoot`: `DATA`, 32 Bytes – die Wurzel des Transaktions-Trie des Blocks. - `stateRoot`: `DATA`, 32 Bytes – Die Wurzel des endgültigen Zustands-Trie des Blocks. -- `receiptsRoot`: `DATA`, 32 Bytes - Die Wurzel des Quittungstries des Blocks. -- `miner`: `DATA`, 20 Byte – die Adresse des Begünstigten, dem die Mining-Belohnungen gegeben wurden. -- `difficulty`: `QUANTITY` - Ganzzahlwert der Schwierigkeit für diesen Block. -- `totalDifficulty`: `QUANTITY` - Ganzzahlwert der Gesamtschwierigkeit der Blockchain bis zu diesem Block. -- `extraData`: `DATA` - Das Feld „zusätzliche Daten“ dieses Blocks. -- `size`: `QUANTITY` - Ganzzahlwert der Größe dieses Blocks in Bytes. -- `gasLimit`: `QUANTITY` - Das maximal zulässige Gas in diesem Block. -- `gasUsed`: `QUANTITY` - Das insgesamt von allen Transaktionen in diesem Block verbrauchte Gas. -- `timestamp`: `QUANTITY` - Der Unix-Zeitstempel für den Zeitpunkt, zu dem der Block sortiert wurde. +- `receiptsRoot`: `DATA`, 32 Bytes – die Wurzel des Beleg-Trie des Blocks. +- `miner`: `DATA`, 20 Bytes – die Adresse des Begünstigten, der die Block-Belohnungen erhalten hat. +- `difficulty`: `QUANTITY` – Ganzzahl der für diesen Block erforderlichen Rechenleistung. +- `totalDifficulty`: `QUANTITY` – Ganzzahl der gesamten Rechenleistung der Kette bis zu diesem Block. +- `extraData`: `DATA` – das „extra data“-Feld dieses Blocks. +- `size`: `QUANTITY` – Ganzzahl der Größe dieses Blocks in Bytes. +- `gasLimit`: `QUANTITY` – das maximal zulässige Gas in diesem Block. +- `gasUsed`: `QUANTITY` – das insgesamt von allen Transaktionen in diesem Block verbrauchte Gas. +- `timestamp`: `QUANTITY` – der Unix-Zeitstempel, zu dem der Block zusammengestellt wurde. - `transactions`: `Array` – Array von Transaktionsobjekten oder 32-Byte-Transaktions-Hashes, abhängig vom zuletzt angegebenen Parameter. -- `uncles`: `Array` - Array von Onkel-Hashes. +- `uncles`: `Array` – Array von Uncle-Hashes. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}' -// Result -{ +// Ergebnis { -"jsonrpc": "2.0", -"id": 1, -"result": { + "jsonrpc": "2.0", + "id": 1, + "result": { "difficulty": "0x4ea3f27bc", "extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32", "gasLimit": "0x1388", @@ -1118,7 +1196,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0 "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncles": [ ] -} + } } ``` @@ -1126,10 +1204,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0 Gibt Informationen über eine Block-für-Block-Nummer zurück. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `QUANTITY|TAG` – Ganzzahl einer Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block). -2. `Boolean` - Bei `true` werden die vollständigen Transaktionsobjekte zurückgegeben, bei `false` nur die Hashes der Transaktionen. +1. `QUANTITY|TAG` – eine Ganzzahl einer Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter). +2. `Boolean` – Wenn `true`, werden die vollständigen Transaktionsobjekte zurückgegeben, wenn `false`, nur die Hashes der Transaktionen. ```js params: [ @@ -1138,12 +1220,13 @@ params: [ ] ``` -**Rückgaben** Siehe [eth_getBlockByHash](#eth_getblockbyhash) +**Rückgabewerte** +Siehe [eth_getBlockByHash](#eth_getblockbyhash) **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}' ``` @@ -1153,39 +1236,43 @@ Ergebnis siehe [eth_getBlockByHash](#eth_getblockbyhash) Gibt die Informationen über eine Transaktion zurück, die anhand des Transaktions-Hashs angefordert wurde. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `DATA`, 32 Bytes - Hash einer Transaktion +1. `DATA`, 32 Bytes – Hash einer Transaktion ```js params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"] ``` -**Rückgaben** +**Rückgabewerte** -`Object` – ein Transaktionsobjekt oder `null`, wenn keine Transaktion gefunden wurde: +`Object` – Ein Transaktionsobjekt oder `null`, wenn keine Transaktion gefunden wurde: -- `blockHash`: `DATA`, 32 Bytes - Hash des Blocks, in dem sich diese Transaktion befand. `null`, wenn es aussteht. -- `blockNumber`: `QUANTITY` - Blocknummer, in der sich diese Transaktion befand. `null`, wenn es aussteht. -- `from`: `DATA`, 20 Bytes - Adresse des Senders. -- `gas`: `QUANTITY` - Vom Sender bereitgestelltes Gas. -- `gasPrice`: `QUANTITY` - Vom Sender bereitgestellter Gaspreis in Wei. -- `hash`: `DATA`, 32 Bytes - Hash der Transaktion. -- `input`: `DATA` - Die mit der Transaktion gesendeten Daten. -- `nonce`: `QUANTITY` - Die Anzahl der von dem Sender vor dieser Transaktion durchgeführten Transaktionen. -- `to`: `DATA`, 20 Bytes - Adresse des Empfängers. `null` wenn es sich um eine Vertragserstellungstransaktion handelt. -- `transactionIndex`: `QUANTITY` - Ganzzahlwert der Transaktionsindexposition im Block. `null`, wenn es aussteht. -- `value`: `QUANTITY` - Der übertragene Wert in Wei. -- `v`: `QUANTITY` - ECDSA Wiederherstellungs-ID -- `r`: `QUANTITY` - ECDSA Signatur r -- `s`: `QUANTITY` - ECDSA Signatur s +- `blockHash`: `DATA`, 32 Bytes – Hash des Blocks, in dem sich diese Transaktion befand. `null`, wenn sie aussteht. +- `blockNumber`: `QUANTITY` – Blocknummer, in der sich diese Transaktion befand. `null`, wenn sie aussteht. +- `from`: `DATA`, 20 Bytes – Adresse des Absenders. +- `gas`: `QUANTITY` – vom Absender bereitgestelltes Gas. +- `gasPrice`: `QUANTITY` – vom Absender bereitgestellter Gaspreis in Wei. +- `hash`: `DATA`, 32 Bytes – Hash der Transaktion. +- `input`: `DATA` – die mit der Transaktion gesendeten Daten. +- `nonce`: `QUANTITY` – die Anzahl der Transaktionen, die vom Absender vor dieser getätigt wurden. +- `to`: `DATA`, 20 Bytes – Adresse des Empfängers. `null`, wenn es sich um eine Vertragserstellungstransaktion handelt. +- `transactionIndex`: `QUANTITY` – Ganzzahl der Indexposition der Transaktion im Block. `null`, wenn sie aussteht. +- `value`: `QUANTITY` – in Wei übertragener Wert. +- `v`: `QUANTITY` – ECDSA-Wiederherstellungs-ID +- `r`: `QUANTITY` – ECDSA-Signatur r +- `s`: `QUANTITY` – ECDSA-Signatur s **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"],"id":1}' -// Result +// Ergebnis { "jsonrpc":"2.0", "id":1, @@ -1212,10 +1299,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","param Gibt Informationen über eine Transaktion nach dem Block-Hash und der Transaktionsindexposition zurück. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `DATA`, 32 Bytes - Hash eines Blocks. -2. `QUANTITY` - Ganzzahlwert der Transaktionsindexposition. +1. `DATA`, 32 Bytes – Hash eines Blocks. +2. `QUANTITY` – Ganzzahl der Indexposition der Transaktion. ```js params: [ @@ -1224,7 +1315,8 @@ params: [ ] ``` -**Rückgaben** Siehe [eth_getTransactionByHash](#eth_gettransactionbyhash) +**Rückgabewerte** +Siehe [eth_getTransactionByHash](#eth_gettransactionbyhash) **Beispiel** @@ -1239,10 +1331,14 @@ Ergebnis siehe [eth_getTransactionByHash](#eth_gettransactionbyhash) Gibt Informationen über eine Transaktion nach der Blocknummer und der Transaktionsindexposition zurück. + + Endpunkt im Playground ausprobieren + + **Parameter** -1. `QUANTITY|TAG` – eine Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block). -2. `QUANTITY` - Die Transaktionsindexposition. +1. `QUANTITY|TAG` – eine Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter). +2. `QUANTITY` – die Indexposition der Transaktion. ```js params: [ @@ -1251,12 +1347,13 @@ params: [ ] ``` -**Rückgaben** Siehe [eth_getTransactionByHash](#eth_gettransactionbyhash) +**Rückgabewerte** +Siehe [eth_getTransactionByHash](#eth_gettransactionbyhash) **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}' ``` @@ -1270,39 +1367,40 @@ Gibt den Beleg einer Transaktion nach dem Transaktions-Hash zurück. **Parameter** -1. `DATA`, 32 Bytes - Hash einer Transaktion +1. `DATA`, 32 Bytes – Hash einer Transaktion ```js params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"] ``` -**Rückgaben** `Object` – ein Transaktionsbeleg-Objekt oder `null`, wenn kein Beleg gefunden wurde: +**Rückgabewerte** +`Object` – Ein Transaktionsbeleg-Objekt oder `null`, wenn kein Beleg gefunden wurde: -- `transactionHash`: `DATA`, 32 Bytes - Hash der Transaktion. -- `transactionIndex`: `QUANTITY` - Ganzzahlwert der Transaktionsindexposition im Block. -- `blockHash`: `DATA`, 32 Bytes - Hash des Blocks, in dem sich diese Transaktion befand. -- `blockNumber`: `QUANTITY` - Blocknummer, in der sich diese Transaktion befand. -- `from`: `DATA`, 20 Bytes - Adresse des Senders. -- `to`: `DATA`, 20 Bytes - Adresse des Empfängers. null, wenn es sich um eine Vertragserstellungstransaktion handelt. -- `cumulativeGasUsed` : `QUANTITY` - Die Gesamtmenge an Gas, die bei Ausführung dieser Transaktion im Block verwendet wurde. -- `effectiveGasPrice` : `QUANTITY` - Die Summe der Grundgebühr und der Tipp, die pro Einheit Gas bezahlt wurde. -- `gasUsed`: `QUANTITY` - Die Menge an Gas, die von dieser bestimmten Transaktion allein verwendet wurde. -- `contractAddress`: `DATA`, 20 Bytes - Die Vertragsadresse, die erstellt wurde, falls die Transaktion eine Vertragserstellung war, andernfalls `null`. -- `logs`: `Array` - Array von Log-Objekten, die diese Transaktion generiert hat. -- `logsBloom`: `DATA`, 256 Bytes - Bloom-Filter für leichte Clients, um schnell verwandte Logs abzurufen. -- `type`: `QUANTITY` - Ganzzahlwert des Transaktionstyps, `0x0` für veraltete Transaktionen, `0x1` für Zugriffslistentypen, `0x2` für dynamische Gebühren. +- `transactionHash `: `DATA`, 32 Bytes – Hash der Transaktion. +- `transactionIndex`: `QUANTITY` – Ganzzahl der Indexposition der Transaktion im Block. +- `blockHash`: `DATA`, 32 Bytes – Hash des Blocks, in dem sich diese Transaktion befand. +- `blockNumber`: `QUANTITY` – Blocknummer, in der sich diese Transaktion befand. +- `from`: `DATA`, 20 Bytes – Adresse des Absenders. +- `to`: `DATA`, 20 Bytes – Adresse des Empfängers. null, wenn es sich um eine Vertragserstellungstransaktion handelt. +- `cumulativeGasUsed` : `QUANTITY ` – die Gesamtmenge an Gas, die bei der Ausführung dieser Transaktion im Block verbraucht wurde. +- `effectiveGasPrice` : `QUANTITY` – die Summe aus der Grundgebühr und dem pro Gaseinheit gezahlten Trinkgeld. +- `gasUsed `: `QUANTITY ` – die Menge an Gas, die allein durch diese spezifische Transaktion verbraucht wurde. +- `contractAddress `: `DATA`, 20 Bytes – die erstellte Vertragsadresse, wenn es sich bei der Transaktion um eine Vertragserstellung handelte, andernfalls `null`. +- `logs`: `Array` – Array von Log-Objekten, die diese Transaktion generiert hat. +- `logsBloom`: `DATA`, 256 Bytes – Bloom-Filter für Light Clients, um zugehörige Protokolle schnell abzurufen. +- `type`: `QUANTITY` – Ganzzahl des Transaktionstyps, `0x0` für Legacy-Transaktionen, `0x1` für Zugriffstlistentypen, `0x2` für dynamische Gebühren. -Es gibt auch _eines davon_ zurück: +Es gibt auch eines davon zurück: -- `root` : `DATA` 32 Bytes des vorherigen Transaktions-Stateroots (vor Byzantium) -- `status`: `QUANTITY` entweder `1` (Erfolg) or `0` (Fehler) +- `root` : `DATA` 32 Bytes des Post-Transaktions-Zustands-Roots (vor Byzanz) +- `status`: `QUANTITY` entweder `1` (erfolgreich) oder `0` (fehlgeschlagen) **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"],"id":1}' -// Result +// Ergebnis { "jsonrpc": "2.0", "id": 1, @@ -1310,15 +1408,15 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","para "blockHash": "0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3", "blockNumber": "0xeff35f", - "contractAddress": null, // string of the address if it was created + "contractAddress": null, // string der Adresse, wenn sie erstellt wurde "cumulativeGasUsed": "0xa12515", "effectiveGasPrice": "0x5a9c688d4", "from": "0x6221a9c005f6e47eb398fd867784cacfdcfff4e7", "gasUsed": "0xb4c8", "logs": [{ - // logs as returned by getFilterLogs, etc. + // logs wie sie von getFilterLogs usw. zurückgegeben werden. }], - "logsBloom": "0x00...0", // 256 byte bloom filter + "logsBloom": "0x00...0", // 256-Byte-Bloom-Filter "status": "0x1", "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "transactionHash": @@ -1331,12 +1429,16 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","para ### eth_getUncleByBlockHashAndIndex {#eth_getunclebyblockhashandindex} -Gibt Informationen über einen Onkel eines Blocks nach Hash und Onkel-Indexposition zurück. +Gibt Informationen über einen Uncle eines Blocks nach Hash und Uncle-Indexposition zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** -1. `DATA`, 32 Bytes - Der Hash eines Blocks. -2. `QUANTITY` - Die Indexposition des Onkels. +1. `DATA`, 32 Bytes – Der Hash eines Blocks. +2. `QUANTITY` – die Indexposition des Uncle. ```js params: [ @@ -1345,7 +1447,8 @@ params: [ ] ``` -**Rückgaben** Siehe [eth_getBlockByHash](#eth_getblockbyhash) +**Rückgabewerte** +Siehe [eth_getBlockByHash](#eth_getblockbyhash) **Beispiel** @@ -1356,16 +1459,20 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex" Ergebnis siehe [eth_getBlockByHash](#eth_getblockbyhash) -**Hinweis**: Ein Onkel enthält keine einzelnen Transaktionen. +**Hinweis**: Ein Uncle enthält keine einzelnen Transaktionen. ### eth_getUncleByBlockNumberAndIndex {#eth_getunclebyblocknumberandindex} -Gibt Informationen über einen Onkel eines Blocks nach Nummer und Onkel-Indexposition zurück. +Gibt Informationen über einen Uncle eines Blocks nach Nummer und Uncle-Indexposition zurück. + + + Endpunkt im Playground ausprobieren + **Parameter** -1. `QUANTITY|TAG` – eine Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"`, `"finalized"`, wie im [Standardblockparameter](/developers/docs/apis/json-rpc/#default-block). -2. `QUANTITY` - Die Indexposition des Onkels. +1. `QUANTITY|TAG` – eine Blocknummer oder der String `"earliest"`, `"latest"`, `"pending"`, `"safe"` oder `"finalized"`, wie im [Block-Parameter](/developers/docs/apis/json-rpc/#block-parameter). +2. `QUANTITY` – die Indexposition des Uncle. ```js params: [ @@ -1374,14 +1481,15 @@ params: [ ] ``` -**Rückgaben** Siehe [eth_getBlockByHash](#eth_getblockbyhash) +**Rückgabewerte** +Siehe [eth_getBlockByHash](#eth_getblockbyhash) -**Hinweis**: Ein Onkel enthält keine einzelnen Transaktionen. +**Hinweis**: Ein Uncle enthält keine einzelnen Transaktionen. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}' ``` @@ -1389,23 +1497,25 @@ Ergebnis siehe [eth_getBlockByHash](#eth_getblockbyhash) ### eth_newFilter {#eth_newfilter} -Erstellt auf Basis von Filteroptionen ein Filterobjekt, um eine Benachrichtigung auszugeben, wenn sich der Status ändert (Protokolle). Um zu überprüfen, ob sich der Status geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. +Erstellt auf Basis von Filteroptionen ein Filterobjekt, um eine Benachrichtigung auszugeben, wenn sich der Status ändert (Protokolle). +Um zu prüfen, ob sich der Zustand geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. -**Hinweis zum Festlegen von Themenfiltern:** Themen sind auftragsabhängig. Eine Transaktion mit einem Protokoll mit den Themen [A, B] wird mit den folgenden Themenfiltern abgeglichen: +**Ein Hinweis zur Angabe von Themenfiltern:** +Themen sind reihenfolgeabhängig. Eine Transaktion mit einem Protokoll mit den Themen [A, B] wird mit den folgenden Themenfiltern abgeglichen: - `[]` „alles“ -- `[A]` „A an erster Stelle (und alles danach)“ -- `[null, B]` „Alles an erster Stelle UND B an zweiter Stelle (und alles danach)“ -- `[A, B]` „A an erster Stelle UND B an zweiter Stelle (und alles danach)“ -- `[[A, B], [A, B]]` „(A ODER B) an erster Stelle UND (A ODER B) an zweiter Stelle (und alles danach)“ +- `[A]` „A an erster Position (und alles danach)“ +- `[null, B]` „alles an erster Position UND B an zweiter Position (und alles danach)“ +- `[A, B]` „A an erster Position UND B an zweiter Position (und alles danach)“ +- `[[A, B], [A, B]]` „(A ODER B) an erster Position UND (A ODER B) an zweiter Position (und alles danach)“ - **Parameter** -1. `Object` – die Filteroptionen: +1. `Object` – Die Filteroptionen: -- `fromBlock`: `QUANTITY|TAG` – (optional, standardmäßig: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten abgeschlossenen Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. -- `toBlock`: `QUANTITY|TAG` – (optional, standardmäßig: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten abgeschlossenen Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. -- `Adresse`: `DATA|Array`, 20 Bytes - (Optional) Vertragsadresse oder eine Liste von Adressen, von denen Protokolle stammen sollen. -- `topics`: `Array of DATA`, - (Optional) Array von 32 Bytes `DATA`-Themen. Themen sind auftragsabhängig. Jedes Thema kann auch ein Array von DATEN mit „oder“-Optionen sein. +- `fromBlock`: `QUANTITY|TAG` – (optional, Standard: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten finalisierten Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. +- `toBlock`: `QUANTITY|TAG` – (optional, Standard: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten finalisierten Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. +- `address`: `DATA|Array`, 20 Bytes – (optional) Vertragsadresse oder eine Liste von Adressen, von denen Protokolle stammen sollen. +- `topics`: `Array von DATA`, – (optional) Array von 32 Bytes `DATA` Themen. Themen sind auftragsabhängig. Jedes Thema kann auch ein Array von DATEN mit „oder“-Optionen sein. ```js params: [ @@ -1425,14 +1535,15 @@ params: [ ] ``` -**Rückgaben** `QUANTITY` – eine Filter-ID. +**Rückgabewerte** +`QUANTITY` – eine Filter-ID. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1442,18 +1553,21 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topic ### eth_newBlockFilter {#eth_newblockfilter} -Erstellt einen Filter im Knoten, um eine Benachrichtigung auszugeben, wenn ein neuer Block eintrifft. Um zu überprüfen, ob sich der Status geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. +Erstellt einen Filter im Knoten, um eine Benachrichtigung auszugeben, wenn ein neuer Block eintrifft. +Um zu prüfen, ob sich der Zustand geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. -**Parameter** Keine +**Parameter** +Keine -**Rückgaben** `QUANTITY` – eine Filter-ID. +**Rückgabewerte** +`QUANTITY` – eine Filter-ID. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1463,18 +1577,21 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[], ### eth_newPendingTransactionFilter {#eth_newpendingtransactionfilter} -Erstellt einen Filter im Knoten, um eine Benachrichtigung auszugeben, wenn eine neue ausstehende Transaktionen eintrifft. Um zu überprüfen, ob sich der Status geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. +Erstellt einen Filter im Knoten, um eine Benachrichtigung auszugeben, wenn eine neue ausstehende Transaktionen eintrifft. +Um zu prüfen, ob sich der Zustand geändert hat, rufen Sie [eth_getFilterChanges](#eth_getfilterchanges) auf. -**Parameter** Keine +**Parameter** +Keine -**Rückgaben** `QUANTITY` – eine Filter-ID. +**Rückgabewerte** +`QUANTITY` – eine Filter-ID. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":73}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1484,11 +1601,12 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter" ### eth_uninstallFilter {#eth_uninstallfilter} -Deinstalliert einen Filter mit angegebener ID. Sollte immer aufgerufen werden, wenn die Uhr nicht mehr benötigt wird. Zusätzlich Timeout für Filter, wenn sie für einen bestimmten Zeitraum nicht mit [eth_getFilterChanges](#eth_getfilterchanges) angefordert werden. +Deinstalliert einen Filter mit angegebener ID. Sollte immer aufgerufen werden, wenn die Uhr nicht mehr benötigt wird. +Zusätzlich kommt es bei Filtern zu einem Timeout, wenn sie für einen bestimmten Zeitraum nicht mit [eth_getFilterChanges](#eth_getfilterchanges) angefordert werden. **Parameter** -1. `QUANTITY` – die Filter-ID. +1. `QUANTITY` – Die Filter-ID. ```js params: [ @@ -1496,14 +1614,15 @@ params: [ ] ``` -**Rückgabewerte** `Boolean` – `true`, wenn der Filter erfolgreich deinstalliert wurde, andernfalls `false`. +**Rückgabewerte** +`Boolean` – `true`, wenn der Filter erfolgreich deinstalliert wurde, andernfalls `false`. **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}' -// Result +// Ergebnis { "id":1, "jsonrpc": "2.0", @@ -1525,26 +1644,30 @@ params: [ ] ``` -**Rückgabewerte** `Array` – Array von Protokollobjekten oder ein leeres Array, wenn sich seit der letzten Umfrage nichts geändert hat. +**Rückgabewerte** +`Array` – Array von Protokollobjekten oder ein leeres Array, wenn sich seit der letzten Abfrage nichts geändert hat. + +- Für mit `eth_newBlockFilter` erstellte Filter sind die Rückgabewerte Block-Hashes (`DATA`, 32 Bytes), z. B. `["0x3454645634534..."]`. + +- Für mit `eth_newPendingTransactionFilter` erstellte Filter sind die Rückgabewerte Transaktions-Hashes (`DATA`, 32 Bytes), z. B. `["0x6345343454645..."]`. -- Für mit `eth_newBlockFilter` erstellte Filter sind die Rückgabewerte Block-Hashes (`DATA`, 32 Bytes), z. `["0x3454645634534..."]`. -- Für Filter, die mit `eth_newPendingTransactionFilter` erstellt wurden, sind die Rückgabewerte Transaktions-Hashes (`DATA`, 32 Bytes), z. `["0x6345343454645..."]`. - Für mit `eth_newFilter` erstellte Filter sind Protokolle Objekte mit folgenden Parametern: - - `removed`: `TAG` - `true`, als das Protokoll aufgrund einer Neustrukturierung der Blockchain entfernt wurde. `false`, wenn es sich um ein gültiges Protokoll handelt. - - `logIndex`: `QUANTITY` – Ganzzahlwert der Protokollindexposition im Block. `null`, wenn es sich um ein ausstehendes Protokoll handelt. - - `transactionIndex`: `QUANTITY` - Ganzzahlwert der Transaktionsindexposition, aus der das Protokoll erstellt wurde. `null`, wenn es sich um ein ausstehendes Protokoll handelt. - - `transactionHash`: `DATA`, 32 Bytes - Hash der Transaktionen, aus denen dieses Protokoll erstellt wurde. `null`, wenn es sich um ein ausstehendes Protokoll handelt. - - `blockHash`: `DATA`, 32 Bytes - Hash des Blocks, in dem sich dieses Protokoll befand. `null`, wenn es aussteht. `null`, wenn es sich um ein ausstehendes Protokoll handelt. - - `blockNumber`: `QUANTITY` - Die Blocknummer, in der sich dieses Protokoll befand. `null`, wenn es aussteht. `null`, wenn es sich um ein ausstehendes Protokoll handelt. - - `Adresse`: `DATA`, 20 Bytes - Adresse, von der dieses Protokoll stammt. - - `data`: `DATA` – enthält null oder mehr 32 Byte nicht indizierte Argumente des Protokolls. - - `topics`: `Array of DATA` - Array von 0 bis 4 32 Bytes `DATA` von indizierten Protokollargumenten. (In _Solidity_: Das erste Thema ist der _Hash_ der Signatur des Ereignisses (z. B. `Deposit (address,bytes32,uint256)`), es sei denn, Sie haben das Ereignis mit dem `anonymous`-Spezifizierer deklariert.) + - `removed`: `TAG` – `true`, wenn das Protokoll aufgrund einer Reorganisation der Kette entfernt wurde. `false`, wenn es sich um ein gültiges Protokoll handelt. + - `logIndex`: `QUANTITY` – Ganzzahl der Protokollindexposition im Block. `null`, wenn es sich um ein ausstehendes Protokoll handelt. + - `transactionIndex`: `QUANTITY` – Ganzzahl der Indexposition der Transaktion, aus der das Protokoll erstellt wurde. `null`, wenn es sich um ein ausstehendes Protokoll handelt. + - `transactionHash`: `DATA`, 32 Bytes – Hash der Transaktionen, aus denen dieses Protokoll erstellt wurde. `null`, wenn es sich um ein ausstehendes Protokoll handelt. + - `blockHash`: `DATA`, 32 Bytes – Hash des Blocks, in dem sich dieses Protokoll befand. `null`, wenn sie aussteht. `null`, wenn es sich um ein ausstehendes Protokoll handelt. + - `blockNumber`: `QUANTITY` – die Blocknummer, in der sich dieses Protokoll befand. `null`, wenn sie aussteht. `null`, wenn es sich um ein ausstehendes Protokoll handelt. + - `address`: `DATA`, 20 Bytes – Adresse, von der dieses Protokoll stammt. + - `data`: `DATA` – nicht indizierte Protokolldaten mit variabler Länge. (In _Solidity_: null oder mehr nicht indizierte 32-Byte-Protokollargumente.) + - `topics`: `Array von DATA` – Array von 0 bis 4 32 Bytes `DATA` von indizierten Protokollargumenten. (In _Solidity_: Das erste Thema ist der _Hash_ der Signatur des Ereignisses (z. B. `Deposit(address,bytes32,uint256)`), es sei denn, Sie haben das Ereignis mit dem `anonymous`-Spezifizierer deklariert.) + - **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}' -// Result +// Ergebnis { "id":1, "jsonrpc":"2.0", @@ -1569,7 +1692,7 @@ Gibt ein Array aller Protokolle zurück, die dem Filter mit der angegebenen ID e **Parameter** -1. `QUANTITY` – die Filter-ID. +1. `QUANTITY` – Die Filter-ID. ```js params: [ @@ -1577,12 +1700,13 @@ params: [ ] ``` -**Rückgabewerte** Siehe [eth_getFilterChanges](#eth_getfilterchanges) +**Rückgabewerte** +Siehe [eth_getFilterChanges](#eth_getfilterchanges) **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}' ``` @@ -1594,13 +1718,13 @@ Gibt ein Array aller Protokolle zurück, die einem angegebenen Filterobjekt ents **Parameter** -1. `Object` – die Filteroptionen: +1. `Object` – Die Filteroptionen: -- `fromBlock`: `QUANTITY|TAG` – (optional, standardmäßig: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten abgeschlossenen Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. -- `toBlock`: `QUANTITY|TAG` – (optional, standardmäßig: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten abgeschlossenen Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. -- `Adresse`: `DATA|Array`, 20 Bytes - (Optional) Vertragsadresse oder eine Liste von Adressen, von denen Protokolle stammen sollen. -- `topics`: `Array of DATA`, - (Optional) Array von 32 Bytes `DATA`-Themen. Themen sind auftragsabhängig. Jedes Thema kann auch ein Array von DATEN mit „oder“-Optionen sein. -- `blockhash`: `DATA`, 32 Bytes - (optional, **future**) Mit dem Hinzufügen von EIP-234 wird `blockHash` eine neue Filteroption sein, die die zurückgegebenen Protokolle auf den einzelnen Block mit dem 32-Byte-Hash `blockHash` beschränkt. Die Verwendung von `blockHash` entspricht `fromBlock` = `toBlock` = die Blocknummer mit Hash `blockHash`. Wenn `blockHash` in den Filterkriterien vorhanden ist, sind weder `fromBlock` noch `toBlock` zulässig. +- `fromBlock`: `QUANTITY|TAG` – (optional, Standard: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten finalisierten Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. +- `toBlock`: `QUANTITY|TAG` – (optional, Standard: `"latest"`) ganzzahlige Blocknummer oder `"latest"` für den letzten vorgeschlagenen Block, `"safe"` für den letzten sicheren Block, `"finalized"` für den letzten finalisierten Block oder `"pending"`, `"earliest"` für Transaktionen, die noch nicht in einem Block sind. +- `address`: `DATA|Array`, 20 Bytes – (optional) Vertragsadresse oder eine Liste von Adressen, von denen Protokolle stammen sollen. +- `topics`: `Array von DATA`, – (optional) Array von 32 Bytes `DATA` Themen. Themen sind auftragsabhängig. Jedes Thema kann auch ein Array von DATEN mit „oder“-Optionen sein. +- `blockHash`: `DATA`, 32 Bytes – (optional, **zukünftig**) Mit der Hinzufügung von EIP-234 wird `blockHash` eine neue Filteroption sein, die die zurückgegebenen Protokolle auf den einzelnen Block mit dem 32-Byte-Hash `blockHash` beschränkt. Die Verwendung von `blockHash` ist äquivalent zu `fromBlock` = `toBlock` = der Blocknummer mit dem Hash `blockHash`. Wenn `blockHash` in den Filterkriterien vorhanden ist, sind weder `fromBlock` noch `toBlock` erlaubt. ```js params: [ @@ -1612,12 +1736,13 @@ params: [ ] ``` -**Rückgabewerte** Siehe [eth_getFilterChanges](#eth_getfilterchanges) +**Rückgabewerte** +Siehe [eth_getFilterChanges](#eth_getfilterchanges) **Beispiel** ```js -// Request +// Anfrage curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}' ``` @@ -1625,11 +1750,11 @@ Ergebnis siehe [eth_getFilterChanges](#eth_getfilterchanges) ## Anwendungsbeispiel {#usage-example} -### Einen Contract mit JSON_RPC bereitstellen {#deploying-contract} +### Bereitstellen eines Vertrags mittels JSON-RPC {#deploying-contract} -Dieser Abschnitt enthält eine Demonstration, wie ein Contract nur mithilfe der RPC-Schnittstelle bereitgestellt wird. Es gibt alternative Wege zur Bereitstellung von Contracts, bei denen diese Komplexität abstrahiert wird – zum Beispiel die Verwendung von Bibliotheken, die auf der RPC-Schnittstelle wie [web3.js](https://web3js.readthedocs.io/) und [web3.py](https://github.com/ethereum/web3.py) aufbauen. Diese Abstraktionen sind im Allgemeinen leichter zu verstehen und weniger fehleranfällig, es ist dennoch hilfreich, zu verstehen, was im Hintergrund passiert. +Dieser Abschnitt enthält eine Demonstration, wie ein Contract nur mithilfe der RPC-Schnittstelle bereitgestellt wird. Es gibt alternative Wege zur Bereitstellung von Verträgen, bei denen diese Komplexität abstrahiert wird – zum Beispiel die Verwendung von Bibliotheken, die auf der RPC-Schnittstelle aufbauen, wie [web3.js](https://web3js.readthedocs.io/) und [web3.py](https://github.com/ethereum/web3.py). Diese Abstraktionen sind im Allgemeinen leichter zu verstehen und weniger fehleranfällig, es ist dennoch hilfreich, zu verstehen, was im Hintergrund passiert. -Das Folgende ist ein unkomplizierter Smart Contract namens `Multiply7`, der über die JSON-RPC-Schnittstelle auf einem Ethereum-Knoten bereitgestellt wird. Dieses Tutorial geht davon aus, dass der Reader bereits einen Geth-Knoten ausführt. Weitere Informationen zu Nodes und Clients finden Sie [hier](/developers/docs/nodes-and-clients/run-a-node). Bitte sehen Sie in der jeweiligen [Client](/developers/docs/nodes-and-clients/)-Dokumentation nach, wie Sie den HTTP-JSON-RPC für Nicht-Geth-Clients starten. Die meisten Clients werden standardmäßig auf `localhost:8545` ausgeführt. +Das Folgende ist ein unkomplizierter Smart Contract namens `Multiply7`, der über die JSON-RPC-Schnittstelle auf einem Ethereum-Knoten bereitgestellt wird. Dieses Tutorial geht davon aus, dass der Reader bereits einen Geth-Knoten ausführt. Weitere Informationen zu Nodes und Clients finden Sie [hier](/developers/docs/nodes-and-clients/run-a-node). Bitte sehen Sie in der jeweiligen [Client](/developers/docs/nodes-and-clients/)-Dokumentation nach, wie Sie den HTTP-JSON-RPC für Nicht-Geth-Clients starten. Die meisten Clients werden standardmäßig auf `localhost:8545` bereitgestellt. ```javascript contract Multiply7 { @@ -1649,10 +1774,10 @@ geth --http --dev console 2>>geth.log Dadurch wird die HTTP-RPC-Schnittstelle auf `http://localhost:8545` gestartet. -Wir können überprüfen, ob die Schnittstelle läuft, indem wir die Coinbase-Adresse und den Saldo mit [curl](https://curl.se) abrufen. Bitte beachten Sie, dass sich die Daten in diesen Beispielen auf Ihrem lokalen Knoten unterscheiden. Wenn Sie diese Befehle ausprobieren möchten, ersetzen Sie die Anfrageparameter in der zweiten Curl-Anfrage durch das Ergebnis, das von der ersten zurückgegeben wird. +Wir können überprüfen, ob die Schnittstelle läuft, indem wir die Coinbase-Adresse (die erste Adresse aus dem Array der Konten) und das Guthaben mithilfe von [curl](https://curl.se) abrufen. Bitte beachten Sie, dass sich die Daten in diesen Beispielen auf Ihrem lokalen Knoten unterscheiden. Wenn Sie diese Befehle ausprobieren möchten, ersetzen Sie die Anfrageparameter in der zweiten Curl-Anfrage durch das Ergebnis, das von der ersten zurückgegeben wird. ```bash -curl --data '{"jsonrpc":"2.0","method":"eth_coinbase", "id":1}' -H "Content-Type: application/json" localhost:8545 +curl --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[], "id":1}' -H "Content-Type: application/json" localhost:8545 {"id":1,"jsonrpc":"2.0","result":["0x9b1d35635cc34752ca54713bb99d38614f63c955"]} curl --data '{"jsonrpc":"2.0","method":"eth_getBalance", "params": ["0x9b1d35635cc34752ca54713bb99d38614f63c955", "latest"], "id":2}' -H "Content-Type: application/json" localhost:8545 @@ -1666,15 +1791,15 @@ web3.fromWei("0x1639e49bba16280000", "ether") // "410" ``` -Jetzt, da es etwas Ether in unserer privaten Entwicklungs-Kette gibt, können wir den Contract bereitstellen. Der erste Schritt besteht darin, den Multiply7-Contract in Bytecode zu kompilieren, der an die EVM gesendet werden kann. Um Solc, den Solidity-Compiler, zu installieren, folgen Sie der [Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/installing-solidity.html). (Möglicherweise möchten Sie eine ältere `solc`-Version verwenden, um der [Version des verwendeten Compilers für unser Beispiel zu entsprechen](https://github.com/ethereum/solidity/releases/tag/v0.4.20).) +Jetzt, da es etwas Ether in unserer privaten Entwicklungs-Kette gibt, können wir den Contract bereitstellen. Der erste Schritt besteht darin, den Multiply7-Contract in Bytecode zu kompilieren, der an die EVM gesendet werden kann. Um solc, den Solidity-Compiler, zu installieren, folgen Sie der [Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/installing-solidity.html). (Möglicherweise möchten Sie eine ältere `solc`-Version verwenden, um der [Version des für unser Beispiel verwendeten Compilers](https://github.com/ethereum/solidity/releases/tag/v0.4.20) zu entsprechen.) -Der nächste Schritt besteht darin, den Multiply7-Contract in Bytecode zu kompilieren, der an die EVM gesendet werden kann. +Der nächste Schritt besteht darin, den Multiply7-Vertrag in Bytecode zu kompilieren, der an die EVM gesendet werden kann. ```bash echo 'pragma solidity ^0.4.16; contract Multiply7 { event Print(uint); function multiply(uint input) public returns (uint) { Print(input * 7); return input * 7; } }' | solc --bin ======= :Multiply7 ======= -Binary: +Binär: 6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029 ``` @@ -1699,13 +1824,13 @@ curl --data '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": [ {"jsonrpc":"2.0","id":7,"result":{"blockHash":"0x77b1a4f6872b9066312de3744f60020cbd8102af68b1f6512a05b7619d527a4f","blockNumber":"0x1","contractAddress":"0x4d03d617d700cf81935d7f797f4e2ae719648262","cumulativeGasUsed":"0x1c31e","from":"0x9b1d35635cc34752ca54713bb99d38614f63c955","gasUsed":"0x1c31e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":null,"transactionHash":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf","transactionIndex":"0x0"}} ``` -Unser Contract wurde am `0x4d03d617d700cf81935d7f797f4e2ae719648262` erstellt. Ein Nullergebnis anstelle eines Belegs bedeutet, dass die Transaktion noch nicht in einen Block aufgenommen wurde. Warten Sie einen Moment, prüfen Sie, ob Ihr Konsens-Client ausgeführt wird, und versuchen Sie es erneut. +Unser Vertrag wurde auf `0x4d03d617d700cf81935d7f797f4e2ae719648262` erstellt. Ein Nullergebnis anstelle eines Belegs bedeutet, dass die Transaktion noch nicht in einen Block aufgenommen wurde. Warten Sie einen Moment, prüfen Sie, ob Ihr Konsens-Client ausgeführt wird, und versuchen Sie es erneut. #### Interaktion mit Smart Contracts {#interacting-with-smart-contract} -In diesem Beispiel senden wir eine Transaktion mit `eth_sendTransaction` an die Methode `multiply` des Contracts. +In diesem Beispiel werden wir eine Transaktion mit `eth_sendTransaction` an die `multiply`-Methode des Vertrags senden. -`eth_sendTransaction` erfordert mehrere Argumente, speziell `from`, `to` und `data`. `From` ist die öffentliche Adresse unseres Kontos und `to` ist die Contract-Adresse. Das Argument `data` enthält eine Nutzlast, die definiert, welche Methode mit welchen Argumenten aufgerufen werden muss. An dieser Stelle kommt die [ABI (Application Binary Interface – binäre Anwendungsschnittstelle)](https://docs.soliditylang.org/en/latest/abi-spec.html) ins Spiel. Die ABI ist eine JSON-Datei, die festlegt, wie Daten für die EVM definiert und kodiert werden. +`eth_sendTransaction` erfordert mehrere Argumente, insbesondere `from`, `to` und `data`. `From` ist die öffentliche Adresse unseres Kontos und `to` ist die Vertragsadresse. Das Argument `data` enthält eine Nutzlast, die definiert, welche Methode mit welchen Argumenten aufgerufen werden muss. Hier kommt das [ABI (Application Binary Interface)](https://docs.soliditylang.org/en/latest/abi-spec.html) ins Spiel. Die ABI ist eine JSON-Datei, die festlegt, wie Daten für die EVM definiert und kodiert werden. Die Byte der Nutzlast definieren, welche Methode im Contract aufgerufen wird. Das sind die ersten 4 Byte aus dem Keccak-Hash über den Funktionsnamen und seine Argumenttypen, Hex-codiert. Die Multiplizieren-Funktion akzeptiert ein uint, welches ein Alias für uint256 ist. Damit bleibt uns: @@ -1714,13 +1839,13 @@ web3.sha3("multiply(uint256)").substring(0, 10) // "0xc6888fa1" ``` -Der nächste Schritt besteht darin, die Argumente zu codieren. Es gibt nur einen uint256, beispielsweise den Wert 6. Die ABI hat einen Abschnitt, der angibt, wie uint256-Typen codiert werden. +Der nächste Schritt besteht darin, die Argumente zu kodieren. Es gibt nur einen uint256, beispielsweise den Wert 6. Die ABI hat einen Abschnitt, der angibt, wie uint256-Typen codiert werden. -`int: enc(X)` ist die Big-Endian-Zweierkomplementcodierung von X, aufgefüllt auf der Seite höherer Ordnung (links) mit 0xff für negatives X und mit null > Byte für positives X, sodass die Länge ein Vielfaches von 32 Byte ist. +`int: enc(X)` ist die Big-Endian-Zweierkomplement-Kodierung von X, die auf der höherwertigen (linken) Seite mit 0xff für negatives X und mit Null-Bytes für positives X aufgefüllt wird, so dass die Länge ein Vielfaches von 32 Bytes ist. -Dies wird zu `0000000000000000000000000000000000000000000000000000000000006` codiert. +Dies kodiert zu `0000000000000000000000000000000000000000000000000000000000000006`. -Durch die Kombination des Funktionsselektors und des codierten Arguments werden unsere Daten zu `0xc6888fa10000000000000000000000000000000000000000000000000000000000006`. +Durch die Kombination des Funktionsselektors und des kodierten Arguments lauten unsere Daten `0xc6888fa10000000000000000000000000000000000000000000000000000000000000006`. Dies kann nun an den Knoten gesendet werden: @@ -1753,7 +1878,7 @@ Da eine Transaktion gesendet wurde, wurde ein Transaktions-Hash zurückgegeben. } ``` -Der Beleg enthält ein Protokoll. Dieses Protokoll wurde von der EVM bei der Transaktionsausführung generiert und in den Beleg aufgenommen. Die Funktion `multiply` zeigt, dass das Ereignis `Print` mit der Eingabe mal 7 ausgelöst wurde. Da das Argument für das Ereignis `Print` ein uint256 war, können wir es gemäß den ABI-Regeln dekodieren, was zu der erwarteten Dezimalzahl 42 führt. Abgesehen von den Daten ist es erwähnenswert, dass Themen verwendet werden können, um festzustellen, welches Ereignis das Protokoll erstellt hat: +Der Beleg enthält ein Protokoll. Dieses Protokoll wurde von der EVM bei der Transaktionsausführung generiert und in den Beleg aufgenommen. Die `multiply`-Funktion zeigt, dass das `Print`-Ereignis mit der Eingabe mal 7 ausgelöst wurde. Da das Argument für das `Print`-Ereignis ein uint256 war, können wir es gemäß den ABI-Regeln dekodieren, was zu der erwarteten Dezimalzahl 42 führt. Abgesehen von den Daten ist es erwähnenswert, dass Themen verwendet werden können, um festzustellen, welches Ereignis das Protokoll erstellt hat: ```javascript web3.sha3("Print(uint256)") @@ -1765,7 +1890,7 @@ Das war nur eine kurze Einführung in einige der häufigsten Aufgaben, die die d ## Verwandte Themen {#related-topics} - [JSON-RPC-Spezifikation](http://www.jsonrpc.org/specification) -- [Knotenpunkte und Clients](/developers/docs/nodes-and-clients/) +- [Nodes und Clients](/developers/docs/nodes-and-clients/) - [JavaScript-APIs](/developers/docs/apis/javascript/) - [Backend-APIs](/developers/docs/apis/backend/) -- [Ausführende Clients](/developers/docs/nodes-and-clients/#execution-clients) +- [Ausführungs-Clients](/developers/docs/nodes-and-clients/#execution-clients) diff --git a/public/content/translations/de/developers/docs/blocks/index.md b/public/content/translations/de/developers/docs/blocks/index.md index 8729bdf88cc..e43277f95ce 100644 --- a/public/content/translations/de/developers/docs/blocks/index.md +++ b/public/content/translations/de/developers/docs/blocks/index.md @@ -8,13 +8,14 @@ Blöcke sind Stapel von Transaktionen mit einem Hash des vorherigen Blocks in de ## Voraussetzungen {#prerequisites} -Blöcke sind ein sehr anfängerfreundliches Thema. Um dir jedoch zu helfen, diese Seite besser zu verstehen, empfehlen wir, zuerst [ Konten](/developers/docs/accounts/), [Transaktionen](/developers/docs/transactions/) und unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. +Blöcke sind ein sehr anfängerfreundliches Thema. Um diese Seite besser zu verstehen, empfehlen wir Ihnen jedoch, zuerst [Konten](/developers/docs/accounts/), [Transaktionen](/developers/docs/transactions/) und unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. ## Warum Blöcke? {#why-blocks} Um sicherzustellen, dass alle Teilnehmer des Ethereum-Netzwerks einen synchronisierten Zustand beibehalten und sich über den genauen Verlauf der Transaktionen einig sind, fassen wir die Transaktionen in Blöcken zusammen. Das bedeutet, dass Dutzende (oder Hunderte) von Transaktionen in einem Durchgang übergeben, bestätigt und synchronisiert werden. -![Ein Diagramm, das Transaktionen in einem Block zeigt, die Zustandsänderungen verursachen](./tx-block.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Ein Diagramm, das eine Transaktion in einem Block zeigt, die Zustandsänderungen verursacht](./tx-block.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ Durch die zeitliche Verteilung der Commits geben wir allen Netzwerkteilnehmern genügend Zeit, einen Konsens zu erzielen: Obwohl Transaktionsanfragen dutzende Male pro Sekunde erfolgen, werden Blöcke auf Ethereum nur alle zwölf Sekunden erstellt und festgeschrieben. @@ -24,7 +25,7 @@ Um die Transaktionsgeschichte zu erhalten, sind Blöcke streng sortiert (jeder n Sobald ein Block von einem zufällig ausgewählten Validator im Netzwerk erstellt wird, wird er im gesamten Netzwerk verbreitet. Alle Knoten fügen diesen Block dann am Ende ihrer Blockchain hinzu und ein neuer Validator wird ausgewählt, um den nächsten Block zu erstellen. Der genaue Prozess der Blockzusammenstellung und Festlegung/Konsensbildung ist zurzeit in Ethereums Proof-of-Stake-Protokoll festgelegt. -## Proof-of-Stake-Protokoll {#proof-of-work-protocol} +## Proof-of-Stake-Protokoll {#proof-of-stake-protocol} Proof-of-Stake bedeutet Folgendes: @@ -33,30 +34,30 @@ Proof-of-Stake bedeutet Folgendes: - Andere Validatoren, die von dem neuen Block erfahren, führen die Transaktionen erneut aus, um sicherzustellen, dass sie der vorgeschlagenen Änderung des globalen Zustands zustimmen. In der Annahme, dass der Block gültig ist, fügen sie ihn zu ihrer eigenen Datenbank hinzu. - Wenn ein Validator von zwei konkurrierenden Blöcken für denselben Slot erfährt, wählt er mit seinem Fork-Wahlalgorithmus den Block aus, der von den meisten eingesetzten ETH unterstützt wird. -[Mehr über Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) +[Mehr zu Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) ## Was enthält ein Block? {#block-anatomy} Ein Block enthält viele verschiedene Informationen. Auf oberster Ebene enthält ein Block folgende Felder: -| Feld | Beschreibung | -|:------------------- |:----------------------------------------------------------- | -| `Zeitspanne (Slot)` | Der Slot, zu dem der Block gehört | -| `proposer_index` | Die ID des Validators, der den Block vorschlägt | -| `parent_root` | Der Hash des vorausgehenden Blocks | -| `state_root` | Der Stamm-Hash des Zustandsobjekts | -| `hauptteil` | Ein Objekt, das mehrere Felder enthält, wie unten definiert | +| Feld | Beschreibung | +| :--------------- | :---------------------------------------------------------- | +| `slot` | Der Slot, zu dem der Block gehört | +| `proposer_index` | Die ID des Validators, der den Block vorschlägt | +| `parent_root` | Der Hash des vorausgehenden Blocks | +| `state_root` | Der Stamm-Hash des Zustandsobjekts | +| `hauptteil` | Ein Objekt, das mehrere Felder enthält, wie unten definiert | -Der `Body` eines Blocks enthält selbst mehrere Felder: +Der `body` eines Blocks enthält selbst mehrere Felder: | Feld | Beschreibung | -|:-------------------- |:-------------------------------------------------------------------------------- | +| :------------------- | :------------------------------------------------------------------------------- | | `randao_reveal` | Ein Wert, der zur Auswahl des nächsten Block-Vorschlagenden verwendet wird | | `eth1_data` | Informationen zum Einzahlungsvertrag | | `graffiti` | Beliebige Daten, die zum Markieren von Blöcken verwendet werden | | `proposer_slashings` | Liste der zu streichenden Validatoren | | `attester_slashings` | Liste der Attestierer für Slashing | -| `beglaubigungen` | Liste der Bescheinigungen zugunsten des aktuellen Blocks | +| `beglaubigungen` | Liste der Attestierungen, die für frühere Slots gemacht wurden | | `einzahlungen` | Liste der neuen Einlagen zum Einzahlungsvertrag | | `voluntary_exits` | Liste der Validatoren, die das Netzwerk verlassen | | `sync_aggregate` | Teilmenge der Validatoren, die zur Bedienung von leichten Clients verwendet wird | @@ -65,88 +66,88 @@ Der `Body` eines Blocks enthält selbst mehrere Felder: Das Feld `attestations` enthält eine Liste aller Attestierungen im Block. Attestierungen haben ihren eigenen Datentyp der mehrere Datenteile enthält. Jede Attestierung enthält: | Feld | Beschreibung | -|:------------------ |:------------------------------------------------------------------------- | +| :----------------- | :------------------------------------------------------------------------ | | `aggregation_bits` | Eine Liste der Validatoren, die an dieser Attestierung teilgenommen haben | | `daten` | Ein Container mit mehreren Unterfeldern | -| `signature` | Kollektivsignatur aller bescheinigenden Validatoren | +| `unterschrift` | Aggregierte Signatur einer Gruppe von Validatoren für den `data`-Teil | -Das Feld `data` in `attestation` enthält folgende Elemente: +Das `data`-Feld in der `attestation` enthält Folgendes: -| Feld | Beschreibung | -|:------------------- |:----------------------------------------------------------- | -| `Zeitspanne (Slot)` | Der Slot, auf den sich die Attestierung bezieht | -| `Index` | Indizes für die bescheinigenden Validatoren | -| `beacon_block_root` | Der Stamm-Hash des Beacon-Blocks, der dieses Objekt enthält | -| `quelle` | Der letzte berechtigte Kontrollpunkt | -| `target` | Der Grenzblock der neuesten Epoche | +| Feld | Beschreibung | +| :------------------ | :--------------------------------------------------------------------- | +| `slot` | Der Slot, auf den sich die Attestierung bezieht | +| `index` | Indizes für die bescheinigenden Validatoren | +| `beacon_block_root` | Der Root-Hash des Beacon-Blocks, der als Kopf der Kette angesehen wird | +| `quelle` | Der letzte berechtigte Kontrollpunkt | +| `target` | Der Grenzblock der neuesten Epoche | -Die Ausführung der Transaktionen in der `execution_payload` aktualisiert den globalen Zustand. Alle Clients führen die Transaktionen in der `execution_payload` erneut aus, um sicherzustellen, dass der neue Zustand dem Zustand im neuen Block im Feld `state_root` entspricht. Auf diese Weise stellen Clients sicher, dass ein neuer Block gültig und sicher ist, um ihn der Blockchain hinzuzufügen. Der `execution payload` selbst ist ein Objekt mit mehreren Feldern. Es gibt auch einen `execution_payload_header`, der wichtige zusammengefasste Informationen über die auszuführenden Daten enthält. Diese Datenstrukturen sind wie folgt organisiert: +Die Ausführung der Transaktionen in der `execution_payload` aktualisiert den globalen Zustand. Alle Clients führen die Transaktionen in der `execution_payload` erneut aus, um sicherzustellen, dass der neue Zustand dem im `state_root`-Feld des neuen Blocks entspricht. Auf diese Weise stellen Clients sicher, dass ein neuer Block gültig und sicher ist, um ihn der Blockchain hinzuzufügen. Die `execution_payload` selbst ist ein Objekt mit mehreren Feldern. Es gibt auch einen `execution_payload_header`, der wichtige zusammenfassende Informationen über die Ausführungsdaten enthält. Diese Datenstrukturen sind wie folgt organisiert: Der `execution_payload_header` enthält die folgenden Felder: -| Feld | Beschreibung | -|:--------------------- |:------------------------------------------------------------------------------------- | -| `übergeordneter_hash` | Hash des übergeordneten Blocks | -| `fee_recipient` | Kontoadresse, an die die Transaktionsgebühren gezahlt werden | -| `state_root` | Stamm-Hash für den globalen Zustand nach der Anwendung der Änderungen in diesem Block | -| `receipts_root` | Hash des Transaktionsempfänger-Baums | -| `logs_bloom` | Datenstruktur, die Ereignisprotokolle enthält | -| `prev_randao` | Verwendeter Wert in einer zufälligen Validatorauswahl | -| `block_number` | Die Nummer des aktuellen Blocks | -| `gas_limit` | Maximales für diesen Block erlaubtes Gas | -| `gas_used` | Die eingesetzte Menge an Gas in diesem Block | -| `Zeitstempel` | Die Blockzeit | -| `extra_data` | Beliebige zusätzliche Daten als rohe Bytes | -| `base_fee_per_gas` | Der Basisgebührenwert | -| `block_hash` | Hash des ausführenden Blocks | -| `transactions_root` | Stamm-Hash der Transaktionen in der Nutzlast | -| `withdrawal_root` | Stamm-Hash der Abhebungen in der Nutzlast | - -Die `execution_payload` selbst enthält Folgendes (das ist identisch zum Header, außer dass es anstatt des Stamm-Hash der Transaktionen die Liste der Transaktions- und Abhebungsinformationen enthält) : - -| Feld | Beschreibung | -|:--------------------- |:------------------------------------------------------------------------------------- | -| `übergeordneter_hash` | Hash des übergeordneten Blocks | -| `fee_recipient` | Kontoadresse, an die die Transaktionsgebühren gezahlt werden | -| `state_root` | Stamm-Hash für den globalen Zustand nach der Anwendung der Änderungen in diesem Block | -| `receipts_root` | Hash des Transaktionsempfänger-Baums | -| `logs_bloom` | Datenstruktur, die Ereignisprotokolle enthält | -| `prev_randao` | Verwendeter Wert in einer zufälligen Validatorauswahl | -| `block_number` | Die Nummer des aktuellen Blocks | -| `gas_limit` | Maximales für diesen Block erlaubtes Gas | -| `gas_used` | Die eingesetzte Menge an Gas in diesem Block | -| `Zeitstempel` | Die Blockzeit | -| `extra_data` | Beliebige zusätzliche Daten als rohe Bytes | -| `base_fee_per_gas` | Der Basisgebührenwert | -| `block_hash` | Hash des ausführenden Blocks | -| `Transaktionen` | Liste der Transaktionen, die ausgeführt werden sollen | -| `abhebungen` | Liste der Abhebungsobjekte | - -Die Liste `withdrawals` enthält `withdrawal`-Objekte, die wie folgt strukturiert sind: +| Feld | Beschreibung | +| :------------------- | :------------------------------------------------------------------------------------ | +| `parent_hash` | Hash des übergeordneten Blocks | +| `fee_recipient` | Kontoadresse, an die die Transaktionsgebühren gezahlt werden | +| `state_root` | Stamm-Hash für den globalen Zustand nach der Anwendung der Änderungen in diesem Block | +| `receipts_root` | Hash des Transaktionsempfänger-Baums | +| `logs_bloom` | Datenstruktur, die Ereignisprotokolle enthält | +| `prev_randao` | Verwendeter Wert in einer zufälligen Validatorauswahl | +| `block_number` | Die Nummer des aktuellen Blocks | +| `gas_limit` | Maximales für diesen Block erlaubtes Gas | +| `gas_used` | Die eingesetzte Menge an Gas in diesem Block | +| `timestamp` | Die Blockzeit | +| `extra_data` | Beliebige zusätzliche Daten als rohe Bytes | +| `base_fee_per_gas` | Der Basisgebührenwert | +| `block_hash` | Hash des ausführenden Blocks | +| `transactions_root` | Stamm-Hash der Transaktionen in der Nutzlast | +| `withdrawal_root`},{ | Stamm-Hash der Abhebungen in der Nutzlast | + +Die `execution_payload` selbst enthält Folgendes (beachten Sie, dass diese mit dem Header identisch ist, außer dass sie anstelle des Root-Hashs der Transaktionen die tatsächliche Liste der Transaktionen und Auszahlungsinformationen enthält): + +| Feld | Beschreibung | +| :----------------- | :------------------------------------------------------------------------------------ | +| `parent_hash` | Hash des übergeordneten Blocks | +| `fee_recipient` | Kontoadresse, an die die Transaktionsgebühren gezahlt werden | +| `state_root` | Stamm-Hash für den globalen Zustand nach der Anwendung der Änderungen in diesem Block | +| `receipts_root` | Hash des Transaktionsempfänger-Baums | +| `logs_bloom` | Datenstruktur, die Ereignisprotokolle enthält | +| `prev_randao` | Verwendeter Wert in einer zufälligen Validatorauswahl | +| `block_number` | Die Nummer des aktuellen Blocks | +| `gas_limit` | Maximales für diesen Block erlaubtes Gas | +| `gas_used` | Die eingesetzte Menge an Gas in diesem Block | +| `timestamp` | Die Blockzeit | +| `extra_data` | Beliebige zusätzliche Daten als rohe Bytes | +| `base_fee_per_gas` | Der Basisgebührenwert | +| `block_hash` | Hash des ausführenden Blocks | +| `transaktionen` | Liste der Transaktionen, die ausgeführt werden sollen | +| `auszahlungen` | Liste der Abhebungsobjekte | + +Die `withdrawals`-Liste enthält `withdrawal`-Objekte, die wie folgt strukturiert sind: | Feld | Beschreibung | -|:---------------- |:---------------------------------------------- | -| `address` | Kontoadresse, für die die Abhebung erfolgt ist | -| `Betrag` | Abgehobener Betrag | -| `Index` | Abhebungsindexwert | +| :--------------- | :--------------------------------------------- | +| `adresse` | Kontoadresse, für die die Abhebung erfolgt ist | +| `amount` | Abgehobener Betrag | +| `index` | Abhebungsindexwert | | `validatorIndex` | Validatorindexwert | -## Blockzeit {#block-time} +## Block-Zeit {#block-time} Die Blockzeit bezieht sich auf die Zeit zwischen Blöcken. In Ethereum wird Zeit in Einheiten zu je zwölf Sekunden aufgeteilt. Diese heißen "Slots". In jedem Slot wird ein Validator ausgewählt, der einen Block vorschlägt. Geht man davon aus, dass alle Validatoren online und voll funktionsfähig sind, wird es in jedem Slot einen Block gegen. Die zugehörige Blockzeit beträgt dann 12 Sekunden. Es kann jedoch vorkommen, dass Validatoren offline sind, wenn sie dazu aufgerufen werden einen Block vorzuschlagen. Der zugehörige Slot bleibt dann leer. -Diese Implementierung unterscheidet sich von PoW-basierten Blockchain-Systemen, in denen die Erzeugung eines Blocks zu den probabilistischen Verfahren gehört, wodurch die Mining-Schwierigkeit des Protokolls ausgeglichen wird. Die [durchschnittliche Blockverbreitungszeit](https://etherscan.io/chart/blocktime) von Ethereum ist ein perfektes Beispiel für die Implementierung von Proof of Stake und damit für den Wechsel von Proof of Work (PoW) zu Proof of Stake (PoS), der durch eine weitere Anpassung der Blockverbreitungszeit auf 12 Sekunden ermöglicht wurde. +Diese Implementierung unterscheidet sich von PoW-basierten Blockchain-Systemen, in denen die Erzeugung eines Blocks zu den probabilistischen Verfahren gehört, wodurch die Mining-Schwierigkeit des Protokolls ausgeglichen wird. Die [durchschnittliche Block-Zeit](https://etherscan.io/chart/blocktime) von Ethereum ist ein perfektes Beispiel dafür, wobei der Übergang von Proof-of-Work zu Proof-of-Stake anhand der Konsistenz der neuen 12-Sekunden-Block-Zeit deutlich abgeleitet werden kann. ## Blockgröße {#block-size} -Ein finaler, wichtiger Hinweis ist, dass Blöcke selbst in ihrer Größe begrenzt sind. Jeder Block hat eine Zielgröße von 30 Millionen Gas, aber die Größe der Blöcke wird entsprechend der Netznachfrage erhöht oder verringert, bis zur Blockgrenze von 60 Millionen Gas (doppelte Zielblockgröße). Das Gas-Limit eines Blocks kann um den Faktor 1/1024 vom Gas-Limit des vorangegangenen Blocks nach oben oder unten justiert werden. Dadurch können Validatoren das Gas-Limit eines Blocks durch Konsens verändern. Die Gesamtmenge des von allen Transaktionen im Block verbrauchten Gases muss unter dem Blockgaslimit liegen. Das ist wichtig, weil dadurch sichergestellt wird, dass Blöcke nicht willkürlich groß sein können. Wenn Blöcke beliebig groß sein könnten, würden weniger leistungsstarke Knoten aufgrund von Platz- und Geschwindigkeitsanforderungen allmählich nicht mehr mit dem Netzwerk Schritt halten können. Je größer der Block, desto höher ist die erforderliche Verarbeitungsleistung, um den Block rechtzeitig für das nächste Zeitintervall zu berechnen. Das ist ein ganz zentraler Aspekt, der durch die Begrenzung der Blockgröße umgangen wird. +Ein finaler, wichtiger Hinweis ist, dass Blöcke selbst in ihrer Größe begrenzt sind. Jeder Block hat eine Zielgröße von 30 Millionen Gas, aber die Größe der Blöcke wird entsprechend der Netznachfrage erhöht oder verringert, bis zur Blockgrenze von 60 Millionen Gas (doppelte Ziel-Blockgröße). Das Gas-Limit eines Blocks kann um den Faktor 1/1024 vom Gas-Limit des vorangegangenen Blocks nach oben oder unten justiert werden. Dadurch können Validatoren das Gas-Limit eines Blocks durch Konsens verändern. Die Gesamtmenge des von allen Transaktionen im Block verbrauchten Gases muss unter dem Blockgaslimit liegen. Das ist wichtig, weil dadurch sichergestellt wird, dass Blöcke nicht willkürlich groß sein können. Wenn Blöcke beliebig groß sein könnten, würden weniger leistungsstarke Knoten aufgrund von Platz- und Geschwindigkeitsanforderungen allmählich nicht mehr mit dem Netzwerk Schritt halten können. Je größer der Block, desto höher ist die erforderliche Verarbeitungsleistung, um den Block rechtzeitig für das nächste Zeitintervall zu berechnen. Das ist ein ganz zentraler Aspekt, der durch die Begrenzung der Blockgröße umgangen wird. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} _Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} - [Transaktionen](/developers/docs/transactions/) -- [Ressourcen](/developers/docs/gas/) +- [Gas](/developers/docs/gas/) - [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) diff --git a/public/content/translations/de/developers/docs/bridges/index.md b/public/content/translations/de/developers/docs/bridges/index.md new file mode 100644 index 00000000000..032faded200 --- /dev/null +++ b/public/content/translations/de/developers/docs/bridges/index.md @@ -0,0 +1,138 @@ +--- +title: Brücken +description: Eine Übersicht über Bridging für Entwickler +lang: de +--- + +Mit der Verbreitung von L1-Blockchains und L2-[Skalierungslösungen](/developers/docs/scaling/) sowie einer ständig wachsenden Zahl dezentralisierter Anwendungen, die kettenübergreifend arbeiten, ist die Notwendigkeit der Kommunikation und des Transfers von Vermögenswerten über Ketten hinweg zu einem wesentlichen Bestandteil der Netzwerkinfrastruktur geworden. Um dies zu ermöglichen, gibt es verschiedene Arten von Brücken (Bridges). + +## Notwendigkeit für kettenübergreifende Brücken {#need-for-bridges} + +Es gibt Bridges, um Blockchain-Netzwerke miteinander zu verbinden. Sie ermöglichen Konnektivität und Interoperabilität zwischen Blockchains. + +Blockchains existieren in isolierten Umgebungen. Das bedeutet, dass es für Blockchains keine Möglichkeit gibt, auf natürliche Weise mit anderen Blockchains zu transferieren und zu kommunizieren. Dies hat zur Folge, dass es innerhalb eines Ökosystems zwar erhebliche Aktivität und Innovation geben kann, diese aber durch die fehlende Konnektivität und Interoperabilität mit anderen Ökosystemen eingeschränkt ist. + +Bridges bieten eine Möglichkeit für isolierte Blockchain-Umgebungen, sich zu connecten. Sie stellen eine Transportroute zwischen Blockchains her, über die Token, Nachrichten, beliebige Daten und sogar [Smart-Contract-Aufrufe](/developers/docs/smart-contracts/) von einer Kette zur anderen übertragen werden können. + +## Vorteile von kettenübergreifenden Brücken {#benefits-of-bridges} + +Einfach ausgedrückt, ermöglichen Brücken zahlreiche Anwendungsfälle, indem sie es Blockchain-Netzwerken erlauben, Daten auszutauschen und Vermögenswerte zwischen ihnen zu transferieren. + +Blockchains haben einzigartige Stärken, Schwächen und Ansätze zum Aufbau von Anwendungen (wie Geschwindigkeit, Durchsatz, Kosten usw.). Bridges tragen zur Entwicklung des gesamten Krypto-Ökosystems bei, indem sie es Blockchains ermöglichen, die Innovationen der anderen zu nutzen. + +Für Entwickler ermöglichen Bridges Folgendes: + +- Die Übertragung von Daten, Informationen und Vermögenswerten über Ketten hinweg. +- Die Erschließung neuer Funktionen und Anwendungsfälle für Protokolle, da Bridges den Gestaltungsspielraum für Protokolle erweitern. Zum Beispiel kann ein Protokoll für Yield Farming, das ursprünglich im Ethereum Mainnet eingesetzt wurde, Liquiditätspools über alle EVM-kompatiblen Chains hinweg anbieten. +- Die Möglichkeit, die Stärken der verschiedenen Blockchains zu nutzen. So können Entwickler beispielsweise von den niedrigeren Gebühren der verschiedenen L2-Lösungen profitieren, indem sie ihre Dapps auf Rollups bzw. Sidechains deployen und Nutzer diese überbrücken können. +- Zusammenarbeit zwischen Entwicklern aus verschiedenen Blockchain-Ökosystemen, um neue Produkte zu entwickeln. +- Nutzer und Communities aus verschiedenen Ökosystemen für ihre Dapps gewinnen. + +## Wie funktionieren Bridges? {#how-do-bridges-work} + +Obwohl es viele [Arten von Designs für kettenübergreifende Brücken](https://li.fi/knowledge-hub/blockchain-bridges-and-classification/) gibt, stechen drei Möglichkeiten zur Vereinfachung des kettenübergreifenden Transfers von Vermögenswerten hervor: + +- **Sperren und Prägen –** Vermögenswerte auf der Quellkette sperren und auf der Zielkette prägen. +- **Verbrennen und Prägen –** Vermögenswerte auf der Quellkette verbrennen und auf der Zielkette prägen. +- **Atomare Swaps –** Tausch von Vermögenswerten auf der Quellkette gegen Vermögenswerte auf der Zielkette mit einer anderen Partei. + +## Arten von kettenübergreifenden Brücken {#bridge-types} + +Bridges lassen sich in der Regel in eine der folgenden Kategorien einordnen: + +- **Native kettenübergreifende Brücken –** Diese kettenübergreifenden Brücken werden in der Regel gebaut, um die Liquidität auf einer bestimmten Blockchain zu fördern, was es den Nutzern erleichtert, Gelder in das Ökosystem zu transferieren. Die [Arbitrum Bridge](https://bridge.arbitrum.io/) wurde beispielsweise gebaut, um es Nutzern zu erleichtern, von Ethereum Mainnet zu Arbitrum zu überbrücken. Andere solche kettenübergreifenden Brücken sind die Polygon PoS Bridge, das [Optimism Gateway](https://app.optimism.io/bridge) usw. +- **Validator- oder Orakel-basierte kettenübergreifende Brücken –** Diese kettenübergreifenden Brücken stützen sich auf eine externe Gruppe von Validatoren oder Orakel, um kettenübergreifende Übertragungen zu validieren. Beispiele: Multichain und Across. +- **Generalisierten kettenübergreifenden Brücken zur Nachrichtenübermittlung –** Diese kettenübergreifenden Brücken können Vermögenswerte zusammen mit Nachrichten und beliebigen Daten über Ketten hinweg übertragen. Beispiele: Axelar, LayerZero und Nomad. +- **Liquiditätsnetzwerke –** Diese kettenübergreifenden Brücken konzentrieren sich in erster Linie auf die Übertragung von Vermögenswerten von einer Kette zur anderen über atomare Swaps. Im Allgemeinen unterstützen sie keine cross-chain Nachrichtenübermittlung. Beispiele: Connext und Hop. + +## Zu berücksichtigende Trade-offs {#trade-offs} + +Bei Bridges gibt es keine perfekten Lösungen. Vielmehr gibt es Kompromisse, die gemacht werden, um einen bestimmten Zweck zu erfüllen. Entwickler und Benutzer können Bridges anhand der folgenden Faktoren bewerten: + +- **Sicherheit –** Wer verifiziert das System? Durch externe Validatoren gesicherte Bridges sind in der Regel weniger sicher als Bridges, die lokal oder nativ durch die Validatoren der Blockchain gesichert sind. +- **Bequemlichkeit –** Wie lange dauert der Abschluss einer Transaktion und wie viele Transaktionen musste ein Nutzer unterzeichnen? Wie lange braucht ein Entwickler, um eine Bridge zu integrieren, und wie komplex ist der Prozess? +- **Konnektivität –** Welche verschiedenen Zielketten kann eine kettenübergreifende Brücke verbinden (d. h. Rollups, Sidechains, andere Layer-1-Blockchains usw.) und wie schwierig ist es, eine neue Blockchain zu integrieren? +- **Fähigkeit, komplexere Daten zu übermitteln –** Kann eine kettenübergreifende Brücke die Übertragung von Nachrichten und komplexeren beliebigen Daten über Ketten hinweg ermöglichen oder unterstützt sie nur kettenübergreifende Vermögensübertragungen? +- **Kosteneffizienz –** Wie viel kostet die Übertragung von Vermögenswerten über Ketten hinweg über eine kettenübergreifende Brücke? In der Regel erheben Bridges eine feste oder variable Gebühr, die sich nach den Gaskosten und der Liquidität bestimmter Routen richtet. Es ist auch wichtig, die Kosteneffizienz einer Bridge auf der Grundlage des zur Gewährleistung ihrer Sicherheit erforderlichen Kapitals zu bewerten. + +Grundlegend können Bridges in "trusted" und "trustless" Bridges unterteilt werden. + +- **Vertrauenswürdig –** Vertrauenswürdige kettenübergreifende Brücken werden extern verifiziert. Sie verwenden eine externe Gruppe von Verifizierern (Gruppen mit Mehrsignatur, Mehrparteien-Rechensysteme, Orakelnetzwerke), um Daten über Ketten hinweg zu senden. Infolgedessen können sie eine hohe Konnektivität bieten und eine vollständig generalisierte Nachrichtenübermittlung über Chains hinweg ermöglichen. Sie zeichnen sich auch durch hohe Geschwindigkeit und Kosteneffizienz aus. Dies geht jedoch auf Kosten der Sicherheit, da die Benutzer sich auf die Sicherheit der Bridge verlassen müssen. +- **Vertrauenslos –** Diese kettenübergreifenden Brücken stützen sich auf die Blockchains, die sie verbinden, und deren Validatoren, um Nachrichten und Token zu übertragen. Sie sind "vertrauenslos", weil sie keine neuen Vertrauensannahmen (zusätzlich zu den Blockchains) hinzufügen. Folglich gelten trustless Bridges als sicherer als trusted Bridges. + +Um trustless Bridges auf der Grundlage anderer Faktoren zu bewerten, müssen wir sie in "Generalized message passing bridges" und "Liquidity networks" unterteilen. + +- **Generalisierte kettenübergreifende Brücken zur Nachrichtenübermittlung –** Diese kettenübergreifenden Brücken zeichnen sich durch Sicherheit und die Fähigkeit aus, komplexere Daten über Ketten hinweg zu übertragen. In der Regel sind sie auch sehr kosteneffizient. Diese Stärken gehen jedoch in der Regel auf Kosten der Konnektivität bei einfachen Client-Brücken (z. B. IBC) und der Geschwindigkeit bei optimistischen Brücken (z. B. Nomad), die Betrugsnachweise verwenden. +- **Liquiditätsnetzwerke –** Diese kettenübergreifenden Brücken verwenden atomare Swaps für die Übertragung von Vermögenswerten und sind lokal verifizierte Systeme (d. h. sie verwenden die Validatoren der zugrunde liegenden Blockchains, um Transaktionen zu verifizieren). Daher zeichnen sie sich durch Sicherheit und Geschwindigkeit aus. Außerdem gelten sie als vergleichsweise kostengünstig und bieten eine gute Konnektivität. Der größte Nachteil ist jedoch ihre Unfähigkeit, komplexere Daten zu übertragen, da sie keine cross-chain Nachrichtenübermittlung unterstützen. + +## Risiken bei kettenübergreifenden Brücken {#risk-with-bridges} + +Kettenübergreifende Brücken sind für die drei [größten Hacks in DeFi](https://rekt.news/leaderboard/) verantwortlich und befinden sich noch in einem frühen Entwicklungsstadium. Die Verwendung von Bridges birgt die folgenden Risiken: + +- **Smart-Contract-Risiko –** Obwohl viele kettenübergreifende Brücken Audits erfolgreich bestanden haben, reicht ein einziger Fehler in einem Smart Contract aus, damit Vermögenswerte Hacks ausgesetzt sind (z. B. [Solanas Wormhole Bridge](https://rekt.news/wormhole-rekt/)). +- **Systemische finanzielle Risiken** – Viele kettenübergreifende Brücken verwenden Wrapped Assets, um kanonische Versionen des ursprünglichen Vermögenswerts auf einer neuen Kette zu prägen. Dies setzt das Ökosystem einem systemischen Risiko aus, da wir gesehen haben, wie gewrappte Versionen von Token ausgenutzt wurden. +- **Gegenparteirisiko –** Einige kettenübergreifende Brücken verwenden ein vertrauenswürdiges Design, bei dem sich Nutzer darauf verlassen müssen, dass die Validatoren nicht kollaborieren, um Nutzergelder zu stehlen. Da die Nutzer diesen Drittparteien vertrauen müssen, sind sie Risiken wie Absprachen, Zensur und anderen betrügerischen Aktivitäten ausgesetzt. +- **Offene Fragen –** Da sich kettenübergreifende Brücken in einem frühen Entwicklungsstadium befinden, gibt es viele unbeantwortete Fragen dazu, wie sich kettenübergreifende Brücken unter verschiedenen Marktbedingungen verhalten werden, wie z. B. bei Netzwerküberlastung und bei unvorhergesehenen Ereignissen wie Angriffen auf Netzwerkebene oder State Rollbacks. Diese Ungewissheit birgt gewisse Risiken, deren Ausmaß noch unbekannt ist. + +## Wie können Dapps Brücken nutzen? {#how-can-dapps-use-bridges} + +Hier sind einige praktische Anwendungen, die Entwickler bei der Integration von Brücken für ihre Cross-Chain-Dapps berücksichtigen können: + +### Integration von kettenübergreifenden Brücken {#integrating-bridges} + +Entwickler haben verschiedene Möglichkeiten, Bridges zu implementieren: + +1. **Eine eigene kettenübergreifende Brücke bauen –** Der Bau einer sicheren und zuverlässigen kettenübergreifenden Brücke ist nicht einfach, besonders wenn man einen vertrauensminimierten Weg wählt. Dies erfordert umfangreiche Erfahrung und technisches Fachwissen in Bezug auf Skalierbarkeit und Interoperabilität. Zudem ist ein Team notwendig, das sich um die Wartung der Brücke kümmert und ausreichend Liquidität anzieht, um sie funktionsfähig zu machen. + +2. **Nutzern mehrere Optionen für kettenübergreifende Brücken anzeigen –** Viele [Dapps](/developers/docs/dapps/) erfordern, dass Nutzer ihre nativen Token besitzen, um mit ihnen zu interagieren. Um den Nutzern den Zugriff auf ihre Token zu ermöglichen, können sie verschiedene Bridge-Optionen auf ihrer Plattform anbieten. Diese Methode ist jedoch eine schnelle Lösung und lenkt den Nutzer von der Dapp-Oberfläche weg, da er weiterhin mit anderen Dapps und Bridges interagieren muss. Dies kann zu einem umständlichen Onboarding-Erlebnis mit erhöhtem Fehlerpotenzial führen. + +3. **Eine kettenübergreifende Brücke integrieren –** Diese Lösung erfordert nicht, dass die Dapp Nutzer an die externen Schnittstellen der kettenübergreifenden Brücke und DEX sendet. Sie ermöglicht es Dapps, das Onboarding-Erlebnis der Benutzer zu verbessern. Dieser Ansatz hat jedoch seine Grenzen: + + - Die Bewertung und Pflege von Bridges ist schwierig und zeitaufwändig. + - Die Auswahl einer Bridge führt zu einem Single Point of Failure und zu Abhängigkeiten. + - Die Dapp ist durch die Fähigkeiten der Bridge begrenzt. + - Bridges allein reichen möglicherweise nicht aus. Dapps benötigen möglicherweise DEXs, um weitere Funktionen wie Cross-Chain-Swaps anzubieten. + +4. **Mehrere kettenübergreifende Brücken integrieren –** Diese Lösung löst viele Probleme, die mit der Integration einer einzigen kettenübergreifenden Brücke verbunden sind. Sie hat jedoch auch ihre Grenzen, da die Integration mehrerer Bridges ressourcenintensiv ist und einen technischen und kommunikativen Mehraufwand für Entwickler bedeutet - die knappste Ressource in der Kryptowirtschaft. + +5. **Einen Aggregator für kettenübergreifende Brücken integrieren –** Eine weitere Option für Dapps ist die Integration einer Aggregationslösung für kettenübergreifende Brücken, die ihnen Zugang zu mehreren kettenübergreifenden Brücken gibt. Bridge-Aggregatoren erben die Stärken aller Bridges und sind daher nicht durch die Fähigkeiten einer einzelnen Bridge eingeschränkt. Die Bridge-Aggregatoren übernehmen in der Regel die Wartung der Bridge-Integrationen und ersparen der App damit den Aufwand, sich um die technischen und betrieblichen Aspekte einer Bridge-Integration zu kümmern. + +Abgesehen davon haben Bridge-Aggregatoren auch ihre Grenzen. So können sie zwar mehr Bridge-Optionen anbieten, aber auf dem Markt sind in der Regel viel mehr Bridges verfügbar als die, die auf der Plattform des Aggregators angeboten werden. Darüber hinaus sind Bridge-Aggregatoren, genau wie Bridges, auch Smart-Contract- und Technologierisiken ausgesetzt (mehr Smart Contracts = mehr Risiken). + +Wenn eine Dapp den Weg der Integration einer Bridge oder eines Aggregators einschlägt, gibt es verschiedene Optionen, je nachdem, wie umfassend die Integration sein soll. Wenn es sich zum Beispiel nur um eine Front-End-Integration handelt, um das Onboarding-Erlebnis des Nutzers zu verbessern, würde eine Dapp das Widget integrieren. Wenn die Integration jedoch tiefergehende cross-chain Strategien wie Staking, Yield Farming usw. umfassen soll, integriert die Dapp das SDK oder die API. + +### Eine Dapp auf mehreren Chains bereitstellen {#deploying-a-dapp-on-multiple-chains} + +Um eine Dapp auf mehreren Chains bereitzustellen, können Entwickler Entwicklungsplattformen wie [Alchemy](https://www.alchemy.com/), [Hardhat](https://hardhat.org/), [Moralis](https://moralis.io/) usw. verwenden. Diese Plattformen verfügen in der Regel über modulare Plugins, mit denen Dapps cross-chain eingesetzt werden können. Zum Beispiel können Entwickler einen deterministischen Bereitstellungs-Proxy verwenden, der vom [hardhat-deploy-Plugin](https://github.com/wighawag/hardhat-deploy) angeboten wird. + +#### Beispiele: + +- [Wie man kettenübergreifende Dapps baut](https://moralis.io/how-to-build-cross-chain-dapps/) +- [Aufbau eines kettenübergreifenden NFT-Marktplatzes](https://youtu.be/WZWCzsB1xUE) +- [Moralis: Kettenübergreifende NFT-Dapps bauen](https://www.youtube.com/watch?v=ehv70kE1QYo) + +### Überwachung der Vertragsaktivität über Ketten hinweg {#monitoring-contract-activity-across-chains} + +Zur Überwachung der chain-übergreifenden Contract-Aktivitäten können Entwickler Subgraphen und Entwicklerplattformen wie Tenderly verwenden, um Smart Contracts in Echtzeit zu beobachten. Solche Plattformen verfügen auch über Tools, die eine erweiterte Datenüberwachungsfunktionalität für kettenübergreifende Aktivitäten bieten, wie z. B. die Überprüfung von [Ereignissen, die von Verträgen ausgegeben werden](https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=events#events), usw. + +#### Tools + +- [The Graph](https://thegraph.com/en/) +- [Tenderly](https://tenderly.co/) + +## Weiterführende Lektüre {#further-reading} + +- [Blockchain-Brücken](/bridges/) – ethereum.org +- [L2Beat Bridge Risk Framework](https://l2beat.com/bridges/summary) +- [Blockchain-Brücken: Aufbau von Netzwerken aus Kryptonetzwerken](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) - 8. Sep. 2021 – Dmitriy Berenzon +- [Das Interoperabilitäts-Trilemma](https://blog.connext.network/the-interoperability-trilemma-657c2cf69f17) - 1. Okt. 2021 – Arjun Bhuptani +- [Cluster: Wie vertrauenswürdige und vertrauensminimierte kettenübergreifende Brücken die Multi-Chain-Landschaft gestalten](https://blog.celestia.org/clusters/) - 4. Okt. 2021 – Mustafa Al-Bassam +- [LI.FI: Bei kettenübergreifenden Brücken ist Vertrauen ein Spektrum](https://blog.li.fi/li-fi-with-bridges-trust-is-a-spectrum-354cd5a1a6d8) - 28. Apr. 2022 – Arjun Chand +- [Der Stand der Rollup-Interoperabilitätslösungen](https://web.archive.org/web/20250428015516/https://research.2077.xyz/the-state-of-rollup-interoperability) - 20. Juni 2024 – Alex Hook +- [Nutzung gemeinsamer Sicherheit für sichere kettenübergreifende Interoperabilität: Lagrange State Committees und darüber hinaus](https://web.archive.org/web/20250125035123/https://research.2077.xyz/harnessing-shared-security-for-secure-blockchain-interoperability) - 12. Juni 2024 – Emmanuel Awosika + +Zusätzlich finden Sie hier einige aufschlussreiche Präsentationen von [James Prestwich](https://twitter.com/_prestwich), die helfen können, ein tieferes Verständnis für kettenübergreifende Brücken zu entwickeln: + +- [Brücken bauen, keine ummauerten Gärten](https://youtu.be/ZQJWMiX4hT0) +- [Brücken analysieren](https://youtu.be/b0mC-ZqN8Oo) +- [Warum brennen die Brücken](https://youtu.be/c7cm2kd20j8) diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/index.md index ffbf5c088ab..37989263990 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/index.md @@ -8,7 +8,7 @@ Der Begriff „Konsensmechanismus“ wird oft umgangssprachlich verwendet, um ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst unsere [Einleitung zu Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. ## Was ist ein Konsens? {#what-is-consensus} @@ -30,25 +30,25 @@ Diese Komponenten bilden zusammen den Konsensmechanismus. ## Arten von Konsensmechanismen {#types-of-consensus-mechanisms} -### Proof-of-Work-basiert {#proof-of-work} +### Auf Proof-of-Work basierend {#proof-of-work} -Wie Bitcoin nutzte auch Ethereum früher ein auf **Proof-of-Work (PoW)** basierendes Konsensprotokoll. +Wie Bitcoin hat auch Ethereum früher ein auf **Proof-of-Work (PoW)** basierendes Konsensprotokoll verwendet. -#### Blockerstellung {#pow-block-creation} +#### Block-Erstellung {#pow-block-creation} -Miner konkurrieren darum, neue Blöcke voll mit verarbeiteten Transaktionen zu erstellen. Der Gewinner teilt den neuen Block mit dem Rest des Netzwerks und verdient einige frisch geprägte ETH. Das Rennen wird von dem Computer gewonnen, der ein mathematisches Rätsel am schnellsten lösen kann. Dies erzeugt die kryptografische Verbindung zwischen dem aktuellen Block und dem vorherigen Block. Die Lösung dieses Rätsels ist die Arbeit („Work“) in „Proof-of-Work“. Die kanonische Chain wird dann durch eine Abspaltungs-Wahl-Regel bestimmt, bei der die Reihe von Blöcken ausgewählt wird, für deren Mining die meiste Arbeit geleistet wurde. +Miner konkurrieren darum, neue Blöcke voll mit verarbeiteten Transaktionen zu erstellen. Der Gewinner teilt den neuen Block mit dem Rest des Netzwerks und verdient einige frisch geminte ETH. Das Rennen wird von dem Computer gewonnen, der ein mathematisches Rätsel am schnellsten lösen kann. Dies erzeugt die kryptografische Verbindung zwischen dem aktuellen Block und dem vorherigen Block. Die Lösung dieses Rätsels ist die Arbeit („Work“) in „Proof-of-Work“. Die kanonische Chain wird dann durch eine Abspaltungs-Wahl-Regel bestimmt, bei der die Reihe von Blöcken ausgewählt wird, für deren Mining die meiste Arbeit geleistet wurde. #### Sicherheit {#pow-security} Die Sicherheit des Netzwerks wird dadurch gewährleistet, dass Sie 51 % der Rechenleistung des Netzwerks brauchen, um die Chain zu betrügen. Das würde so große Investitionen in Ausrüstung und Energie erfordern, dass Sie wahrscheinlich mehr ausgeben würden, als Sie einnehmen. -Mehr über [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) +Mehr zu [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) -### Proof-of-Stake-basiert {#proof-of-stake} +### Auf Proof-of-Stake basierend {#proof-of-stake} Ethereum verwendet jetzt ein auf **Proof-of-Stake (PoS)** basierendes Konsensprotokoll. -#### Blockerstellung {#pos-block-creation} +#### Block-Erstellung {#pos-block-creation} Validatoren erstellen Blöcke. In jedem Slot wird zufällig ein Validator als Block-Proposer ausgewählt. Ihr Konsens-Client fordert ein Bündel von Transaktionen als „Ausführungsnutzlast“ von ihrem gekoppelten Ausführungs-Client an. Sie verpacken dies in Konsensdaten, um einen Block zu bilden, den sie an andere Nodes im Ethereum-Netzwerk senden. Diese Blockproduktion wird mit ETH belohnt. In seltenen Fällen, wenn für einen einzigen Slot mehrere mögliche Blöcke existieren oder Nodes zu unterschiedlichen Zeiten von Blöcken erfahren, wählt der Abspaltungs-Wahl-Algorithmus den Block aus, der die Chain mit dem größten Gewicht an Attestierungen bildet (wobei das Gewicht die Anzahl der attestierenden Validatoren ist, skaliert nach ihrem ETH-Guthaben). @@ -58,35 +58,35 @@ Ein Proof-of-Stake-System ist kryptoökonomisch sicher, weil ein Angreifer, der Mehr zu [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) -### Ein visueller Leitfaden {#types-of-consensus-video} +### Eine visuelle Anleitung {#types-of-consensus-video} Erfahren Sie mehr über die verschiedenen Arten von Konsensmechanismen, die auf Ethereum verwendet werden: -### Sybil: Widerstand & Kettenauswahl {#sybil-chain} +### Sybil-Resistenz & Kettenauswahl {#sybil-chain} Proof-of-Work und Proof-of-Stake sind für sich genommen keine Konsensprotokolle, aber sie werden oft der Einfachheit halber als solche bezeichnet. Sie sind eigentlich Sybil-Widerstandsmechanismen und Blockautor-Selektoren; sie bieten eine Möglichkeit, zu entscheiden, wer der Autor des letzten Blocks ist. Eine weitere wichtige Komponente ist der Chain-Auswahl-(auch Abspaltungs-Wahl-)Algorithmus. Er ermöglicht es Nodes, in Szenarien, bei denen mehrere Blöcke in der gleichen Position existieren, einen einzigen korrekten Block an der Spitze der Chain auszuwählen. -Mit dem **Sybil-Widerstand** wird gemessen, wie ein Protokoll gegen einen Sybil-Angriff abschneidet. Der Widerstand gegen diese Art von Angriffen ist für eine dezentrale Blockchain unerlässlich und ermöglicht es Minern und Validatoren, gleichermaßen entsprechend der eingesetzten Ressourcen belohnt zu werden. Proof-of-Work und Proof-of-Stake schützen davor, indem sie die Benutzer dazu bringen, viel Energie aufzuwenden oder viele Sicherheiten bereitzustellen. Diese Schutzmaßnahmen sind eine wirtschaftliche Abschreckung gegen Sybil-Angriffe. +**Sybil-Resistenz** misst, wie gut ein Protokoll gegen einen Sybil-Angriff abschneidet. Der Widerstand gegen diese Art von Angriffen ist für eine dezentrale Blockchain unerlässlich und ermöglicht es Minern und Validatoren, gleichermaßen entsprechend der eingesetzten Ressourcen belohnt zu werden. Proof-of-Work und Proof-of-Stake schützen davor, indem sie die Benutzer dazu bringen, viel Energie aufzuwenden oder viele Sicherheiten bereitzustellen. Diese Schutzmaßnahmen sind eine wirtschaftliche Abschreckung gegen Sybil-Angriffe. -Eine **Chain-Auswahlregel** wird verwendet, um zu entscheiden, welche Chain die „richtige“ ist. Bitcoin verwendet die „längste Chain“-Regel. Das bedeutet, dass die Blockchain, die am längsten ist, von den restlichen Nodes als gültig akzeptiert wird, sodass sie mit ihr arbeiten. Bei Proof-of-Work-Chains wird die längste Chain auf Basis der gesamten kumulativen Proof-of-Work-Schwierigkeit der Chain bestimmt. Bei Ethereum kam früher auch die „längste Chain“-Regel zur Anwendung; jetzt, da Ethereum auf Proof-of-Stake läuft, hat es jedoch einen aktualisierten Abspaltungs-Wahl-Algorithmus übernommen, der das „Gewicht“ der Kette bestimmt. Das Gewicht entspricht der kumulierten Summe der Validatorenstimmen, gewichtet nach den in Ether eingesetzten Beträgen der Validatoren. +Eine **Kettenauswahlregel** wird verwendet, um zu entscheiden, welche Kette die "richtige" ist. Bitcoin verwendet die „längste Chain“-Regel. Das bedeutet, dass die Blockchain, die am längsten ist, von den restlichen Nodes als gültig akzeptiert wird, sodass sie mit ihr arbeiten. Bei Proof-of-Work-Chains wird die längste Chain auf Basis der gesamten kumulativen Proof-of-Work-Schwierigkeit der Chain bestimmt. Bei Ethereum kam früher auch die „längste Chain“-Regel zur Anwendung; jetzt, da Ethereum auf Proof-of-Stake läuft, hat es jedoch einen aktualisierten Abspaltungs-Wahl-Algorithmus übernommen, der das „Gewicht“ der Kette bestimmt. Das Gewicht entspricht der kumulierten Summe der Validatorenstimmen, gewichtet nach den in Ether eingesetzten Beträgen der Validatoren. -Ethereum verwendet einen Konsensmechanismus, bekannt als [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/), der [Casper FFG-Proof-of-Stake](https://arxiv.org/abs/1710.09437) mit der [GHOST-Abspaltungs-Wahl-Regel](https://arxiv.org/abs/2003.03052) kombiniert. +Ethereum verwendet einen Konsensmechanismus, der als [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) bekannt ist und der [Casper FFG Proof-of-Stake](https://arxiv.org/abs/1710.09437) mit der [GHOST Fork-Choice-Regel](https://arxiv.org/abs/2003.03052) kombiniert. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Was ist ein Blockchain-Konsens-Algorithmus?](https://academy.binance.com/en/articles/what-is-a-blockchain-consensus-algorithm) +- [Was ist ein Blockchain-Konsensalgorithmus?](https://academy.binance.com/en/articles/what-is-a-blockchain-consensus-algorithm) - [Was ist der Nakamoto-Konsens? Vollständiger Leitfaden für Anfänger](https://blockonomi.com/nakamoto-consensus/) - [Wie funktioniert Casper?](https://medium.com/unitychain/intro-to-casper-ffg-9ed944d98b2d) -- [Über die Sicherheit und Leistungsfähigkeit von Proof-of-Work-Blockchains](https://eprint.iacr.org/2016/555.pdf) +- [Über die Sicherheit und Leistung von Proof-of-Work-Blockchains](https://eprint.iacr.org/2016/555.pdf) - [Byzantinischer Fehler](https://en.wikipedia.org/wiki/Byzantine_fault) -_Gibt es Community-Resourcen, die Sie hilfreich fanden? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} - [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) - [Mining](/developers/docs/consensus-mechanisms/pow/mining/) - [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) -- [Proof-of-authority](/developers/docs/consensus-mechanisms/poa/) +- [Proof-of-Authority](/developers/docs/consensus-mechanisms/poa/) diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/poa/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/poa/index.md index 8820958d1c3..fbcee98d7b3 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/poa/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/poa/index.md @@ -50,7 +50,7 @@ Wenn es beispielsweise 10 autorisierte Unterzeichner gibt und jeder Unterzeichne ## Pro und Kontra {#pros-and-cons} -| Vorteile | Nachteile | +| Pro | Nachteile | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Skalierbarer als andere beliebte Mechanismen wie PoS und PoW, da es auf einer begrenzten Anzahl von Blockunterzeichnern basiert | PoA-Netzwerke haben typischerweise eine relativ kleine Anzahl an Validierungsknoten. Dadurch wird ein PoA-Netzwerk stärker zentralisiert. | | PoA-Blockchains sind unglaublich günstig bei Betrieb und Wartung | Ein autorisierter Unterzeichner zu werden, ist für eine gewöhnliche Person in der Regel unerreichbar, da die Blockchain Entitäten mit einem etablierten Ruf erfordert. | @@ -77,3 +77,4 @@ Sehen Sie sich eine visuelle Erläuterung des Proof-of-Authority an: - [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) - [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) + diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md index f7b17e8d50f..3cbe5ca7e4a 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md @@ -4,37 +4,40 @@ description: Lernen Sie die bekannten Angriffsvektoren im Proof-of-Stake-System lang: de --- -Diebe und Saboteure suchen ständig nach Möglichkeiten, die Client-Software auf Ethereum anzugreifen. Diese Seite stellt die bekannten Angriffsvektoren auf Ethereums Konsensebene dar und erläutert, wie diese Angriffe abgewehrt werden können. Die Informationen auf dieser Seite stammen aus einer [ausführlicheren Version](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs). +Diebe und Saboteure suchen ständig nach Möglichkeiten, die Client-Software auf Ethereum anzugreifen. Diese Seite stellt die bekannten Angriffsvektoren auf Ethereums Konsensebene dar und erläutert, wie diese Angriffe abgewehrt werden können. Die Informationen auf dieser Seite sind eine Adaption einer [längeren Version](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs). ## Voraussetzungen {#prerequisites} -Einige Grundkenntnisse im Bereich [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) sind erforderlich. Außerdem ist es hilfreich, Grundkenntnisse über die [Anreizebene](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) und den Abspaltungs-Wahl-Algorithmus auf Ethereum, [LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper), zu haben. +Einige Grundkenntnisse über [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) sind erforderlich. Darüber hinaus ist es hilfreich, ein grundlegendes Verständnis der [Anreizebene](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) von Ethereum und des Fork-Choice-Algorithmus [LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper) zu haben. ## Was möchten Angreifer? {#what-do-attackers-want} -Ein häufiges Missverständnis ist, dass erfolgreiche Angreifer neue Ether generieren oder sie von beliebigen Konten abziehen können. Keines von beidem ist möglich, da alle Transaktionen von allen Ausführungs-Clients im Netzwerk ausgeführt werden. Diese müssen einfache Gültigkeitsbedingungen erfüllen (z. B. müssen Transaktionen vom privaten Schlüssel eines Absenders signiert werden, der Absender muss über ausreichend Guthaben verfügen, usw.), sonst werden sie einfach rückgängig gemacht. Es gibt drei verschiedene Arten von Ergebnissen, die ein Angreifer realistischerweise erreichen möchte: Neuorganisationen, doppelte Endgültigkeit oder das Verzögern von Endgültigkeit. +Ein häufiges Missverständnis ist, dass erfolgreiche Angreifer neue Ether generieren oder sie von beliebigen Konten abziehen können. Keines von beidem ist möglich, da alle Transaktionen von allen Ausführungs-Clients im Netzwerk ausgeführt werden. Sie müssen grundlegende Gültigkeitsbedingungen erfüllen (z. B. müssen Transaktionen mit dem privaten Schlüssel des Absenders signiert sein, der Absender muss über ein ausreichendes Guthaben verfügen usw.), andernfalls werden sie einfach rückgängig gemacht. Es gibt drei verschiedene Arten von Ergebnissen, die ein Angreifer realistischerweise erreichen möchte: Neuorganisationen, doppelte Endgültigkeit oder das Verzögern von Endgültigkeit. -Eine **“Neuorganisation”** ist eine Neumischung von Blöcken in eine neue Reihenfolge. Hier könnten einige Blöcke in der kanonischen Chain hinzugefügt oder entfernt werden. Bei einer böswilligen Neuanordnung könnte sichergegangen werden, dass spezifische Blöcke ein- oder ausgeschlossen werden. Dies könnte dazu führen, dass für vorweglaufende und zurücklaufende Transaktionen (MEV) doppelte Ausgaben oder Wertextraktionen getätigt werden. Neuorganisationen könnten auch dazu eingesetzt werden, um zu verhindern, dass bestimmte Transaktionen in die kanonische Chain aufgenommen werden – eine Form der Zensur. Die extremste Form einer Neuorganisation ist die „Endgültigkeitsumkehrung“, bei der Blöcke ersetzt oder entfernt werden, die zuvor bereits finalisiert wurden. Das ist nur möglich, wenn mehr als ⅓ der insgesamt eingesetzten Ether vom Angreifer zerstört wird – diese Garantie wird als „wirtschaftliche Endgültigkeit“ bezeichnet – mehr dazu später. +Eine **„Reorg“** ist eine Neuordnung von Blöcken in eine neue Reihenfolge, möglicherweise mit Hinzufügung oder Entfernung von Blöcken in der kanonischen Chain. Bei einer böswilligen Neuanordnung könnte sichergegangen werden, dass spezifische Blöcke ein- oder ausgeschlossen werden. Dies könnte dazu führen, dass für vorweglaufende und zurücklaufende Transaktionen (MEV) doppelte Ausgaben oder Wertextraktionen getätigt werden. Neuorganisationen könnten auch dazu eingesetzt werden, um zu verhindern, dass bestimmte Transaktionen in die kanonische Chain aufgenommen werden – eine Form der Zensur. Die extremste Form einer Neuorganisation ist die „Endgültigkeitsumkehrung“, bei der Blöcke ersetzt oder entfernt werden, die zuvor bereits finalisiert wurden. Das ist nur möglich, wenn mehr als ⅓ der insgesamt eingesetzten Ether vom Angreifer zerstört wird – diese Garantie wird als „wirtschaftliche Endgültigkeit“ bezeichnet – mehr dazu später. -**Doppelte Endgültigkeit** ist die unwahrscheinliche, aber ernste Bedingung, bei der zwei Abspaltungen gleichzeitig finalisiert werden können, was zu einer permanente Spaltung der Chain führt. Das ist theoretisch möglich für einen Angreifer, der dazu bereit ist, 34 % der insgesamt eingesetzten Ether zu riskieren. Die Community wäre dazu gezwungen, sich außerhalb der Chain zu koordinieren und sich darauf zu einigen, welcher Chain gefolgt werden soll. Dies würde eine starke Sozialebene erfordern. +**Doppelte Finalität** ist der unwahrscheinliche, aber schwerwiegende Zustand, bei dem zwei Forks gleichzeitig finalisiert werden können, was zu einer dauerhaften Spaltung der Chain führt. Das ist theoretisch möglich für einen Angreifer, der dazu bereit ist, 34 % der insgesamt eingesetzten Ether zu riskieren. Die Community wäre gezwungen, sich offchain zu koordinieren und eine Einigung darüber zu erzielen, welcher Chain gefolgt werden soll, was Stärke in der sozialen Ebene erfordern würde. -Ein Angriff, bei dem die **Endgültigkeit verzögert** wird, hindert das Netzwerk daran, die notwendigen Bedingungen zu erreichen, um die Chain zu finalisieren. Ohne Endgültigkeit ist es schwer, finanziellen Anwendungen auf Basis von Ethereum zu vertrauen. Das Ziel eines solchen Angriffs wäre wahrscheinlich eher die Störung von Ethereum als eine direkte Bereicherung, es sei denn, der Angreifer verfügt über eine/einige strategische Short-Position(en). +Ein **Finalitätsverzögerungs**-Angriff hindert das Netzwerk daran, die notwendigen Bedingungen zur Finalisierung von Abschnitten der Chain zu erreichen. Ohne Endgültigkeit ist es schwer, finanziellen Anwendungen auf Basis von Ethereum zu vertrauen. Das Ziel eines solchen Angriffs wäre wahrscheinlich eher die Störung von Ethereum als eine direkte Bereicherung, es sei denn, der Angreifer verfügt über eine/einige strategische Short-Position(en). Ein Angriff auf die soziale Ebene könnte darauf abzielen, das öffentliche Vertrauen in Ethereum zu untergraben, Ether zu entwerten, die Akzeptanz zu verringern oder die Ethereum-Community zu schwächen, sodass die Koordination außerhalb des Bands erschwert wird. -Nachdem wir festgestellt haben, warum ein Angreifer Ethereum angreifen könnte, geht es in den folgenden Abschnitten darum, _wie_ so ein Angriff versucht werden könnte. +Nachdem wir nun geklärt haben, warum ein Gegner Ethereum angreifen könnte, untersuchen die folgenden Abschnitte, _wie_ er dabei vorgehen könnte. ## Angriffsmethoden {#methods-of-attack} -### Angriffe auf Layer 0 {#layer-0} +### Layer-0-Angriffe {#layer-0} Erstmal könnten Einzelpersonen, die sich nicht aktiv an Ethereum beteiligen (indem sie Client-Software ausführen) angreifen, indem sie die Sozialebene (Layer 0) ins Visier nehmen. Layer 0 ist das Fundament, auf dem Ethereum aufgebaut ist. Als solches bietet es eine potenzielle Angriffsfläche. Die Konsequenzen aus so einem Angriff hätten Auswirkungen auf den gesamten restlichen Stack. Einige Beispiele hierfür sind: - Eie Falschinformationskampagne könnte das Vertrauen der Community in Ethereums Roadmap, Entwicklerteams, Anwendungen usw. untergraben. Das könnte dann dazu führen, dass sich die Anzahl an Menschen, die dazu bereit sind, bei der Sicherung des Netzwerks zu helfen, stark verringern würde. So eine Entwicklung hätte negative Einflüsse sowohl auf die Dezentralisierung als auch auf die krypto-ökonomische Sicherheit. + - Gezielte Angriffe und/oder Einschüchterungsversuche in Richtung der Entwicklercommunity. Dies könnte zum freiwilligen Austritt von Entwicklern führen und Ethereums Fortschritt verlangsamen. - Eine übereifrige Regulierung könnte auch als Angriff auf die Layer 0 interpretiert werden, da sie die Anreize für die Teilnahme und Übernahme massiv verringern könnte. + - Eine Infiltration der Entwicklercommunity durch wissende, aber böswillige Akteure mit dem Ziel, den Fortschritt aufzuhalten, und zwar durch Diskussionen über Kleinigkeiten, das Verlangsamen von Schlüsselentscheidungen, Spam usw. + - Bestechungsgelder, die an Schlüsselpersonen im Ethereum-Ökosystem gesendet werden, um deren Entscheidungen zu beeinflussen. Was diese Angriffe besonders gefährlich macht, ist, dass in vielen Fällen sehr wenig Kapital oder technisches Wissen dafür erforderlich ist. Ein Angriff auf Layer 0 könnte ein Multiplikator auf einen krypto-ökonomischen Angriff sein. Wenn es beispielsweise zu Zensur oder einer Endgültigkeitsumkehrung durch einen böswilligen Mehrheits-Stakeholder kommen würde, könnte eine Schwächung der Sozialebene es schwieriger machen, eine Antwort der Community außerhalb des Bandes zu koordinieren. @@ -45,59 +48,59 @@ Eine andere wichtige Verteidigung gegen Angriffe gegen die Sozialebene sind klar Schließlich ist es von entscheidender Bedeutung, dass die Ethereum-Community offen bleibt und alle Teilnehmer willkommen heißt. Eine von Gatekeepern und Exklusivität geprägte Community ist besonders anfällig für soziale Angriffe, weil es ein Leichtes ist, ein „Wir gegen die anderen“-Narrativ zu etablieren. Tribalismus und toxischer Maximalismus schaden der Community und untergraben die Sicherheit der Layer 0. Ethereaner, die ein berechtigtes Interesse an der Sicherheit des Netzwerks haben, sollten ihr Verhalten online und in der realen Welt als direkten Beitrag zur Sicherheit der Layer 0 auf Ethereum betrachten. -### Angriffe auf das Protokoll {#attacking-the-protocol} +### Angriff auf das Protokoll {#attacking-the-protocol} Jeder kann die Client-Software von Ethereum ausführen. Um einen Validatoren zu einem Client hinzuzufügen, muss ein Benutzer 32 Ether in den Einzahlungsvertrag überweisen. Ein Validator ermöglicht es einem Benutzer, sich aktiv an der Netzwerksicherheit von Ethereum zu beteiligen, indem er neue Blöcke vorschlägt und diese attestiert. Der Validator hat nun eine Stimme, mit der er den zukünftigen Inhalt der Blockchain beeinflussen kann – er kann dies auf ehrliche Weise tun und seinen Vorrat an Ether durch Belohnungen vergrößern oder er kann versuchen, den Prozess zu seinem eigenen Vorteil zu manipulieren und dabei seinen Stake riskieren. Eine Möglichkeit, einen Angriff zu starten, besteht darin, einen größeren Anteil des Gesamt-Stakes anzuhäufen und diesen dann zu nutzen, um ehrliche Validatoren zu überstimmen. Je größer der Anteil des von den Angreifern kontrollierten Stakes ist, desto größer ist ihr Stimmgewicht, insbesondere bei bestimmten wirtschaftlichen Meilensteinen, auf die wir später noch eingehen werden. Die meisten Angreifer werden jedoch nicht in der Lage sein, genügend Ether anzuhäufen, um auf diese Weise einen Angriff durchzuführen. Stattdessen sind sie auf subtile Techniken angewiesen, mit denen sie die ehrliche Mehrheit so manipulieren, dass sie auf eine bestimmte Weise handelt. Grundsätzlich handelt es sich bei allen Angriffen mit kleinen Stakes um subtile Variationen zweier Arten von Validator-Fehlverhalten: Unteraktivität (keine oder zu späte Attestierungen/Vorschläge) oder Überaktivität (zu viele Attestierungen/Vorschläge in einem Slot). In ihrer einfachsten Form werden diese Aktionen durch den Abspaltungs-Wahl-Algorithmus und die Anreizebene leicht abgewehrt. Allerdings gibt es clevere Möglichkeiten, das System zum Vorteil eines Angreifers zu manipulieren. -### Angriffe mit kleinen ETH-Beträgen {#attacks-by-small-stakeholders} +### Angriffe mit kleinen Mengen an ETH {#attacks-by-small-stakeholders} -#### Neuorganisationen {#reorgs} +#### Reorgs {#reorgs} -In mehreren Artikeln wurden Angriffe auf Ethereum beschrieben, die Neuorganisationen oder Endgültigkeitsverzögerungen mit nur einem kleinen Teil der insgesamt eingesetzten Ether erreichten. Diese Angriffe beruhen in der Regel darauf, dass der Angreifer anderen Validatoren bestimmte Informationen vorenthält und diese dann auf eine nuancierte Art und/oder zu einem günstigen Zeitpunkt freigibt. Sie zielen in der Regel darauf ab, einen oder mehrere ehrliche Blöcke aus der kanonischen Chain zu verdrängen. [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf) hat gezeigt, wie ein angreifender Validator einen Block für einen bestimmten Slot `n+1` erstellen und attestieren kann (`B`), diesen aber nicht an andere Nodes im Netzwerk weitergeben kann. Stattdessen halten sie an diesem attestierten Block bis zum nächsten Slot `n+2` fest. Ein ehrlicher Validator schlägt einen Block (`C`) für Slot `n+2` vor. Fast gleichzeitig kann der Angreifer seinen zurückgehaltenen Block (`B`) und seine dafür zurückgehaltenen Attestierungen freigeben und auch attestieren, dass `B` die Spitze der Chain ist mit seinen Stimmen für Slot `n+2`. Damit würde er die Existenz des ehrlichen Blocks `C` faktisch leugnen. Wenn der ehrliche Block `D` freigegeben wird, sieht der Abspaltungs-Wahl-Algorithmus, dass `D` auf `B` aufbaut, der schwerer ist als `D`, der auf `C`aufbaut. Der Angreifer hat es also geschafft, den ehrlichen Block `C` aus der kanonischen Chain aus Slot `n+2` zu entfernen und hat dazu eine 1-Block-Ex-ante-Neuorganisation eingesetzt. [Ein Angreifer, der 34 %](https://www.youtube.com/watch?v=6vzXwwk12ZE) des Stakes hält, hat eine sehr gute Chance, diesen Angriff erfolgreich durchzuführen, wie in dieser Anmerkung [erklärt wird](https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair). Theoretisch könnte dieser Angriff jedoch auch mit kleineren Stakes unternommen werden. [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf) hat beschrieben, wie dieser Angriff mit einem Stake von 30 % funktioniert. Später wurde allerdings gezeigt, dass er auch mit [2 % des Gesamt-Stakes](https://arxiv.org/pdf/2009.04987.pdf) und außerdem mit einem [einzelnen Validator](https://arxiv.org/abs/2110.10086#) erfolgreich war, der Balancing-Techniken anwandte, die wir uns im nächsten Abschnitt genauer ansehen werden. +In mehreren Artikeln wurden Angriffe auf Ethereum beschrieben, die Neuorganisationen oder Endgültigkeitsverzögerungen mit nur einem kleinen Teil der insgesamt eingesetzten Ether erreichten. Diese Angriffe beruhen in der Regel darauf, dass der Angreifer anderen Validatoren bestimmte Informationen vorenthält und diese dann auf eine nuancierte Art und/oder zu einem günstigen Zeitpunkt freigibt. Sie zielen in der Regel darauf ab, einen oder mehrere ehrliche Blöcke aus der kanonischen Chain zu verdrängen. [Neuder et al. 2020](https://arxiv.org/pdf/2102.02247.pdf) zeigten, wie ein angreifender Validator einen Block (`B`) für einen bestimmten Slot `n+1` erstellen und attestieren, ihn aber nicht an andere Nodes im Netzwerk weitergeben kann. Stattdessen behalten sie diesen attestierten Block bis zum nächsten Slot `n+2`. Ein ehrlicher Validator schlägt einen Block (`C`) für den Slot `n+2` vor. Fast gleichzeitig kann der Angreifer seinen zurückgehaltenen Block (`B`) und die dafür zurückgehaltenen Attestierungen freigeben und mit seinen Stimmen für den Slot `n+2` ebenfalls attestieren, dass `B` die Spitze der Chain ist, wodurch die Existenz des ehrlichen Blocks `C` praktisch geleugnet wird. Wenn der ehrliche Block `D` veröffentlicht wird, sieht der Fork-Choice-Algorithmus, dass `D`, der auf `B` aufbaut, schwerer ist als `D`, der auf `C` aufbaut. Der Angreifer hat es also geschafft, den ehrlichen Block `C` im Slot `n+2` mit einem 1-Block-Ex-ante-Reorg aus der kanonischen Chain zu entfernen. [Ein Angreifer mit 34 %](https://www.youtube.com/watch?v=6vzXwwk12ZE) des Stakes hat eine sehr gute Chance, bei diesem Angriff erfolgreich zu sein, wie [in dieser Notiz](https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair) erklärt wird. Theoretisch könnte dieser Angriff jedoch auch mit kleineren Stakes unternommen werden. [Neuder et al. 2020](https://arxiv.org/pdf/2102.02247.pdf) beschrieb, dass dieser Angriff mit einem 30%igen Stake funktioniert, aber später wurde gezeigt, dass er mit [2 % des gesamten Stakes](https://arxiv.org/pdf/2009.04987.pdf) und dann auch für einen [einzelnen Validator](https://arxiv.org/abs/2110.10086#) unter Verwendung von Balancing-Techniken, die wir im nächsten Abschnitt untersuchen werden, durchführbar ist. -![Ex-ante-Neuorganisation](reorg-schematic.png) +![Ex-ante-Reorg](reorg-schematic.png) Ein konzeptionelles Diagramm des oben beschriebenen Neuorganisations-Angriffs mit nur einem Block (angepasst aus https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair) -Ein raffinierterer Angriff kann die Reihe ehrlicher Validatoren in getrennte Gruppen aufteilen, die unterschiedliche Ansichten über die Spitze der Chain haben. Dies ist bekannt unter dem Namen **Balancing-Angriff**. Der Angreifer wartet auf seine Chance, einen Block vorzuschlagen, und wenn diese gekommen ist, wird er mehrdeutig und schlägt zwei vor. Sie senden einen Block an die Hälfte der Reihe aus ehrlichen Validatoren und den anderen Block an die andere Hälfte. Die Mehrdeutigkeit würde vom Abspaltungs-Wahl-Algorithmus erkannt werden und der Block-Proposer würde mit Slashing bestraft und aus dem Netz geworfen werden. Die beiden Blöcke würden hingegen weiterhin existieren, wobei jeweils etwa die Hälfte der Validatoren eine der beiden Abspaltungen attestieren. In der Zwischenzeit halten die übrigen böswilligen Validatoren ihre Attestierungen zurück. Indem sie dann selektiv die Attestierungen, die die eine oder andere Abspaltung begünstigen, genau während der Ausführung des Abspaltungs-Wahl-Algorithmus an gerade genug Validatoren freigeben, kippen sie das kumulierte Gewicht der Attestierungen zugunsten der einen oder anderen Abspaltung. Dies kann auf unbestimmte Zeit fortgesetzt werden, wobei die angreifenden Validatoren eine gleichmäßige Verteilung der Validatoren auf die beiden Abspaltungen beibehalten. Da keine der beiden Abspaltungen eine 2/3-Supermajority auf sich vereinigen kann, würde das Netzwerk nicht finalisiert werden. +Ein raffinierterer Angriff kann die Reihe ehrlicher Validatoren in getrennte Gruppen aufteilen, die unterschiedliche Ansichten über die Spitze der Chain haben. Dies ist als **Balancing-Angriff** bekannt. Der Angreifer wartet auf seine Chance, einen Block vorzuschlagen, und wenn diese gekommen ist, wird er mehrdeutig und schlägt zwei vor. Sie senden einen Block an die Hälfte der Reihe aus ehrlichen Validatoren und den anderen Block an die andere Hälfte. Die Mehrdeutigkeit würde vom Abspaltungs-Wahl-Algorithmus erkannt werden und der Block-Proposer würde mit Slashing bestraft und aus dem Netz geworfen werden. Die beiden Blöcke würden hingegen weiterhin existieren, wobei jeweils etwa die Hälfte der Validatoren eine der beiden Abspaltungen attestieren. In der Zwischenzeit halten die übrigen böswilligen Validatoren ihre Attestierungen zurück. Indem sie dann selektiv die Attestierungen, die die eine oder andere Abspaltung begünstigen, genau während der Ausführung des Abspaltungs-Wahl-Algorithmus an gerade genug Validatoren freigeben, kippen sie das kumulierte Gewicht der Attestierungen zugunsten der einen oder anderen Abspaltung. Dies kann auf unbestimmte Zeit fortgesetzt werden, wobei die angreifenden Validatoren eine gleichmäßige Verteilung der Validatoren auf die beiden Abspaltungen beibehalten. Da keine der beiden Abspaltungen eine 2/3-Supermajority auf sich vereinigen kann, würde das Netzwerk nicht finalisiert werden. -**Bouncing-Angriffe** funktionieren ähnlich. Die Stimmen werden erneut von den angreifenden Validatoren zurückgehalten. Anstatt die Stimmen freizugeben, um eine gleichmäßige Aufteilung zwischen zwei Abspaltungen aufrechtzuerhalten, nutzen sie ihre Stimmen in günstigen Momenten, um Checkpoints zu rechtfertigen, die zwischen Aspaltung A und Abspaltung B alternieren. Dieses Hin- und Herwechseln der Berechtigungen zwischen zwei Abspaltungen verhindert, dass sich Paare berechtigter Quell- und Ziel-Checkpoints bilden, die auf beiden Chains finalisiert werden können, was die Endgültigkeit aufhält. +**Bouncing-Angriffe** sind ähnlich. Die Stimmen werden erneut von den angreifenden Validatoren zurückgehalten. Anstatt die Stimmen freizugeben, um eine gleichmäßige Aufteilung zwischen zwei Abspaltungen aufrechtzuerhalten, nutzen sie ihre Stimmen in günstigen Momenten, um Checkpoints zu rechtfertigen, die zwischen Aspaltung A und Abspaltung B alternieren. Dieses Hin- und Herwechseln der Berechtigungen zwischen zwei Abspaltungen verhindert, dass sich Paare berechtigter Quell- und Ziel-Checkpoints bilden, die auf beiden Chains finalisiert werden können, was die Endgültigkeit aufhält. -Sowohl Bouncing- als auch Balancing-Angriffe setzen voraus, dass der Angreifer das Timing der Nachrichten im Netzwerk sehr genau kontrollieren kann, was unwahrscheinlich ist. Dennoch sind Schutzmechanismen in das Protokoll eingebaut, und zwar in Form einer zusätzlichen Gewichtung von prompten Nachrichten gegenüber langsamen Nachrichten. Dies ist bekannt unter dem Namen [Proposer-Weight Boosting](https://github.com/ethereum/consensus-specs/pull/2730). Um sich gegen Bouncing-Angriffe zu schützen, wurde der Abspaltungs-Wahl-Algorithmus so aktualisiert, dass der letzte berechtigte Checkpoint auf die einer alternativen Chain nur während des [ersten Drittels der Slots in jeder Epoche](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114) wechseln kann. Diese Bedingung hindert den Angreifer daran, Stimmen zu speichern, um sie später einzusetzen – der Abspaltungs-Wahl-Algorithmus bleibt einfach dem Checkpoint treu, den er im ersten Drittel der Epoche gewählt hat, in der die meisten ehrlichen Validatoren gewählt hätten. +Sowohl Bouncing- als auch Balancing-Angriffe setzen voraus, dass der Angreifer das Timing der Nachrichten im Netzwerk sehr genau kontrollieren kann, was unwahrscheinlich ist. Dennoch sind Schutzmechanismen in das Protokoll eingebaut, und zwar in Form einer zusätzlichen Gewichtung von prompten Nachrichten gegenüber langsamen Nachrichten. Dies wird als [Proposer-Weight-Boosting](https://github.com/ethereum/consensus-specs/pull/2730) bezeichnet. Zur Abwehr von Bouncing-Angriffen wurde der Fork-Choice-Algorithmus so aktualisiert, dass der letzte gerechtfertigte Checkpoint nur während des [ersten Drittels der Slots in jeder Epoche](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114) auf den einer alternativen Chain wechseln kann. Diese Bedingung hindert den Angreifer daran, Stimmen zu speichern, um sie später einzusetzen – der Abspaltungs-Wahl-Algorithmus bleibt einfach dem Checkpoint treu, den er im ersten Drittel der Epoche gewählt hat, in der die meisten ehrlichen Validatoren gewählt hätten. Zusammengenommen führen diese Maßnahmen zu einem Szenario, in dem ein ehrlicher Block-Proposer seinen Block sehr schnell nach dem Beginn des Slots überträgt, woraufhin eine Zeitspanne von ~1/3 eines Slots (4 Sekunden) folgt, während der dieser neue Block den Abspaltungs-Wahl-Algorithmus veranlassen könnte, zu einer anderen Chain zu wechseln. Nach Ablauf dieser Frist werden Attestierungen, die von langsamen Validatoren eingehen, im Vergleich zu den früher eingegangenen Attestierungen niedriger gewichtet. Dies begünstigt schnelle Antragsteller und Validatoren bei der Bestimmung Spitze der Chain und verringert die Wahrscheinlichkeit eines erfolgreichen Balancing- oder Bouncing-Angriffs erheblich. -Es ist erwähnenswert, dass das Proposer-Boosting allein nur gegen „billige Neuorganisationen“ schützt, d. h. gegen solche, die von einem Angreifer mit einem kleinen Stake versucht werden. Das „Proposer-Boosting“ selbst kann von größeren Stakeholdern manipuliert werden. Die Autoren von [diesem Beitrag](https://ethresear.ch/t/change-fork-choice-rule-to-mitigate-balancing-and-reorging-attacks/11127) beschreiben, wie ein Angreifer mit 7 % des Stakes seine Stimmen strategisch so einsetzen kann, dass er ehrliche Validatoren dazu bringt, auf ihrer Abspaltung aufzubauen und durch Neuorganisation einen ehrlichen Block aus dem Rennen zu nehmen. Dieser Angriff wurde unter der Annahme idealer Latenzbedingungen entwickelt, die sehr unwahrscheinlich sind. Die Chancen für den Angreifer sind nach wie vor sehr gering und der größere Stake bedeutet auch ein höheres Kapitalrisiko und eine stärkere wirtschaftliche Abschreckung. +Es ist erwähnenswert, dass Proposer-Boosting allein nur vor „billigen Reorgs“ schützt, d. h. vor solchen, die von einem Angreifer mit einem kleinen Stake versucht werden. Das „Proposer-Boosting“ selbst kann von größeren Stakeholdern manipuliert werden. Die Autoren [dieses Beitrags](https://ethresear.ch/t/change-fork-choice-rule-to-mitigate-balancing-and-reorging-attacks/11127) beschreiben, wie ein Angreifer mit 7 % des Stakes seine Stimmen strategisch einsetzen kann, um ehrliche Validatoren dazu zu bringen, auf seinem Fork aufzubauen und so einen ehrlichen Block durch einen Reorg zu verdrängen. Dieser Angriff wurde unter der Annahme idealer Latenzbedingungen entwickelt, die sehr unwahrscheinlich sind. Die Chancen für den Angreifer sind nach wie vor sehr gering und der größere Stake bedeutet auch ein höheres Kapitalrisiko und eine stärkere wirtschaftliche Abschreckung. -Ein [Balancing-Angriff, der speziell auf die LMD-Regel abzielt](https://ethresear.ch/t/balancing-attack-lmd-edition/11853), wurde ebenfalls vorgeschlagen. Es wurde vermutet, dass so ein Angriff trotz Proposer Boosting Erfolg haben könnte. Ein Angreifer richtet zwei konkurrierende Chains ein, indem er dafür sorgt, dass ihr Block-Proposal mehrdeutig wird. Außerdem propagiert er jeden Block an etwa jeweils die Hälfte des Netzwerks, wodurch ein ungefähres Gleichgewicht zwischen den Abspaltungen hergestellt wird. Dann geben die betrügerischen Validatoren ihre Stimmen mehrdeutig ab und legen den Zeitpunkt so fest, dass die Hälfte des Netzes zuerst ihre Stimmen für Abspaltung `A` erhält und die andere Hälfte zuerst ihre Stimmen für Abspaltung `B` erhält. Da die LMD-Regel die zweite Attestierung verwirft und nur die erste Attestierung für jeden Validator aufrechterhält, sieht die Hälfte des Netzwerks Stimmen für `A` und keine für `B`, die andere Hälfte sieht Stimmen für `B` und keine für `A`. Die Autoren beschreiben, dass die LMD-Regel dem Gegner „bemerkenswerte Macht“ dazu verleiht, einen Balancing-Angriff zu starten. +Ein [Balancing-Angriff, der speziell auf die LMD-Regel abzielt](https://ethresear.ch/t/balancing-attack-lmd-edition/11853), wurde ebenfalls vorgeschlagen, der trotz Proposer-Boosting als durchführbar galt. Ein Angreifer richtet zwei konkurrierende Chains ein, indem er dafür sorgt, dass ihr Block-Proposal mehrdeutig wird. Außerdem propagiert er jeden Block an etwa jeweils die Hälfte des Netzwerks, wodurch ein ungefähres Gleichgewicht zwischen den Abspaltungen hergestellt wird. Dann stimmen die kollaborierenden Validatoren zweideutig ab und timen es so, dass die eine Hälfte des Netzwerks ihre Stimmen zuerst für Fork `A` und die andere Hälfte ihre Stimmen zuerst für Fork `B` erhält. Da die LMD-Regel die zweite Attestierung verwirft und nur die erste für jeden Validator behält, sieht die eine Hälfte des Netzwerks Stimmen für `A` und keine für `B`, die andere Hälfte sieht Stimmen für `B` und keine für `A`. Die Autoren beschreiben, dass die LMD-Regel dem Gegner „bemerkenswerte Macht“ dazu verleiht, einen Balancing-Angriff zu starten. -Dieser LMD-Angriffsvektor wurde geschlossen, indem [der Abspaltungs-Wahl-Algorithmus](https://github.com/ethereum/consensus-specs/pull/2845) so aktualisiert wurde, dass mehrdeutige Validatoren bei der Abspaltungs-Wahl überhaupt nicht berücksichtigt werden. Bei mehrdeutigen Validatoren wird ihr zukünftiger Einfluss durch den Abspaltungs-Wahl-Algorithmus ebenfalls abgewertet. Dadurch wird der oben beschriebene Balancing-Angriff verhindert und gleichzeitig die Widerstandsfähigkeit gegen Lawinenangriffe aufrechterhalten. +Dieser LMD-Angriffsvektor wurde durch [Aktualisierung des Fork-Choice-Algorithmus](https://github.com/ethereum/consensus-specs/pull/2845) geschlossen, sodass zweideutig abstimmende Validatoren bei der Fork-Wahl gänzlich unberücksichtigt bleiben. Bei mehrdeutigen Validatoren wird ihr zukünftiger Einfluss durch den Abspaltungs-Wahl-Algorithmus ebenfalls abgewertet. Dadurch wird der oben beschriebene Balancing-Angriff verhindert und gleichzeitig die Widerstandsfähigkeit gegen Lawinenangriffe aufrechterhalten. -Eine andere Klasse von Angriffen, genannt [**Lawinenangriffe**](https://ethresear.ch/t/avalanche-attack-on-proof-of-stake-ghost/11854/3), wurde in einem [Artikel aus dem März 2022](https://arxiv.org/pdf/2203.01315.pdf) beschrieben. Um einen Lawinenangriff durchzuführen, muss der Angreifer mehrere aufeinanderfolgende Block-Proposer kontrollieren. In jedem der Block-Proposal-Slots hält der Angreifer seinen Block zurück und sammelt Blöcke, bis die ehrliche Chain ein Gleichgewicht des Subtrees mit den zurückgehaltenen Blöcken erreicht. Dann werden die zurückgehaltenen Blöcke freigegeben, sodass sie für maximale Mehrdeutigkeit sorgen. Die Autoren legen nahe, dass Proposer Boosting – die primäre Verteidigung gegen Balancing- und Bouncing-Angriffe – nicht vor einigen Varianten von Lawinenangriffen schützt. Allerdings demonstrierten die Autoren den Angriff auch nur an einer stark idealisierten Version des Abspaltungs-Wahl-Algorithmus auf Ethereum (sie verwendeten GHOST ohne LMD). +Eine weitere Angriffsklasse, die [**Avalanche-Angriffe**](https://ethresear.ch/t/avalanche-attack-on-proof-of-stake-ghost/11854/3) genannt wird, wurde in einem [Papier vom März 2022](https://arxiv.org/pdf/2203.01315.pdf) beschrieben. Um einen Lawinenangriff durchzuführen, muss der Angreifer mehrere aufeinanderfolgende Block-Proposer kontrollieren. In jedem der Block-Proposal-Slots hält der Angreifer seinen Block zurück und sammelt Blöcke, bis die ehrliche Chain ein Gleichgewicht des Subtrees mit den zurückgehaltenen Blöcken erreicht. Dann werden die zurückgehaltenen Blöcke freigegeben, sodass sie für maximale Mehrdeutigkeit sorgen. Die Autoren legen nahe, dass Proposer Boosting – die primäre Verteidigung gegen Balancing- und Bouncing-Angriffe – nicht vor einigen Varianten von Lawinenangriffen schützt. Allerdings demonstrierten die Autoren den Angriff auch nur an einer stark idealisierten Version des Abspaltungs-Wahl-Algorithmus auf Ethereum (sie verwendeten GHOST ohne LMD). Der Lawinenangriff wird durch den LMD-Teil des LMD-GHOST-Abspaltungs-Wahl-Algorithmus abgeschwächt. LMD bedeutet „latest-message-driven“ und bezieht sich auf eine Tabelle, die von jedem Validator geführt wird und die die letzte von anderen Validatoren erhaltene Nachricht enthält. Dieses Feld wird nur dann aktualisiert, wenn die neue Nachricht von einem späteren Slot stammt als die bereits in der Tabelle für einen bestimmten Validator enthaltene Nachricht. In der Praxis bedeutet dies, dass in jedem Slot die erste empfangene Nachricht diejenige ist, die akzeptiert wurde, und dass alle weiteren Nachrichten zu ignorierende Mehrdeutigkeiten sind. Anders ausgedrückt: Die Konsens-Clients zählen keine Mehrdeutigkeiten – sie verwenden die zuerst eintreffende Nachricht von jedem Validator und Mehrdeutigkeiten werden einfach verworfen, um Lawinenangriffe zu verhindern. -Es gibt mehrere andere mögliche Upgrades für die Abspaltungs-Wahl-Regel, die in Zukunft die Sicherheit durch Proposer Boost erhöhen könnten. Eines davon ist [View-Merge](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739), wobei die Attestierer ihre Sicht auf die Abspaltungs-Wahl `n` Sekunden vor Beginn eines Slots einfrieren und der Proposer dann dabei hilft, die Sicht auf die Chain im gesamten Netzwerk zu synchronisieren. Ein weiteres mögliches Upgrade ist die [Einzelplatzendgültigkeit](https://notes.ethereum.org/@vbuterin/single_slot_finality), die vor Angriffen auf Basis des Timings von Nachrichten schützt, indem sie die Chain nach nur einem Slot finalisiert. +Es gibt mehrere andere mögliche Upgrades für die Abspaltungs-Wahl-Regel, die in Zukunft die Sicherheit durch Proposer Boost erhöhen könnten. Eine davon ist [View-Merge](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739), bei dem Attestierer ihre Ansicht der Fork-Wahl `n` Sekunden vor Beginn eines Slots einfrieren und der Proposer dann hilft, die Ansicht der Chain über das Netzwerk hinweg zu synchronisieren. Ein weiteres potenzielles Upgrade ist die [Single-Slot-Finalität](https://notes.ethereum.org/@vbuterin/single_slot_finality), die vor Angriffen auf der Grundlage des Nachrichten-Timings schützt, indem sie die Chain nach nur einem Slot finalisiert. -#### Endgültigkeitsverzögerung {#finality-delay} +#### Finalitätsverzögerung {#finality-delay} -[Im selben Artikel](https://econcs.pku.edu.cn/wine2020/wine2020/Workshop/GTiB20_paper_8.pdf), der zuerst den kostengünstigen Angriff auf die Neuorganisation eines einzelnen Blocks beschrieben hatte, wurde auch ein Angriff mit Endgültigkeitsverzögerung (auch bekannt als „Livesness-Versagen“) beschrieben, der sich darauf stützt, dass der Angreifer der Block-Proposer für einen Block an der Epochengrenze ist. Dies ist von entscheidender Bedeutung, da diese Blöcke an der Epochengrenze zu den Checkpoints werden, die Casper FFG verwendet, um Teile der Chain zu finalisieren. Der Angreifer hält seinen Block einfach so lange zurück, bis genügend ehrliche Validatoren ihre FFG-Stimmen zugunsten des vorherigen Blocks an der Epochengrenze als aktuelles Finalisierungsziel einsetzen. Dann geben sie ihren zurückgehaltenen Block frei. Sie attestieren für ihren Block und die übrigen ehrlichen Validatoren tun dies ebenfalls, wodurch Abspaltungen mit unterschiedlichen Ziel-Checkpoints kreiert werden. Wenn sie es genau richtig timen, verhindern sie die Endgültigkeit, weil es keine 2/3-Supermajority gibt, die für eine der beiden Abspaltungen attestiert. Je kleiner der Stake ist, desto präziser muss das Timing sein, da der Angreifer weniger Attestierungen direkt kontrolliert, und desto geringer ist die Wahrscheinlichkeit, dass der Angreifer den Validator kontrolliert, der einen bestimmten Block an der Epochengrenze vorschlägt. +[Dasselbe Papier](https://econcs.pku.edu.cn/wine2020/wine2020/Workshop/GTiB20_paper_8.pdf), das zuerst den kostengünstigen Single-Block-Reorg-Angriff beschrieb, beschrieb auch einen Finalitätsverzögerungs-Angriff (auch bekannt als „Liveness-Ausfall“), der darauf beruht, dass der Angreifer der Block Proposer für einen Epochengrenzen-Block ist. Dies ist von entscheidender Bedeutung, da diese Blöcke an der Epochengrenze zu den Checkpoints werden, die Casper FFG verwendet, um Teile der Chain zu finalisieren. Der Angreifer hält seinen Block einfach so lange zurück, bis genügend ehrliche Validatoren ihre FFG-Stimmen zugunsten des vorherigen Blocks an der Epochengrenze als aktuelles Finalisierungsziel einsetzen. Dann geben sie ihren zurückgehaltenen Block frei. Sie attestieren für ihren Block und die übrigen ehrlichen Validatoren tun dies ebenfalls, wodurch Abspaltungen mit unterschiedlichen Ziel-Checkpoints kreiert werden. Wenn sie es genau richtig timen, verhindern sie die Endgültigkeit, weil es keine 2/3-Supermajority gibt, die für eine der beiden Abspaltungen attestiert. Je kleiner der Stake ist, desto präziser muss das Timing sein, da der Angreifer weniger Attestierungen direkt kontrolliert, und desto geringer ist die Wahrscheinlichkeit, dass der Angreifer den Validator kontrolliert, der einen bestimmten Block an der Epochengrenze vorschlägt. -#### Langstreckenangriffe {#long-range-attacks} +#### Long-Range-Angriffe {#long-range-attacks} -Es gibt auch eine Angriffsklasse, die spezifisch für Proof-of-Stake-Blockchains ist, bei der ein Validator, der am Genesis-Block beteiligt war, eine separate Abspaltung der Blockchain neben der ehrlichen aufrechterhält. Schließlich überzeugt dieser die Reihe ehrlicher Validator davon, viel später zu einem günstigen Zeitpunk zu dieser Abspaltung zu wechseln. Diese Art von Angriff ist bei Ethereum nicht möglich, da das Endgültigkeits-Gadget sicherstellt, dass sich alle Validatoren in regelmäßigen Abständen („Checkpoints“) über den Zustand der ehrlichen Chain einig sind. Dieser einfache Mechanismus neutralisiert Langstreckenangriffe, da Ethereum-Clients finalisierte Blöcke einfach nicht neu organisieren. Neue Nodes, die dem Netzwerk beitreten, tun dies, indem sie einen vertrauenswürdigen aktuellen Zustands-Hash finden (einen „[Checkpoint schwacher](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) Subjektivität“) und ihn als Pseudo-Genesis-Block verwenden, auf dem aufgebaut werden kann. Dadurch wird für einen neuen Node, der in das Netzwerk eintritt, ein „Vertrauens-Gateway“ geschaffen, bevor er damit beginnen kann, Informationen für sich selbst zu verifizieren. +Es gibt auch eine Angriffsklasse, die spezifisch für Proof-of-Stake-Blockchains ist, bei der ein Validator, der am Genesis-Block beteiligt war, eine separate Abspaltung der Blockchain neben der ehrlichen aufrechterhält. Schließlich überzeugt dieser die Reihe ehrlicher Validator davon, viel später zu einem günstigen Zeitpunk zu dieser Abspaltung zu wechseln. Diese Art von Angriff ist bei Ethereum nicht möglich, da das Endgültigkeits-Gadget sicherstellt, dass sich alle Validatoren in regelmäßigen Abständen („Checkpoints“) über den Zustand der ehrlichen Chain einig sind. Dieser einfache Mechanismus neutralisiert Langstreckenangriffe, da Ethereum-Clients finalisierte Blöcke einfach nicht neu organisieren. Neue Nodes, die dem Netzwerk beitreten, tun dies, indem sie einen vertrauenswürdigen aktuellen State-Hash (einen „[Checkpoint schwacher Subjektivität](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/)“) finden und ihn als Pseudo-Genesis-Block verwenden, um darauf aufzubauen. Dadurch wird für einen neuen Node, der in das Netzwerk eintritt, ein „Vertrauens-Gateway“ geschaffen, bevor er damit beginnen kann, Informationen für sich selbst zu verifizieren. #### Denial of Service {#denial-of-service} -Der PoS-Mechanismus von Ethereum wählt in jedem Slot einen einzelnen Validator aus der Gesamtmenge der Validatoren aus, der als Block-Proposer fungiert. Diese kann mit Hilfe einer öffentlich bekannten Funktion berechnet werden und es ist möglich, dass ein Angreifer den nächsten Block-Proposer kurze Zeit vor seinem Block-Proposal identifiziert. Dann kann der Angreifer den Block-Proposer mit Spam-Mails bombardieren, um ihn daran zu hindern, Informationen mit seinen Peers auszutauschen. Für den Rest des Netzwerkes würde es so aussehen, als wäre der Block-Proposer offline und als würde der Slot einfach leer werden. Dies könnte als eine Form der Zensur gegen bestimmte Validatoren eingesetzt werden, die so daran gehindert werden, Informationen zur Blockchain hinzuzufügen. Durch die Implementierung von Single Secret Leader Elections (SSLE) oder Non Single Secret Leader Elections wird das DoS-Risiko gemindert, da nur derjenige, der den Block vorschlägt, weiß, dass er ausgewählt wurde und die Auswahl nicht im Voraus bekannt ist. Dies wurde noch nicht implementiert, ist aber ein aktiver Bereich der [Forschung und Entwicklung](https://ethresear.ch/t/secret-non-single-leader-election/11789). +Der PoS-Mechanismus von Ethereum wählt in jedem Slot einen einzelnen Validator aus der Gesamtmenge der Validatoren aus, der als Block-Proposer fungiert. Diese kann mit Hilfe einer öffentlich bekannten Funktion berechnet werden und es ist möglich, dass ein Angreifer den nächsten Block-Proposer kurze Zeit vor seinem Block-Proposal identifiziert. Dann kann der Angreifer den Block-Proposer mit Spam-Mails bombardieren, um ihn daran zu hindern, Informationen mit seinen Peers auszutauschen. Für den Rest des Netzwerkes würde es so aussehen, als wäre der Block-Proposer offline und als würde der Slot einfach leer werden. Dies könnte als eine Form der Zensur gegen bestimmte Validatoren eingesetzt werden, die so daran gehindert werden, Informationen zur Blockchain hinzuzufügen. Durch die Implementierung von Single Secret Leader Elections (SSLE) oder Non Single Secret Leader Elections wird das DoS-Risiko gemindert, da nur derjenige, der den Block vorschlägt, weiß, dass er ausgewählt wurde und die Auswahl nicht im Voraus bekannt ist. Dies ist noch nicht implementiert, ist aber ein aktives Gebiet der [Forschung und Entwicklung](https://ethresear.ch/t/secret-non-single-leader-election/11789). All dies deutet darauf hin, dass es sehr schwierig ist, Ethereum mit einem kleinen Stake erfolgreich anzugreifen. Für die hier beschriebenen realisierbaren Angriffe sind ein idealisierter Abspaltungs-Wahl-Algorithmus oder unwahrscheinliche Netzwerkbedingungen erforderlich oder die Angriffsvektoren wurden bereits mit relativ kleinen Patches für die Client-Software geschlossen. Dies schließt natürlich nicht aus, dass irgendwo dort draußen Zero-Days existieren. Allerdings zeigt es, wie hoch die Messlatte für technisches Geschick, Wissen über die Konsensebene und Glück liegt, damit ein Angreifer mit einem Minderheits-Stake erfolgreich sein kann. Aus der Sicht eines Angreifers wäre es am besten, so viel Ether wie möglich zu sammeln und, ausgestattet mit einem größeren Anteil des Gesamt-Stakes, zurückzukehren. -### Angreifer, die >= 33 % des gesamten Stakes nutzen {#attackers-with-33-stake} +### Angreifer mit >= 33 % des gesamten Stakes {#attackers-with-33-stake} Alle in diesem Artikel erwähnten Angriffe werden wahrscheinlicher, wenn der Angreifer über mehr eingesetzte Ether verfügt, mit denen er abstimmen kann, und über mehr Validatoren, die ausgewählt werden können, um Blöcke in jedem Slot vorzuschlagen. Ein böswilliger Validator könnte dadurch versuchen, so viele eingesetzte Ether wie möglich zu kontrollieren. @@ -105,31 +108,31 @@ Alle in diesem Artikel erwähnten Angriffe werden wahrscheinlicher, wenn der Ang Der Zweck dieses Inactivity Leak ist es, dafür zu sorgen, dass die Kette wieder finalisiert werden kann. Jedoch verliert der Angreifer auch einen Teil seiner eingesetzten Ether. Anhaltende Inaktivität bei Validatoren, die 33 % der insgesamt eingesetzten Ether repräsentieren, ist sehr teuer, auch wenn die Validatoren nicht mit Slashing bestraft werden. -Unter der Annahme, dass das Ethereum-Netzwerk asynchron ist (d. h. es gibt Verzögerungen zwischen dem Senden und Empfangen von Nachrichten), könnte ein Angreifer, der 34 % des gesamten Stakes kontrolliert, eine doppelte Endgültigkeit herbeiführen. Der Grund dafür ist, dass der Angreifer, wenn er als Block-Producer ausgewählt wird, für Mehrdeutigkeit sorgen und dann doppelt mit all seinen Validatoren abstimmen kann. Das erzeugt eine Situation, in der eine Abspaltung in der Blockchain existiert, für die jeweils 34 % der eingesetzten Ether abstimmen. Für jede Abspaltung müssten nur 50 % der übrigen Validatoren stimmen, damit beide Abspaltungen von einer Supermajority unterstützt werden. In diesem Fall können beide Chains finalisiert werden (weil 34 % der Angreifervalidatoren + die Hälfte der verbleibenden 66 % = 67 % für jede Abspaltung). Die konkurrierenden Blöcke müssten jeweils von etwa 50 % der ehrlichen Validatoren empfangen werden, sodass dieser Angriff nur durchführbar ist, wenn der Angreifer ein gewisses Maß an Kontrolle über das Timing der über das Netzwerk propagierten Nachrichten hat, sodass er dafür sorgen kann, dass die Hälfte der ehrlichen Validatoren auf jede Chain gelangen. Der Angreifer würde zwangsläufig seinen gesamten Stake (34 % von ~10 Millionen Ether mit dem heutigen Validatoren-Set) zerstören, um diese doppelte Endgültigkeit zu erreichen, da 34 % seiner Validatoren gleichzeitig doppelt abstimmen würden – ein Vergehen, das mit Slashing und der maximalen Korrelationsstrafe geahndet wird. Die Verteidigung gegen diesen Angriff sind die sehr großen Kosten für das Zerstören von 34 % der insgesamt eingesetzten Ether. Um sich von diesem Angriff zu erholen, müsste sich die Ethereum-Community „außerhalb des Bands“ koordinieren und sich auf das Folgen einer Abspaltung einigen und die andere Abspaltung ignorieren. +Unter der Annahme, dass das Ethereum-Netzwerk asynchron ist (d. h. es gibt Verzögerungen zwischen dem Senden und Empfangen von Nachrichten), könnte ein Angreifer, der 34 % des gesamten Stakes kontrolliert, eine doppelte Finalität verursachen. Der Grund dafür ist, dass der Angreifer, wenn er als Block-Producer ausgewählt wird, für Mehrdeutigkeit sorgen und dann doppelt mit all seinen Validatoren abstimmen kann. Das erzeugt eine Situation, in der eine Abspaltung in der Blockchain existiert, für die jeweils 34 % der eingesetzten Ether abstimmen. Für jede Abspaltung müssten nur 50 % der übrigen Validatoren stimmen, damit beide Abspaltungen von einer Supermajority unterstützt werden. In diesem Fall können beide Chains finalisiert werden (weil 34 % der Angreifervalidatoren + die Hälfte der verbleibenden 66 % = 67 % für jede Abspaltung). Die konkurrierenden Blöcke müssten jeweils von etwa 50 % der ehrlichen Validatoren empfangen werden, sodass dieser Angriff nur durchführbar ist, wenn der Angreifer ein gewisses Maß an Kontrolle über das Timing der über das Netzwerk propagierten Nachrichten hat, sodass er dafür sorgen kann, dass die Hälfte der ehrlichen Validatoren auf jede Chain gelangen. Der Angreifer würde zwangsläufig seinen gesamten Stake (34 % von ~10 Millionen Ether mit dem heutigen Validatoren-Set) zerstören, um diese doppelte Endgültigkeit zu erreichen, da 34 % seiner Validatoren gleichzeitig doppelt abstimmen würden – ein Vergehen, das mit Slashing und der maximalen Korrelationsstrafe geahndet wird. Die Verteidigung gegen diesen Angriff sind die sehr großen Kosten für das Zerstören von 34 % der insgesamt eingesetzten Ether. Um sich von diesem Angriff zu erholen, müsste sich die Ethereum-Community „außerhalb des Bands“ koordinieren und sich auf das Folgen einer Abspaltung einigen und die andere Abspaltung ignorieren. -### Angreifer, die ~50 % des gesamten Stakes nutzen {#attackers-with-50-stake} +### Angreifer mit ~50 % des gesamten Stakes {#attackers-with-50-stake} Mit 50 % des eingesetzten Ethers könnte eine böswillige Gruppe von Validatoren die Chain theoretisch in zwei gleich große Abspaltungen aufteilen und dann einfach ihren gesamten Stake von 50 % einsetzen, um gegensätzlich zum ehrlichen Validatoren-Set abzustimmen, was die beiden Abspaltungen aufrechterhalten und die Endgültigkeit verhindern würde. Das Inactivity Leak auf beiden Abspaltungen würde letztendlich dazu führen, dass beide Chains finalisiert werden. An diesem Punkt bleibt als einzige Option ein Rückgriff auf die soziale Wiederherstellung. -Es ist sehr unwahrscheinlich, dass eine böswillige Gruppe von Validatoren durchgängig genau 50 % des Gesamt-Stakes kontrollieren könnte, da die Zahl der ehrlichen Validatoren und die Netzwerklatenz usw. stark schwanken. Die enormen Kosten eines solchen Angriffs in Verbindung mit der geringen Erfolgswahrscheinlichkeit sollten für rationale Angreifer eine starke Abschreckung darstellen; vor allem, da eine kleine zusätzliche Investition, um _mehr als_ 50 % zu erhalten, ihnen viel mehr Möglichkeiten eröffnet. +Es ist sehr unwahrscheinlich, dass eine feindliche Gruppe von Validatoren angesichts der Schwankungen bei der Anzahl ehrlicher Validatoren, der Netzwerklatenz usw. konstant genau 50 % des gesamten Stakes kontrollieren könnte. Die enormen Kosten für einen solchen Angriff in Verbindung mit der geringen Erfolgswahrscheinlichkeit scheinen für einen rationalen Angreifer ein starker Negativanreiz zu sein, insbesondere wenn eine kleine zusätzliche Investition, um _mehr als_ 50 % zu erhalten, viel mehr Macht freisetzt. -Bei >50 % des gesamten Stakes könnte der Angreifer den Abspaltungs-Wahl-Alogrithmus dominieren. In diesem Fall wäre der Angreifer in der Lage, mit der Mehrheit der Stimmen zu attestieren, was ihm genügend Kontrolle gibt, um kurze Neuorganisationen durchzuführen, ohne dass er ehrliche Clients täuschen muss. Die ehrlichen Validatoren würden es ihm gleichtun, da ihr Abspaltungs-Wahl-Algorithmus auch seine bevorzugte Chain als die schwerste ansehen würde, sodass die Chain finalisiert werden könnte. Dies ermöglicht es dem Angreifer, bestimmte Transaktionen zu zensieren, Kurzstrecken-Neuorganisationen vorzunehmen und die maximale Anzahl an MEV zu extrahieren, indem Blöcke nach Belieben neu angeordnet werden. Die Verteidigung dagegen sind die enormen Kosten eines Mehrheits-Stakes (derzeit knapp 19 Mrd. USD), die ein Angreifer aufs Spiel setzen würde, weil die Sozialebene wahrscheinlich eingreifen und eine ehrliche Minderheits-Abspaltung übernehmen würde, wodurch der Stake des Angreifers dramatisch abgewertet würde. +Mit >50 % des gesamten Stakes könnte der Angreifer den Fork-Choice-Algorithmus dominieren. In diesem Fall wäre der Angreifer in der Lage, mit der Mehrheit der Stimmen zu attestieren, was ihm genügend Kontrolle gibt, um kurze Neuorganisationen durchzuführen, ohne dass er ehrliche Clients täuschen muss. Die ehrlichen Validatoren würden es ihm gleichtun, da ihr Abspaltungs-Wahl-Algorithmus auch seine bevorzugte Chain als die schwerste ansehen würde, sodass die Chain finalisiert werden könnte. Dies ermöglicht es dem Angreifer, bestimmte Transaktionen zu zensieren, Kurzstrecken-Neuorganisationen vorzunehmen und die maximale Anzahl an MEV zu extrahieren, indem Blöcke nach Belieben neu angeordnet werden. Die Verteidigung dagegen sind die enormen Kosten eines Mehrheits-Stakes (derzeit knapp 19 Mrd. USD), die ein Angreifer aufs Spiel setzen würde, weil die Sozialebene wahrscheinlich eingreifen und eine ehrliche Minderheits-Abspaltung übernehmen würde, wodurch der Stake des Angreifers dramatisch abgewertet würde. -### Angreifer, die >= 66 % des gesamten Stakes nutzen {#attackers-with-66-stake} +### Angreifer mit >=66 % des gesamten Stakes {#attackers-with-66-stake} -Ein Angreifer, der 66 % oder mehr der insgesamt eingesetzten Ether besitzt, kann seine bevorzugte Chain finalisieren, ohne ehrliche Validatoren zu etwas zwingen zu müssen. Der Angreifer kann einfach für seine bevorzugte Chain abstimmen und sie dann finalisieren, schlichtweg weil er mit einer unehrlichen Supermajority abstimmen kann. Als Stakeholder mit Supermajority könnte der Angreifer immer die Inhalte der finalisierten Blöcke bestimmen. Er könnte nach Belieben Ausgaben tätigen, diese zurücknehmen und dann erneut tätigen, bestimmte Transaktionen zensieren oder die Chain neu organisieren. Wenn der Angreifer zusätzliche Ether kauft, sodass er 66 % statt 51 % des gesamten Stakes kontrolliert, erwirbt er im Endeffekt die Fähigkeit, rückwirkende Neuorganisationen und Endgültigkeitsumkehrungen durchzuführen (d. h. die Vergangenheit zu verändern und die Zukunft zu kontrollieren). Die einzige echte Verteidigung hier sind die enormen Kosten von 66 % des gesamten Ether-Stakes und die Option, auf die Sozialebene zurückzugreifen, wo sich die Übernahme einer alternativen Abspaltung koordinieren lässt. Wir können uns diesen Vorgang im nächsten Abschnitt detaillierter ansehen. +Ein Angreifer, der 66 % oder mehr der insgesamt eingesetzten Ether besitzt, kann seine bevorzugte Chain finalisieren, ohne ehrliche Validatoren zu etwas zwingen zu müssen. Der Angreifer kann einfach für seine bevorzugte Chain abstimmen und sie dann finalisieren, schlichtweg weil er mit einer unehrlichen Supermajority abstimmen kann. Als Stakeholder mit Supermajority könnte der Angreifer immer die Inhalte der finalisierten Blöcke bestimmen. Er könnte nach Belieben Ausgaben tätigen, diese zurücknehmen und dann erneut tätigen, bestimmte Transaktionen zensieren oder die Chain neu organisieren. Durch den Kauf zusätzlicher Ether, um 66 % statt 51 % zu kontrollieren, kauft sich der Angreifer effektiv die Fähigkeit, Ex-post-Reorgs und Finalitätsumkehrungen durchzuführen (d. h. die Vergangenheit zu ändern und die Zukunft zu kontrollieren). Die einzige echte Verteidigung hier sind die enormen Kosten von 66 % des gesamten Ether-Stakes und die Option, auf die Sozialebene zurückzugreifen, wo sich die Übernahme einer alternativen Abspaltung koordinieren lässt. Wir können uns diesen Vorgang im nächsten Abschnitt detaillierter ansehen. -## Menschen: die letzte Verteidigungslinie {#people-the-last-line-of-defense} +## Die Menschen: die letzte Verteidigungslinie {#people-the-last-line-of-defense} Wenn es unehrlichen Validatoren gelingt, ihre präferierte Version der Chain zu finalisieren, gerät die Ethereum-Community in eine schwierige Lage. Die kanonische Chain beinhaltet dann einen „unehrlichen“ Abschnitt, der in die Historie aufgenommen wurde, wohingegen ehrliche Validatoren dafür bestraft werden können, für eine alternative („ehrliche“) Chain abzustimmen. Dabei ist zu beachten, dass eine finalisierte, aber inkorrekte Chain auch das Ergebnis eines Fehlers im Mehrheits-Client sein könnte. Letztendlich ist es der ultimative Fallback, sich zur Lösung der Situation auf die Sozialebene – Layer 0 – zu verlassen. -Eine der Stärken des PoS-Konsens auf Ethereum ist es, dass es eine [Reihe von Verteidigungsstrategien](https://youtu.be/1m12zgJ42dI?t=1712) gibt, auf die die Community zurückgreifen kann, sollte es zu einem Angriff kommen. Eine minimale Reaktion könnte darin bestehen, die Validatoren der Angreifer zwangsweise aus dem Netzwerk zu entfernen, ohne zusätzliche Strafen zu verhängen. Um dem Netzwerk wieder beitreten zu können, müsste ein Angreifer Teil einer Aktivierungswarteschlange werden, mit der sichergestellt wird, dass das Validatoren-Set allmählich größer wird. So dauert es zum Beispiel etwa 200 Tage, bis genügend Validatoren hinzukommen, um die Menge an eingesetztem Ether zu verdoppeln. Dies bedeutet, dass die ehrlichen Validatoren im Grunde 200 Tage Zeit haben, bevor der Angreifer einen weiteren 51 %-Angriff starten kann. Jedoch könnte sich die Community auch dazu entscheiden, den Angreifer härter zu bestrafen. Das könnte durch den Widerruf vergangener Belohnungen oder das Zerstören eines Anteils (bis zu 100 %) ihres eingesetzten Kapitals geschehen. +Eine der Stärken des PoS-Konsens von Ethereum ist, dass es eine [Reihe von Verteidigungsstrategien](https://youtu.be/1m12zgJ42dI?t=1712) gibt, die die Community im Falle eines Angriffs anwenden kann. Eine minimale Reaktion könnte darin bestehen, die Validatoren der Angreifer zwangsweise aus dem Netzwerk zu entfernen, ohne zusätzliche Strafen zu verhängen. Um dem Netzwerk wieder beitreten zu können, müsste ein Angreifer Teil einer Aktivierungswarteschlange werden, mit der sichergestellt wird, dass das Validatoren-Set allmählich größer wird. So dauert es zum Beispiel etwa 200 Tage, bis genügend Validatoren hinzukommen, um die Menge an eingesetztem Ether zu verdoppeln. Dies bedeutet, dass die ehrlichen Validatoren im Grunde 200 Tage Zeit haben, bevor der Angreifer einen weiteren 51 %-Angriff starten kann. Jedoch könnte sich die Community auch dazu entscheiden, den Angreifer härter zu bestrafen. Das könnte durch den Widerruf vergangener Belohnungen oder das Zerstören eines Anteils (bis zu 100 %) ihres eingesetzten Kapitals geschehen. Unabhängig von der Strafe, die dem Angreifer auferlegt wird, muss die Community auch gemeinsam nicht nur entscheiden, ob die unehrliche Chain tatsächlich ungültig ist (obwohl es sich bei ihr um die vom Abspaltungs-Wahl-Algorithmus, der in den Ethereum-Client kodiert ist, bevorzugte handelt), sondern auch, dass die Community stattdessen auf der ehrlichen Chain aufbauen sollte. Ehrliche Validatoren könnten sich gemeinsam darauf einigen, auf einer von der Community akzeptierten Abspaltung der Ethereum-Blockchain aufzubauen, die beispielsweise vor Beginn des Angriffs von der kanonischen Chain abgezweigt wurde. Alternativ vereinbaren die Validatoren, die Validatoren der Angreifer zwangsweise zu entfernen. Ehrliche Validierer hätten einen Anreiz dafür, auf dieser Chain aufzubauen, weil sie die Strafen vermeiden würden, die ihnen auferlegt werden, weil sie die Chain des Angreifers (gerechtfertigterweise) nicht attestieren. Börsen, On-Ramps und Anwendungen, die auf Ethereum aufbauen, würden es vermutlich vorziehen, auf der ehrlichen Chain zu sein und würden den ehrlichen Validatoren auf die ehrliche Blockchain folgen. -Jedoch wäre dies eine große verwaltungstechnische Herausforderung. Einigen Benutzern und Validatoren würden durch die Umstellung auf die ehrliche Chain zweifellos Nachteile entstehen und Transaktionen in Blöcken, die nach dem Angriff validiert wurden, könnten möglicherweise rückgängig gemacht werden, was zu Störungen auf der Anwendungsebene führen würde. Außerdem untergräbt eine solche Umstellung ganz einfach die Ethik einiger Benutzer, die dazu neigen, zu glauben, dass „Code Gesetz ist“. Börsen und Anwendungen würden höchstwahrscheinlich Off-Chain-Aktionen mit On-Chain-Transaktionen verknüpft haben, was nun möglicherweise rückgängig gemacht werden würde. Dies würde eine Kaskade von Widerrufen und Revisionen in Gang setzen, die nur schwer auf faire Weise zunichtegemacht werden könnten, insbesondere dann, wenn unehrlich erzielte Gewinne durchmischt oder in DeFi oder andere Derivate mit sekundären Auswirkungen für ehrliche Nutzer eingezahlt worden wären. Zweifellos hätten einige Benutzer, vielleicht sogar institutionelle, bereits von der unehrlichen Chain profitiert, entweder durch arglistiges Verhalten oder durch Zufall, und könnten sich gegen eine Abspaltung stellen, um ihre Gewinne zu bewahren. Es gab bereits Aufrufe dazu, die Community-Antwort auf >51 %-Angriffe zu proben, sodass vernünftige, koordinierte Mitigationsmaßnahmen schnell ausgeführt werden können. Es gibt auf ethresear.ch [hier](https://ethresear.ch/t/timeliness-detectors-and-51-attack-recovery-in-blockchains/6925) und [hier](https://ethresear.ch/t/responding-to-51-attacks-in-casper-ffg/6363) und auf Twitter [hier](https://twitter.com/skylar_eth/status/1551798684727508992?s=20&t=oHZ1xv8QZdOgAXhxZKtHEw) einige nützliche Diskussionen von Vitalik. Das Ziel einer koordinierten sozialen Antwort sollte es sein, sehr zielgerichtet vorzugehen, den Angreifer spezifisch zu bestrafen sowie die Auswirkungen für andere Nutzer gering zu halten. +Jedoch wäre dies eine große verwaltungstechnische Herausforderung. Einigen Benutzern und Validatoren würden durch die Umstellung auf die ehrliche Chain zweifellos Nachteile entstehen und Transaktionen in Blöcken, die nach dem Angriff validiert wurden, könnten möglicherweise rückgängig gemacht werden, was zu Störungen auf der Anwendungsebene führen würde. Außerdem untergräbt eine solche Umstellung ganz einfach die Ethik einiger Benutzer, die dazu neigen, zu glauben, dass „Code Gesetz ist“. Börsen und Anwendungen werden höchstwahrscheinlich Offchain-Aktionen mit Onchain-Transaktionen verknüpft haben, die nun zurückgerollt werden könnten. Dies würde eine Kaskade von Rücknahmen und Revisionen auslösen, die nur schwer fair zu entwirren wären, insbesondere wenn unrechtmäßig erworbene Gewinne gemischt, in DeFi oder andere Derivate mit sekundären Effekten für ehrliche Nutzer eingezahlt wurden. Zweifellos hätten einige Benutzer, vielleicht sogar institutionelle, bereits von der unehrlichen Chain profitiert, entweder durch arglistiges Verhalten oder durch Zufall, und könnten sich gegen eine Abspaltung stellen, um ihre Gewinne zu bewahren. Es gab Aufrufe, die Reaktion der Community auf >51 %-Angriffe zu proben, damit eine sinnvolle, koordinierte Abhilfemaßnahme schnell durchgeführt werden kann. Es gibt einige nützliche Diskussionen von Vitalik auf ethresear.ch [hier](https://ethresear.ch/t/timeliness-detectors-and-51-attack-recovery-in-blockchains/6925) und [hier](https://ethresear.ch/t/responding-to-51-attacks-in-casper-ffg/6363) und auf Twitter [hier](https://twitter.com/skylar_eth/status/1551798684727508992?s=20&t=oHZ1xv8QZdOgAXhxZKtHEw). Das Ziel einer koordinierten sozialen Antwort sollte es sein, sehr zielgerichtet vorzugehen, den Angreifer spezifisch zu bestrafen sowie die Auswirkungen für andere Nutzer gering zu halten. -Die Verwaltung ist bereits ein kompliziertes Thema. Die Koordinierung einer Layer-0-Notfallantwort auf eine unehrlich finalisierende Chain wäre zweifellos eine Herausforderung für die Ethereum-Community. Jedoch [kam es bereits](/ethereum-forks/#dao-fork-summary) - [zweimal](/ethereum-forks/#tangerine-whistle) in der Geschichte Ethereums dazu. +Die Verwaltung ist bereits ein kompliziertes Thema. Die Bewältigung einer Layer-0-Notfallreaktion auf eine unehrliche finalisierende Chain wäre für die Ethereum-Community zweifellos eine Herausforderung, aber es [ist](/ethereum-forks/#dao-fork-summary) in der Geschichte von Ethereum bereits passiert – und zwar [zweimal](/ethereum-forks/#tangerine-whistle). Nichtsdestotrotz liegt eine gewisse Befriedigung in der Tatsache, dass der letzte Fallback in der realen Welt angesiedelt ist. Selbst mit dieser phänomenalen Technologie, die uns zur Verfügung steht, müssten sich die Menschen am Ende des Tages koordinieren und gemeinsam einen Ausweg suchen, sollte der schlimmste Fall eintreten. @@ -151,13 +154,13 @@ Insgesamt ist das Risiko eines erfolgreichen Angriffs trotz dieser potenziellen 34 %-, 51 %- oder 66 %-Angriffe würden wahrscheinlich eine soziale Koordination außerhalb des Bands erfordern, um mit ihnen fertig zu werden. Auch wenn dies für die Community wahrscheinlich schmerzhaft wäre, wirkt die Möglichkeit, dass die Community außerhalb des Bands reagiert, für Angreifer wie eine starke Abschreckung. Die soziale Ebene von Ethereum ist der ultimative Rückhalt – ein technisch erfolgreicher Angriff könnte immer noch aufgehalten werden, wenn sich die Community darauf einigt, eine ehrliche Abspaltung zu übernehmen. Es käme zu einem Wettlauf zwischen dem Angreifer und der Ethereum-Community. Die Milliarden von US-Dollar, die für einen 66 %-Angriff ausgegeben wurden, würden wahrscheinlich durch einen erfolgreichen Angriff auf Basis sozialer Koordinierung ausgelöscht, sollte dieser schnell genug durchgeführt werden. Dies würde dazu führen, dass der Angreifer mit schweren Taschen voller illiquider Ether auf einer bekanntermaßen unehrlichen Chain zurückbleibt, die von der Ethereum-Community ignoriert wird. Die Wahrscheinlichkeit, dass dies letztendlich für einen Angreifer profitabel ist, ist so gering, dass es eine wirksame Abschreckung darstellt. Aus diesem Grund sind Investitionen in die Aufrechterhaltung einer kohäsiven sozialen Ebene mit eng aufeinander abgestimmten Werten so wichtig. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Detailliertere Version dieser Seite](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) -- [Vitalik zur Abwicklungsendgültigkeit](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) -- [Artikel zu LMD GHOST](https://arxiv.org/abs/2003.03052) -- [Artikel zu Casper-FGG](https://arxiv.org/abs/1710.09437) -- [Artikel zu Gasper](https://arxiv.org/pdf/2003.03052.pdf) -- [Proposer-Gewicht erhöht Konsensspezifikationen](https://github.com/ethereum/consensus-specs/pull/2730) +- [Vitalik über Settlement-Finalität](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) +- [LMD-GHOST-Papier](https://arxiv.org/abs/2003.03052) +- [Casper-FFG-Artikel](https://arxiv.org/abs/1710.09437) +- [Casper-Artikel](https://arxiv.org/pdf/2003.03052.pdf) +- [Proposer-Weight-Boosting-Konsensspezifikationen](https://github.com/ethereum/consensus-specs/pull/2730) - [Bouncing-Angriffe auf ethresear.ch](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114) - [SSLE-Forschung](https://ethresear.ch/t/secret-non-single-leader-election/11789) diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attestations/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attestations/index.md index 432c145d4a3..dfb0614162f 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attestations/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/attestations/index.md @@ -8,35 +8,35 @@ Von einem Validator wird erwartet, dass er während jeder Epoche eine Attestieru ## Was ist eine Attestierung? {#what-is-an-attestation} -Jede [Epoche](/glossary/#epoch) (6,4 Minuten) schlägt ein Validator dem Netzwerk eine Attestierung vor. Die Attestierung ist für einen spezifischen Slot in der Epoche. Der Zweck der Attestierung besteht darin, für die Sichtweise des Validators auf die Chain zu abzustimmen, insbesondere in Bezug auf den letzten berechtigten Block und den ersten Block der aktuellen Epoche (bekannt als `Quell`- und `Ziel`-Checkpoints). Diese Informationen werden für alle teilnehmenden Validatoren kombiniert, was es dem Netzwerk ermöglicht, einen Konsens über den Status der Blockchain zu erzielen. +Jede [Epoche](/glossary/#epoch) (6,4 Minuten) schlägt ein Validator dem Netzwerk eine Attestierung vor. Die Attestierung ist für einen spezifischen Slot in der Epoche. Der Zweck der Attestierung besteht darin, für die Sichtweise des Validators auf die Chain abzustimmen, insbesondere den letzten gerechtfertigten Block und den ersten Block in der aktuellen Epoche (bekannt als `source`- und `target`-Checkpoints). Diese Informationen werden für alle teilnehmenden Validatoren kombiniert, was es dem Netzwerk ermöglicht, einen Konsens über den Status der Blockchain zu erzielen. Die Attestierung beinhaltet die folgenden Komponenten: -- `aggregation_bits`: eine Bitliste von Validatoren, deren Position dem Validatorenindex in ihrem Komitee entspricht; der Wert (0/1) indiziert, ob der Validator die `Daten` signiert hat (d. h. ob sie aktiv sind und mit dem Block-Proposer übereinstimmen) -- `Daten`: Details, die mit der Attestierung verbunden sind, wie unten definiert -- `Signatur`: eine BLS-Signatur, die die Signaturen individueller Validatoren zusammenfasst +- `aggregation_bits`: eine Bitliste von Validatoren, bei der die Position dem Validator-Index in ihrem Komitee entspricht; der Wert (0/1) gibt an, ob der Validator die `data` signiert hat (d. h. ob er aktiv ist und mit dem Block-Proposer übereinstimmt). +- `data`: Details zur Attestierung, wie unten definiert +- `signature`: eine BLS-Signatur, die die Signaturen einzelner Validatoren zusammenfasst -Die erste Aufgabe für einen attestierenden Validator ist der Aufbau der `Daten`. Die `Daten` beinhalten die folgenden Informationen: +Die erste Aufgabe für einen attestierenden Validator ist es, die `data` zu erstellen. Die `data` enthalten die folgenden Informationen: -- `Slot`: die Slot-Nummer, auf die sich die Attestierung bezieht -- `Index`: eine Nummer, die identifiziert, zu welchem Komitee der Validator in einem gegebenen Slot gehört -- `beacon_block_root`: Root Hash des Blocks, den der Validator an der Spitze der Chain sieht (als Resultat der Anwendung des Abspaltungs-Wahl-Algorithmus) -- `Quelle`: Teil der Endgültigkeitsabstimmung, der angibt, was die Validatoren als den letzten berechtigten Block ansehen -- `Ziel`: Teil der Endgültigkeitsabstimmung, der angibt, was die Validatoren als ersten Block in der derzeitigen Epoche ansehen +- `slot`: Die Slot-Nummer, auf die sich die Attestierung bezieht +- `index`: Eine Nummer, die angibt, zu welchem Komitee der Validator in einem bestimmten Slot gehört +- `beacon_block_root`: Root-Hash des Blocks, den der Validator an der Spitze der Chain sieht (das Ergebnis der Anwendung des Fork-Choice-Algorithmus) +- `source`: Teil der Abstimmung über die Endgültigkeit, der angibt, was die Validatoren als den letzten gerechtfertigten Block ansehen +- `target`: Teil der Abstimmung über die Endgültigkeit, der angibt, was die Validatoren als ersten Block in der aktuellen Epoche ansehen -Sobald die `Daten` erstellt wurden, kann der Validator das Bit in `aggregation_bits`, das seinem eigenen Validatorenindex entspricht, von 0 auf 1 umdrehen, um zu zeigen, dass er teilgenommen hat. +Sobald `data` erstellt ist, kann der Validator das Bit in `aggregation_bits`, das seinem eigenen Validator-Index entspricht, von 0 auf 1 umschalten, um zu zeigen, dass er teilgenommen hat. Schließlich kann der Validator die Attestierung signieren und an das Netzwerk übertragen. ### Aggregierte Attestierung {#aggregated-attestation} -Die Weiterleitung dieser Daten durch das Netzwerk für jeden Validator ist mit einem erheblichen Mehraufwand verbunden. Bevor es also zu einer groß angelegten Übertragung der Attestierungen der einzelnen Validatoren kommt, werden die Attestierungen in Subnetzen aggregiert. Dies umfasst das Aggregieren von Signaturen, sodass eine übertragene Attestierung die Konsens-`Daten` sowie eine einzelne Signatur enthält, die aus einer Kombination der Signaturen aller Validatoren gebildet wird, die mit diesen `Daten` übereinstimmen. Dies kann mit `aggregation_bits` überprüft werden, das den Index jedes Validators in seinem Komitee bereitstellt (dessen ID in `Daten` angegeben ist), was zur Abfrage einzelner Signaturen verwendet werden kann. +Die Weiterleitung dieser Daten durch das Netzwerk für jeden Validator ist mit einem erheblichen Mehraufwand verbunden. Bevor es also zu einer groß angelegten Übertragung der Attestierungen der einzelnen Validatoren kommt, werden die Attestierungen in Subnetzen aggregiert. Dies schließt das Zusammenfassen von Signaturen ein, sodass eine gesendete Attestierung die Konsens-`data` und eine einzelne Signatur enthält, die durch die Kombination der Signaturen aller Validatoren gebildet wird, die mit diesen `data` übereinstimmen. Dies kann mit `aggregation_bits` überprüft werden, da dies den Index jedes Validators in seinem Komitee bereitstellt (dessen ID in `data` angegeben ist), der zur Abfrage einzelner Signaturen verwendet werden kann. -In jeder Epoche werden 16 Validatoren in jedem Subnetz als `Aggregatoren` ausgewählt. Die Aggregatoren sammeln alle Attestierungen, von denen sie über das Gossip-Netzwerk erfahren und die über gleichwertige `Daten` wie ihre eigenen verfügen. Der Absender jeder passenden Attestierung wird in den `aggregation_bits` erfasst. Die Aggregatoren übertragen dann das Attestierungsaggregat an das gesamte Netzwerk. +In jeder Epoche werden 16 Validatoren in jedem Subnetz als `aggregators` ausgewählt. Die Aggregatoren sammeln alle Attestierungen, von denen sie über das Gossip-Netzwerk hören und die äquivalente `data` zu ihren eigenen haben. Der Absender jeder passenden Attestierung wird in den `aggregation_bits` erfasst. Die Aggregatoren übertragen dann das Attestierungsaggregat an das gesamte Netzwerk. Wenn ein Validator als Block-Proposer ausgewählt wird, bündelt er aggregierte Attestierungen aus den Subnetzen bis zum aktuellsten Slot im neuen Block. -### Lebenszyklus der Attestierungseinbeziehung {#attestation-inclusion-lifecycle} +### Lebenszyklus der Attestierungsaufnahme {#attestation-inclusion-lifecycle} 1. Generierung 2. Propagierung @@ -46,7 +46,7 @@ Wenn ein Validator als Block-Proposer ausgewählt wird, bündelt er aggregierte Der Attestierungslebenszyklus ist in dem nachstehenden Schema skizziert: -![Attestierungslebenszyklus](./attestation_schematic.png) +![Lebenszyklus einer Attestierung](./attestation_schematic.png) ## Belohnungen {#rewards} @@ -60,33 +60,33 @@ Das beste Szenario ist, wenn alle drei Flags wahr sind. In diesem Fall würde ei Die Flag-Attestierungsquote wird anhand der Summe der Effektivguthaben aller attestierenden Validatoren für die betreffende Flag im Vergleich zum gesamten aktiven Effektivguthaben gemessen. -### Basisbelohnung {#base-reward} +### Grundbelohnung {#base-reward} Die Basisbelohnung wird anhand der Anzahl der attestierenden Validatoren und ihrer effektiv eingesetzten Ether-Guthaben berechnet: -`base reward = validator effective balance x 2^6 / SQRT(Effective balance of all active validators)` +`Grundbelohnung = effektives Guthaben des Validators x 2^6 / SQRT(effektives Guthaben aller aktiven Validatoren)` -#### Einbeziehungsverzögerung {#inclusion-delay} +#### Aufnahmeverzögerung {#inclusion-delay} -Zu dem Zeitpunkt, als die Validatoren über die Spitze der Chain (`block n`) abstimmten, war `block n+1` noch nicht vorgeschlagen worden. Daher werden Attestierungen naturgemäß **einen Block später** aufgenommen, sodass alle Attestierungen, die für `block n` als Chain-Spitze gestimmt haben, in `block n+1` aufgenommen wurden; die **Einbeziehungsverzögerung** beträgt 1. Wenn sich die Einbeziehungsverzögerung auf zwei Slots verdoppelt, halbiert sich die Attestierungsbelohnung, da zur Berechnung der Attestierungsbelohnung die Basisbelohnung mit dem Kehrwert der Einbeziehungsverzögerung multipliziert wird. +Zu dem Zeitpunkt, als die Validatoren über den Head der Chain (`block n`) abstimmten, war `block n+1` noch nicht vorgeschlagen worden. Daher werden Attestierungen natürlich **einen Block später** aufgenommen, sodass alle Attestierungen, die für `block n` als Chain-Head gestimmt haben, in `block n+1` aufgenommen wurden und die **Aufnahmeverzögerung** 1 beträgt. Wenn sich die Einbeziehungsverzögerung auf zwei Slots verdoppelt, halbiert sich die Attestierungsbelohnung, da zur Berechnung der Attestierungsbelohnung die Basisbelohnung mit dem Kehrwert der Einbeziehungsverzögerung multipliziert wird. ### Attestierungsszenarien {#attestation-scenarios} -#### Fehlender Abstimmungsvalidator {#missing-voting-validator} +#### Fehlender abstimmender Validator {#missing-voting-validator} Die Validatoren haben maximal 1 Epoche Zeit, um ihre Attestierung einzureichen. Wenn die Attestierung in Epoche 0 versäumt wurde, können sie diese mit einer Einbeziehungsverzögerung in Epoche 1 nachreichen. #### Fehlender Aggregator {#missing-aggregator} -Insgesamt gibt es 16 Aggregatoren pro Epoche. Darüber hinaus abonnieren zufällige Validatoren **256 Epochen lang zwei Subnetze** und dienen als Backup, falls Aggregatoren fehlen. +Insgesamt gibt es 16 Aggregatoren pro Epoche. Zusätzlich abonnieren zufällige Validatoren **zwei Subnetze für 256 Epochen** und dienen als Backup, falls Aggregatoren fehlen. #### Fehlender Block-Proposer {#missing-block-proposer} -Beachten Sie, dass in einigen Fällen ein glücklicher Aggregator auch zum Block-Proposer werden kann. Wenn die Attestierung nicht miteinbezogen wurde, weil der Block-Proposer verloren gegangen ist, würde der nächste Block-Proposer die aggregierte Attestierung wiederaufnehmen und in den nächsten Block miteinbeziehen. Jedoch wird sich die **Einbeziehungsverzögerung** um den Faktor eins erhöhen. +Beachten Sie, dass in einigen Fällen ein glücklicher Aggregator auch zum Block-Proposer werden kann. Wenn die Attestierung nicht miteinbezogen wurde, weil der Block-Proposer verloren gegangen ist, würde der nächste Block-Proposer die aggregierte Attestierung wiederaufnehmen und in den nächsten Block miteinbeziehen. Allerdings erhöht sich die **Aufnahmeverzögerung** um eins. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Attestierungen in Vitaliks kommentierter Konsens-Spezifikation](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#attestationdata) - [Attestierungen in eth2book.info](https://eth2book.info/capella/part3/containers/dependencies/#attestationdata) -_Kennen Sie eine Community Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md index 43979ed0e91..57ce55665e2 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md @@ -8,9 +8,9 @@ Blöcke sind die grundlegenden Einheiten der Blockchain. Blöcke sind diskrete I ## Voraussetzungen {#prerequisites} -Block-Proposals sind Teil des Proof-of-Stake-Protokolls. Um diese Seite zu verstehen, empfehlen wir Ihnen, über [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) und die [Blockarchitektur](/developers/docs/blocks/) nachzulesen. +Block-Proposals sind Teil des Proof-of-Stake-Protokolls. Um diese Seite besser zu verstehen, empfehlen wir dir, die Artikel über [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) und [Blockarchitektur](/developers/docs/blocks/) zu lesen. -## Wer produziert Blöcke? {#who-produces-blocks} +## Wer produziert Blöcke? Wer produziert Blöcke? {#who-produces-blocks} Konten von Validatoren schlagen Blöcke vor. Die Konten von Validatoren werden von Node-Operatoren verwaltet, die Validatorensoftware als Teil ihrer Ausführungs- und Konsens-Clients betreiben und mindestens 32 ETH in den Einzahlungsvertrag transferiert haben. Allerdings ist jeder Validator nur gelegentlich für das Vorschlagen eines Blocks zuständig. Ethereum misst die Zeit in Slots und Epochen. Jeder Slot ist zwölf Sekunden lang und 32 Slots (6,4 Minuten) ergeben eine Epoche. Jeder Slot bietet eine Möglichkeit, Ethereum einen neuen Block hinzuzufügen. @@ -18,7 +18,7 @@ Konten von Validatoren schlagen Blöcke vor. Die Konten von Validatoren werden v Ein einzelner Validator wird pseudo-zufällig ausgewählt, einen Block in jedem Slot vorzuschlagen. So etwas wie echte Zufälligkeit gibt es nicht in einer Blockchain, denn wenn jeder Node echte Zufallszahlen generieren würde, könnten sie keinen Konsens erzielen. Das Ziel ist es vielmehr, den Validatoren-Auswahlprozess unvorhersehbar zu machen. Die Zufälligkeit wird bei Ethereum durch einen Algorithmus namens RANDAO erreicht, der einen Hash vom Block-Proposer mit einem Seed mischt, der bei jedem Block aktualisiert wird. Dieser Wert wird genutzt, um einen spezifischen Validator aus dem gesamten Validatoren-Set auszuwählen. Die Auswahl der Validatoren wird zwei Epochen im Voraus als Schutz vor bestimmten Arten der Seed-Manipulation festgelegt. -Obwohl die Validatoren in jedem Slot zu RANDAO beitragen, wird der globale RANDAO-Wert nur einmal pro Epoche aktualisiert. Zur Berechnung des Index des nächsten Block-Proposers wird der RANDAO-Wert mit der Slot-Zahl vermischt, um einen eindeutigen Wert für jeden Slot zu erhalten. Die Wahrscheinlichkeit, dass ein einzelner Validator ausgewählt wird, ist nicht einfach `1/N` (wobei `N` = Gesamtzahl der aktiven Validatoren). Stattdessen wird sie nach dem effektiven ETH-Guthaben eines jeden Validators gewichtet. Das maximale Effektivguthaben beträgt 32 ETH (dies bedeutet, dass `ein Guthaben von < 32 ETH` zu einer niedrigeren Gewichtung führt als `ein Guthaben von == 32 ETH`, `ein Guthaben von > 32 ETH` führt jedoch nicht zu einer höheren Gewichtung als `ein Guthaben von == 32 ETH`). +Obwohl die Validatoren in jedem Slot zu RANDAO beitragen, wird der globale RANDAO-Wert nur einmal pro Epoche aktualisiert. Zur Berechnung des Index des nächsten Block-Proposers wird der RANDAO-Wert mit der Slot-Zahl vermischt, um einen eindeutigen Wert für jeden Slot zu erhalten. Die Wahrscheinlichkeit, dass ein einzelner Validator ausgewählt wird, ist nicht einfach `1/N` (wobei `N` = Gesamtzahl der aktiven Validatoren). Stattdessen wird sie nach dem effektiven ETH-Guthaben eines jeden Validators gewichtet. Das maximale effektive Guthaben beträgt 32 ETH (das bedeutet, dass `balance < 32 ETH` zu einer niedrigeren Gewichtung führt als `balance == 32 ETH`, aber `balance > 32 ETH` nicht zu einer höheren Gewichtung als `balance == 32 ETH` führt). Nur ein Block-Proposer wird in jedem Slot ausgewählt. Unter normalen Bedigungen produziert und veröffentlicht ein einziger Block-Producer einen einzigen Block in ihrem dedizierten Slot. Das Erzeugen von zwei Blöcken für denselben Slot ist ein mit Slashing geahndetes Vergehen, das oft als „Äquivokation“ bezeichnet wird. @@ -42,28 +42,28 @@ class BeaconBlockBody(Container): execution_payload: ExecutionPayload ``` -Das `randao_reveal`-Feld nimmt einen verifizierbaren zufälligen Wert an, den der Block-Proposer erzeugt, indem er die derzeitige Epochennummer signiert. `eth1_data` ist eine Stimme für die Ansicht des Block-Proposers auf den Einzahlungsvertrag, einschließlich der Root des Einzahlungs-Merkle-Trees und der Gesamtzahl an Einzahlungen, die eine Verifizierung neuer Einzahlungen ermöglichen. `graffiti` ist ein optionales Feld, welches verwendet wird, um dem Block eine Nachricht hinzuzufügen. `proposer_slashings` und `attester_slashings` sind Felder, die Beweise dafür enthalten, dass bestimmte Validatoren nach der Auffassung des Proposers in der Chain Vergehen begangen haben, die mit Slashing bestraft werden können. `deposits` ist eine Liste neuer Validator-Einzahlungen, die dem Block-Proposer bekannt sind, und `voluntary_exits` ist eine Liste von Validatoren, die aussteigen möchten und von denen der Block-Proposer im Gossip-Netzwerk der Konsensebene gehört hat. `sync_aggregate` ist ein Vektor, der anzeigt, welche Validatoren zuvor einem Synchronisierungskomitee (eine Untergruppe von Validatoren, die leichte Daten des Clients liefern) zugewiesen waren und an der Signierung von Daten teilgenommen haben. +Das `randao_reveal`-Feld nimmt einen verifizierbaren Zufallswert an, den der Block-Proposer erzeugt, indem er die derzeitige Epochennummer signiert. `eth1_data` ist eine Stimme für die Ansicht des Block-Proposers auf den Einzahlungsvertrag, einschließlich der Root des Einzahlungs-Merkle-Trees und der Gesamtzahl an Einzahlungen, die eine Verifizierung neuer Einzahlungen ermöglichen. `graffiti` ist ein optionales Feld, welches verwendet wird, um dem Block eine Nachricht hinzuzufügen. `proposer_slashings` und `attester_slashings` sind Felder, die Beweise dafür enthalten, dass bestimmte Validatoren nach der Auffassung des Proposers in der Chain Vergehen begangen haben, die mit Slashing bestraft werden können. `deposits` ist eine Liste neuer Validator-Einzahlungen, die dem Block-Proposer bekannt sind, und `voluntary_exits` ist eine Liste von Validatoren, die aussteigen möchten und von denen der Block-Proposer im Gossip-Netzwerk der Konsensebene gehört hat. `sync_aggregate` ist ein Vektor, der anzeigt, welche Validatoren zuvor einem Synchronisierungskomitee (einer Untergruppe von Validatoren, die Daten für Light-Clients bereitstellen) zugewiesen waren und an der Signierung von Daten teilgenommen haben. -`execution_payload` ermöglicht die Weitergabe von Informationen über Transaktionen zwischen den Ausführungs- und Konsens-Clients. `execution_payload` ist ein Block mit Ausführungsdaten, der in einen Beacon Block eingebettet wird. Das Feld in `execution_payload` reflektiert die Blockstruktur, die im Yellowpaper für Ethereum aufgezeigt wird, mit dem Unterschied, dass es keine „Ommers“ gibt und `prev_randao` anstelle von `difficulty` existiert. Der Ausführungs-Client hat Zugriff auf einen lokalen Pool von Transaktionen, von denen es in seinem eigenen Gossip-Netzwerk gehört hat. Diese Transaktionen werden lokal ausgeführt, um einen aktualisierten Zustands-Trie zu generieren, der als „Post-State“ bezeichnet wird. Die Transaktionen sind in `execution_payload` als Liste, die `transactions` genannt wird, enthalten und der Post-State wird im Feld `state-root` zur Verfügung gestellt. +`execution_payload` ermöglicht die Weitergabe von Informationen über Transaktionen zwischen den Ausführungs- und Konsens-Clients. `execution_payload` ist ein Block mit Ausführungsdaten, der in einen Beacon-Block eingebettet wird. Die Felder im `execution_payload` spiegeln die im Ethereum Yellow Paper beschriebene Blockstruktur wider, mit der Ausnahme, dass es keine Ommer gibt und `prev_randao` anstelle von `difficulty` existiert. Der Ausführungs-Client hat Zugriff auf einen lokalen Pool von Transaktionen, von denen es in seinem eigenen Gossip-Netzwerk gehört hat. Diese Transaktionen werden lokal ausgeführt, um einen aktualisierten Zustands-Trie zu generieren, der als „Post-State“ bezeichnet wird. Die Transaktionen sind im `execution_payload` als eine Liste namens `transactions` enthalten, und der Post-State wird im Feld `state-root` bereitgestellt. All diese Daten werden in einem Beacon Block gesammelt, signiert und an die Peers von Block-Proposern übertragen, die sie an ihre Peers weitergeben usw. -Lesen Sie mehr zur [Anatomie von Blöcken](/developers/docs/blocks). +Lies mehr über die [Anatomie von Blöcken](/developers/docs/blocks/). ## Was passiert mit dem Block? {#what-happens-to-blocks} -Der Block wird zur lokalen Datenbank des Block-Proposers hinzugefügt und über das Gossip-Netzwerk der Konsensebene an die Peers übertragen. Wenn ein Validator den Block empfängt, überprüft er die darin enthaltenen Daten. Er verifiziert, dass der Block das richtige Parent hat, dem richtigen Slot zugeordnet ist, dass der Index des Proposers der erwartete ist, dass das RANDAO Reveal gültig ist und dass der Proposer nicht geslasht wird. `execution_payload` ist nicht gebündelt und der Ausführungs-Client des Validatoren führt die Transaktionen in der Liste wieder aus, um den vorgeschlagenen Zustandswechsel zu überprüfen. Vorausgesetzt, dass der Block all diese Prüfungen besteht, fügt jeder Validator den Block seiner eigenen kanonischen Chain hinzu. Der Prozess startet dann im nächsten Slot wieder von Neuem. +Der Block wird zur lokalen Datenbank des Block-Proposers hinzugefügt und über das Gossip-Netzwerk der Konsensebene an die Peers übertragen. Wenn ein Validator den Block empfängt, überprüft er die darin enthaltenen Daten. Er verifiziert, dass der Block das richtige Parent hat, dem richtigen Slot zugeordnet ist, dass der Index des Proposers der erwartete ist, dass das RANDAO Reveal gültig ist und dass der Proposer nicht geslasht wird. Der `execution_payload` ist entbündelt und der Ausführungs-Client des Validators führt die Transaktionen in der Liste erneut aus, um die vorgeschlagene Zustandsänderung zu überprüfen. Vorausgesetzt, dass der Block all diese Prüfungen besteht, fügt jeder Validator den Block seiner eigenen kanonischen Chain hinzu. Der Prozess startet dann im nächsten Slot wieder von Neuem. -## Blockbelohnungen {#block-rewards} +## Block-Belohnungen {#block-rewards} -Der Block-Proposer wird für seine Arbeit bezahlt. Ihm steht eine `base_reward` zu, die als eine Funktion aus der Anzahl der aktiven Validatoren und deren Effektivguthaben berechnet wird. Der Block-Proposer erhält dann einen Anteil der `base_reward` für jede gültige Attestierung, die in diesem Block enthalten ist; je mehr Validatoren den Block attestieren, desto größer fällt die Belohnung für den Block-Proposer aus. Es gibt auch eine Belohnung für das Melden von Validatoren, die mit Slashing bestraft werden sollten, in der Höhe von `1/512 * Effektivguthaben` für jeden mit Slashing sanktionierten Validator. +Der Block-Proposer wird für seine Arbeit bezahlt. Es gibt eine `base_reward`, die als Funktion der Anzahl der aktiven Validatoren und ihrer effektiven Guthaben berechnet wird. Der Block-Proposer erhält dann einen Bruchteil der `base_reward` für jede gültige Attestierung, die in dem Block enthalten ist; je mehr Validatoren den Block attestieren, desto größer ist die Belohnung des Block-Proposers. Es gibt auch eine Belohnung für das Melden von Validatoren, die geslasht werden sollten, in Höhe von `1/512 * effektives Guthaben` für jeden geslashten Validator. [Mehr zu Belohnungen und Strafen](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Einführung in Blöcke](/developers/docs/blocks/) -- [Einführung zu Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) -- [Konsensspezifikationen auf Ethereum](https://github.com/ethereum/consensus-specs) -- [Einführung zu Gasper](/developers/docs/consensus-mechanisms/pos/) -- [Ethereum-Upgrade](https://eth2book.info/) +- [Einführung in Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) +- [Ethereum-Konsens-Spezifikationen](https://github.com/ethereum/consensus-specs) +- [Einführung in Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) +- [Upgrade von Ethereum](https://eth2book.info/) diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/faqs/index.md index be478898199..2acc4bfddca 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/faqs/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/faqs/index.md @@ -4,7 +4,7 @@ description: Häufig gestellte Fragen zu Proof-of-Stake-Ethereum. lang: de --- -## Was ist Proof-of-Stake? {#what-is-proof-of-stake} +## Was ist Proof-of-Stake {#what-is-proof-of-stake} Proof-of-Stake beschreibt eine Klasse von Algorithmen, die für die Sicherheit von Blockchains sorgen können, indem sie sicherstellen, dass Assets von Angreifern, die unehrlich handeln, verloren gehen. Für Proof-of-Stake-Systeme ist ein Validatoren-Set erforderlich, um Assets verfügbar zu machen, die zerstört werden können, sollte ein Validator ein nachweislich unehrliches Verhalten an den Tag legen. Ethereum nutzt einen Proof-of-Stake-Mechanismus zur Sicherung der Blockchain. @@ -18,7 +18,7 @@ Proof-of-Stake erfordert Nodes, bekannt als Validatoren, die ein Krypto-Asset ei Proof-of-Work ist sehr viel energieaufwendiger, da Elektrizität im Mining-Prozess verbraucht wird. Für Proof-of-Stake wird hingegen nur eine sehr kleine Mengen an Energie benötigt – Ethereum-Validatoren können sogar auf Geräten mit geringem Energiebedarf wie etwa einem Raspberry Pi ausgeführt werden. Es wird davon ausgegangen, dass Ethereums Proof-of-Stake-Mechanismus sicherer ist als der Proof-of-Work-Mechanismus, da die Kosten für einen Angriff höher und die Konsequenzen für einen Angreifer schwerwiegender sind. -Proof-of-Work versus Proof-of-Stake ist ein umstrittenes Thema. [Vitalik Buterins Blog](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work) und die Debatte zwischen Justin Drake und Lyn Alden geben einen guten Überblick über die Argumente. +Proof-of-Work versus Proof-of-Stake ist ein umstrittenes Thema. [Vitalik Buterins Blog](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work) und die Debatte zwischen Justin Drake und Lyn Alden geben eine gute Zusammenfassung der Argumente. @@ -26,27 +26,27 @@ Proof-of-Work versus Proof-of-Stake ist ein umstrittenes Thema. [Vitalik Buterin Ja. Nodes auf dem Proof-of-Stake-Netzwerk nutzen sehr geringe Mengen an Energie. Eine Studie Dritter kam zu dem Schluss, dass Ethereums gesamtes Proof-of-Stake-Netzwerk ungefähr 0,0026 TWh/Jahr verbraucht – ungefähr 13.000-mal weniger Energie, als allein in den USA jedes für Gaming aufgebraucht wird. -[ Mehr zum Energieverbrauch von Ethereum](/energy-consumption/). +[Mehr über den Energieverbrauch von Ethereum](/energy-consumption/). ## Ist Proof-of-Stake sicher? {#is-pos-secure} Ethereums Proof-of-Stake ist sehr sicher. Der Mechanismus wurde acht Jahre lang erforscht, entwickelt und rigoros getestet, bevor er in Betrieb genommen wurde. Die Sicherheitsversprechen unterscheiden sich von Proof-of-Work-Blockchains. Bei Proof-of-Stake können böswillige Validatoren aktiv bestraft („geslasht“) werden und aus dem Validatoren-Set ausgeschlossen werden. Das kostet eine erhebliche Menge an ETH. Unter Proof-of-Work kann ein böswilliger Akteur seinen Angriff immer wieder ausführen, solange er über die erforderliche Hash-Leistung verfügt. Außerdem ist es im Vergleich zu Proof-of-Work-Ethereum kostspieliger, gleichwertige Angriffe auf Proof-of-Stake-Ethereum durchzuführen. Um die Liveness der Chain zu beeinflussen, sind mindestens 33 % der insgesamt eingesetzten Ether im Netzwerk erforderlich (außer in Fällen sehr ausgeklügelter Angriffe mit extrem geringer Erfolgswahrscheinlichkeit). Um die Inhalte zukünftiger Blocks zu kontrollieren, werden mindestens 51 % der insgesamt eingesetzten ETH benötigt, und um die Historie zu verändern, sind mindestens 66 % der insgesamt eingesetzten ETH erforderlich. Das Ethereum-Protokoll würde diese Assetss in den Angriffsszenarien mit 33 % oder 51 % und durch sozialen Konsens im Angriffsszenario mit 66 % zerstören. -- [Weitere Informationen zur Absicherung von Ethereum durch Proof-of-Stake gegen Angreifer](/developers/docs/consensus-mechanisms/pos/attack-and-defense) -- [Weitere Informationen zum Aufbau von Proof-of-Stake](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) +- [Mehr über die Verteidigung von Ethereum Proof-of-Stake gegen Angreifer](/developers/docs/consensus-mechanisms/pos/attack-and-defense) +- [Mehr zum Proof-of-Stake-Design](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) ## Macht Proof-of-Stake Ethereum günstiger? {#does-pos-make-ethereum-cheaper} Nein. Die Kosten für das Versenden einer Transaktion (Gasgebühren) werden von einem dynamischen Gebührenmarkt bestimmt. Sie erhöhen sich bei steigender Netzwerknachfrage. Der Konsensmechanismus beeinflusst dies nicht direkt. -[Mehr zu Gas](/developers/docs/gas). +[Mehr über Gas](/developers/docs/gas). ## Was sind Nodes, Clients und Validatoren? {#what-are-nodes-clients-and-validators} Nodes sind Computer, die mit dem Ethereum-Netzwerk verbunden sind. Clients sind die Software, die von ihnen ausgeführt wird und die den Computer in einen Node verwandelt. Es gibt zwei Arten von Clients: Ausführungs-Clients und Konsens-Clients. Es bedarf beider, um einen Node zu erstellen. Ein Validator ist eine optionale Erweiterung zu einem Konsens-Client, der es dem Node ermöglicht, am Proof-of-Stake-Konsens teilzunehmen. Das bedeutet, dass er Blöcke erstellen und vorschlagen kann, wenn er ausgewählt wird, und dass er Blöcke, von denen er im Netzwerk erfährt, attestieren kann. Um einen Validator zu betreiben, muss ein Operator eines Nodes 32 ETH in den Einzahlungsvertrag trasferieren. -- [Mehr zu Nodes und Clients](/developers/docs/nodes-and-clients) -- [Mehr zum Staking](/staking) +- [Mehr über Nodes und Clients](/developers/docs/nodes-and-clients) +- [Mehr über das Staking](/staking) ## Ist Proof-of-Stake eine neue Idee? {#is-pos-new} @@ -60,13 +60,13 @@ Zusätzlich zu Casper nutzt Ethereums Proof-of-Stake einen Abspaltungs-Wahl-Algo Die Kombination von Casper und LMD_Ghost ist als Gasper bekannt. -[Mehr zu Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) +[Mehr über Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) ## Was ist Slashing? {#what-is-slashing} Slashing ist der gegebene Begriff für das Zerstören einiger Teile des Stakes (des Einsatzes) der Validatoren und das Entfernen des Validator aus dem Netzwerk. Die Menge an ETH, die beim Slashing verloren geht, skaliert mit der Anzahl der Validatoren, die geslasht werden – das heißt, dass illegal zusammenarbeitende Validatoren schwerer bestraft werden als einzeln Handelnde. -[Mehr zu Slashing](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties#slashing) +[Mehr über Slashing](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties#slashing) ## Warum benötigen Validatoren 32 ETH? {#why-32-eth} @@ -76,32 +76,32 @@ Validatoren müssen ETH einsetzen, damit sie etwas zu verlieren haben, sollten s Ein einzelner Validator wird pseudo-zufällig ausgewählt, um in jedem Slot einen Block vorzuschlagen. Der dabei verwendete Algorithmus nennt sich RANDAO und mischt einen Hash vom Block-Proposer mit einem Seed, der für jeden Block aktualisiert wird. Dieser Wert wird genutzt, um einen spezifischen Validator aus dem gesamten Validatoren-Set auszuwählen. Die Auswahl des Validators wird zwei Epochen im Voraus festgelegt. -[Mehr zur Auswahl von Validatoren](/developers/docs/consensus-mechanisms/pos/block-proposal) +[Mehr über die Validator-Auswahl](/developers/docs/consensus-mechanisms/pos/block-proposal) ## Was ist Stake Grinding? {#what-is-stake-grinding} Stake Grinding beschreibt eine Kategorie von Angriffen auf Proof-of-Stake-Netzwerke, bei denen der Angreifer versucht, den Auswahlalgorithmus für Validatoren zu Gunsten seiner eigenen Validatoren zu beeinflussen. Für diese Angriffe auf RANDAO ist ungefähr die Hälfte der insgesamt eingesetzten ETH erforderlich. -[Mehr zu Stake Grinding](https://eth2book.info/altair/part2/building_blocks/randomness/#randao-biasability) +[Mehr über Stake Grinding](https://eth2book.info/altair/part2/building_blocks/randomness/#randao-biasability) ## Was ist soziales Slashing? {#what-is-social-slashing} Soziales Slashing beschreibt die Fähigkeit der Community, als Antwort auf einen Angriff eine Abspaltung der Blockchain zu bewirken. Es ermöglicht der Community, sich von einem Angriff, bei dem eine unehrliche Chain finalisiert wurde, zu erholen. Soziales Slashing kann auch als Verteidigung gegen Zensurangriffe zur Anwendung kommen. -- [Mehr zum sozialen Slashing](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) -- [Vitalik Buterin zum sozialen Slashing](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [Mehr über Social Slashing](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) +- [Vitalik Buterin über Social Slashing](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) ## Werde ich geslasht? {#will-i-get-slashed} Als Validator ist es sehr schwierig, geslasht zu werden, außer Sie verhalten sich absichtlich auf bösartige Weise. Slashing wird nur in sehr spezifischen Szenarios implementiert, bei denen Validatoren mehrere Blöcke für denselben Slot vorschlagen oder sich bei ihren Attestierungen widersprechen. Es ist sehr unwahrscheinlich, dass diese Fälle zufällig auftreten. -[Mehr zu den Bedingungen für Slashing](https://eth2book.info/altair/part2/incentives/slashing) +[Mehr über Slashing-Bedingungen](https://eth2book.info/altair/part2/incentives/slashing) ## Was ist das „Nothing-at-Stake“-Problem? {#what-is-nothing-at-stake-problem} Das Nothing-at-Stake(„nichts zu verlieren“)-Problem ist ein konzeptionelles Problem mit einigen Proof-of-Stake-Mechanismen, bei denen es nur Belohnungen und keine Bestrafungen gibt. Wenn es nichts zu verlieren gibt, ist ein pragmatischer Validierer auch gerne bereit, jede oder sogar mehrere Abspaltungen der Blockchain zu attestieren, da die seine Belohnungen vermehrt. Ethereum umgeht dies, indem es Endgültigkeitsbedingungen und Slashing nutzt, um sicherzugehen, dass es eine kanonische Chain gibt. -[Mehr zum Nothing-at-Stake-Problem](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) +[Mehr über das „Nothing-at-Stake“-Problem](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) ## Was ist ein Abspaltungs-Wahl-Algorithmus? {#what-is-a-fork-choice-algorithm} @@ -109,37 +109,37 @@ Ein Abspaltungs-Wahl-Algorithmus implementiert Regeln, mit denen festgelegt wird Ethereums Abspaltungs-Wahl-Algorithmus heißt LMD-GHOST. Es wählt die Abspaltung mit dem größten Gewicht an Attestierungen, d. h. die Abspaltung, für die die meisten eingesetzten ETH gestimmt haben. -[Mehr zu LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper/#fork-choice) +[Mehr über LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper/#fork-choice) ## Was ist Endgültigkeit bei Proof-of-Stake? {#what-is-finality} Endgültigkeit bei Proof-of-Stake ist die Garantie, dass ein gegebener Block ein permanenter Teil der kanonischen Chain ist und nicht rückgängig gemacht werden kann, außer es kommt zu einem Konsensversagen, bei dem ein Angreifer 33 % der insgesamt eingesetzten Ether verbrennt. Das ist „krypto-ökonomische“ Endgültigkeit, im Gegensatz zur „probabilistischer Endgültigkeit“, die für Proof-of-Work-Blockchains relevant ist. Bei der probabilistischen Endgültigkeit gibt es keine expliziten finalisierten oder nicht finalisierten Zustände für die Blöcke – es wird lediglich immer weniger wahrscheinlich, dass ein Block aus der Chain entfernt werden könnte, je älter er wird. Außerdem bestimmen die Benutzer für sich selbst, wann sie überzeugt genug sind, dass ein Block „sicher“ ist. Bei krypto-ökonomischer Endgültigkeit müssen Paare von Checkpoint-Blöcken von 66 % der eingesetzten Ether gewählt werden. Wenn diese Bedingung erfüllt ist, werden Blöcke zwischen diesen Checkpoints explizit „finalisiert“. -[Mehr zur Endgültigkeit](/developers/docs/consensus-mechanisms/pos/#finality) +[Mehr über Finalität](/developers/docs/consensus-mechanisms/pos/#finality) ## Was ist „schwache Subjektivität“? {#what-is-weak-subjectivity} Schwache Subjektivität ist eine Funktion des Proof-of-Stake-Netzwerks, bei der soziale Informationen genutzt werden, um den derzeitigen Zustand der Blockchain zu bestätigen. Neuen Nodes oder Nodes, die das Netzwerk wieder betreten, nachdem sie für eine längere Zeit offline waren, kann ein aktueller Zustand gegeben werden. Auf diese Weise kann der Node direkt sehen, ob er sich auf der korrekten Chain befindet. Diese Zustände sind bekannt als „Checkpoints von schwacher Subjektivität“ und sie können von anderen Node-Operatoren außerhalb des Bands, von Block-Explorern oder von mehreren öffentliche Endpunkten erhalten werden. -[Mehr zu schwacher Subjektivität](/developers/docs/consensus-mechanisms/pos/weak-subjectivity) +[Mehr über Weak Subjectivity](/developers/docs/consensus-mechanisms/pos/weak-subjectivity) ## Ist Proof-of-Stake zensurresistent? {#is-pos-censorship-resistant} Zensurresistenz ist im Moment schwer zu beweisen. Jedoch bietet Proof-of-Stake anders als Proof-of-Work die Option, Slashings zu koordinieren, sodass zensierende Validatoren bestraft werden können. Es stehen Änderungen an den Protokollen an, die Blockersteller von Block-Proposern trennen und Listen von Transaktionen einführen, die Ersteller in jeden Block mit aufnehmen müssen. Dieser Vorschlag wird als „richtige-Ersteller-Separierung“ bezeichnet und hilft dabei, Validatoren daran zu hindern, Transaktionen zu zensieren. -[Mehr zur Proposer-Ersteller-Separierung](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Original-basic-scheme) +[Mehr über die Proposer-Builder-Separation](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Original-basic-scheme) ## Ist Ethereums Proof-of-Stake-System anfällig für einen 51 %-Angriff? {#pos-51-attack} Ja. Proof-of-Stake ist genauso wie Proof-of-Work anfällig für 51 %-Angriffe. Anstatt 51 % der Hash-Leistung eines Netzwerks benötigt ein Angreifer 51 % der insgesamt eingesetzten ETH. Ein Angreifer, der 51 % des gesamten Stakes ansammelt, erhält die Kontrolle über den Abspaltungs-Wahl-Algorithmus. Dies ermöglicht es dem Angreifer, bestimmte Transaktionen zu zensieren, Kurzstrecken-Neuorganisationen durchzuführen und MEV zu extrahieren, indem er Blöcke zu seinen Gunsten neu anordnet. -[Mehr zu Angriffen auf Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/attack-and-defense) +[Mehr über Angriffe auf Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/attack-and-defense) ## Was ist soziale Koordination und warum wird sie benötigt? {#what-is-social-coordination} Soziale Koordination ist die letzte Verteidigungslinie auf Ethereum, mit der es möglich wäre, eine ehrliche Chain wiederherzustellen, die einem Angriff zum Opfer gefallen ist, bei dem unehrliche Blöcke finalisiert wurden. In diesem Fall müsste sich die Ethereum-Community „außerhalb des Bands“ koordinieren und sich darauf einigen, eine ehrliche Minderheitsabspaltung zu nutzen und dabei die Validatoren des Angreifers mit Slashing zu bestrafen. Dies würde voraussetzen, dass auch Anwendungen und Börsen die ehrliche Abspaltung anerkennen. -[Lesen Sie mehr zu sozialer Koordination](/developers/docs/consensus-mechanisms/pos/attack-and-defense#people-the-last-line-of-defense) +[Mehr über soziale Koordination lesen](/developers/docs/consensus-mechanisms/pos/attack-and-defense#people-the-last-line-of-defense) ## Werden die Reichen durch Proof-of-Stake noch reicher? {#do-rich-get-richer} @@ -147,9 +147,9 @@ Je mehr ETH jemand einsetzt, desto mehr Validatoren kann derjenige betreiben und ## Ist Proof-of-Stake zentralisierter als Proof-of-Work? {#is-pos-decentralized} -Nein, Proof-of-Work tendiert stärker zur Zentralisierung, weil die Mining-Kosten steigen und Einzelpersonen und dann kleine Unternehmen verdrängen, und so weiter. Das derzeitige Problem mit Proof-of-Stake ist der Einfluss von Liquid Staking Derivatives (LSDs). Dabei handelt es sich um Token, die ETH repräsentieren und von einem Anbieter eingesetzt wurden. Diese können von jeder Person auf Sekundärmärkten getauscht werden, ohne dass die eigentlichen ETH entwertet werden. LSDs erlauben es Nutzern, weniger als 32 ETH einzusetzen. Sie erzeugen jedoch auch ein Zentralisierungsrisiko, bei dem einige wenige große Organisationen einen Großteil des Stakes kontrollieren. Aus diesem Grund ist [Solo-Staking](/staking/solo) die beste Option für Ethereum. +Nein, Proof-of-Work tendiert stärker zur Zentralisierung, weil die Mining-Kosten steigen und Einzelpersonen und dann kleine Unternehmen verdrängen, und so weiter. Das derzeitige Problem mit Proof-of-Stake ist der Einfluss von Liquid Staking Derivatives (LSDs). Dabei handelt es sich um Token, die ETH repräsentieren und von einem Anbieter eingesetzt wurden. Diese können von jeder Person auf Sekundärmärkten getauscht werden, ohne dass die eigentlichen ETH entwertet werden. LSDs erlauben es Nutzern, weniger als 32 ETH einzusetzen. Sie erzeugen jedoch auch ein Zentralisierungsrisiko, bei dem einige wenige große Organisationen einen Großteil des Stakes kontrollieren. Deshalb ist [Solo-Staking](/staking/solo) die beste Option für Ethereum. -[Mehr zur Stake-Zentralisierung in LSDs](https://notes.ethereum.org/@djrtwo/risks-of-lsd) +[Mehr zur Zentralisierung von Stakes in LSDs](https://notes.ethereum.org/@djrtwo/risks-of-lsd) ## Warum kann ich nur ETH einsetzen? {#why-can-i-only-stake-eth} @@ -163,10 +163,10 @@ Nein, es gibt mehrere Proof-of-Stake-Blockchains. Keiner ist identisch mit Ether The Merge war der Moment, als für Ethereum der auf Proof-of-Work basierende Konsensmechanismus abgeschaltet und der auf Proof-of-Stake basierende Konsensmechanismus eingeschaltet wurde. The Merge wurde am 15. September 2022 durchgeführt. -[Mehr zum Zusammenschluss](/roadmap/merge) +[Mehr über The Merge](/roadmap/merge) ## Was sind Liveness und Sicherheit? {#what-are-liveness-and-safety} Liveness und Sicherheit sind die beiden fundamentalen Sicherheitsbedenken einer Blockchain. Liveness ist die Verfügbarkeit einer finalisierenden Chain. Wenn die Chain aufhört, sich zu finalisieren, oder Benutzer nicht mehr einfach auf sie zugreifen können, heißt das Livesness-Versagen. Extrem hohe Zugangskosten könnten auch als Livesness-Versagen bezeichnet werden. Die Sicherheit beschreibt, wie schwer es ist, die Chain anzugreifen – d.h. widersprüchliche Checkpoints zu finalisieren. -[Lesen sie mehr dazu im Casper-Artikel](https://arxiv.org/pdf/1710.09437.pdf) +[Lesen Sie mehr im Casper-Paper](https://arxiv.org/pdf/1710.09437.pdf) diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/gasper/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/gasper/index.md index 08aa993330d..ea807aaaf08 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/gasper/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/gasper/index.md @@ -23,7 +23,7 @@ Die Endgültigkeit ist eine Eigenschaft bestimmter Blöcke. Sie bedeutet, dass s 1. Zwei Drittel des insgesamt eingesetzten Ethers müssen für die Einbeziehung dieses Blocks in die kanonische Chain gestimmt haben. Diese Bedingung aktualisiert den Block auf „berechtigt“. Es ist unwahrscheinlich, dass berechtigte Blöcke rückgängig gemacht werden. Das ist aber unter bestimmten Bedingungen möglich. 2. Wenn neben einem berechtigten Block noch ein anderer Block berechtigt ist, wird er auf „finalisiert“ aktualisiert. Die Finalisierung eines Blocks ist dahingehend ein Commitment, den Block in die kanonische Chain aufzunehmen. Sie kann nicht rückgängig gemacht werden, es sei denn, ein Angreifer zerstört Millionen Ether (Milliarden von $USD). -Diese Block-Upgrades werden nicht in jedem Slot vorgenommen. Stattdessen können nur epochal begrenzte Blöcke berechtigt und finalisiert werden. Diese Blöcke werden als „Checkpoints“ bezeichnet. Die Aktualisierung berücksichtigt Paare von Checkpoints. Eine „Supermajority-Verbindung“ muss zwischen zwei aufeinander folgenden Checkpoints existieren (z. B. zwei Drittel der insgesamt eingesetzten Ether stimmen dafür ab, dass Checkpoint B der richtige Nachfahr von Checkpoint A ist), damit der weniger aktuelle Checkpoint auf „Finalisiert“ und der neuere Block auf „Berechtigt“ aktualisiert werden kann. +Diese Block-Upgrades werden nicht in jedem Slot vorgenommen. Stattdessen können nur epochal begrenzte Blöcke berechtigt und finalisiert werden. Diese Blöcke werden als „Checkpoints“ bezeichnet. Die Aktualisierung berücksichtigt Paare von Checkpoints. Ein "Supermajority-Link" muss zwischen zwei aufeinanderfolgenden Checkpoints bestehen (d. h. zwei Drittel des gesamten gestaketen Ethers stimmen dafür, dass Checkpoint B der korrekte Nachkomme von Checkpoint A ist), um den weniger aktuellen Checkpoint auf "finalisiert" und den neueren Block auf "berechtigt" zu aktualisieren. Da für die Endgültigkeit eine 2/3 Mehrheit erforderlich ist, die sich einig ist, dass ein Block kanonisch ist, kann ein Angreifer niemals eine alternative finalisierte Chain erstellen, ohne: @@ -36,17 +36,17 @@ Die erste Bedingung kommt dadurch auf, dass mindestens 2/3 des eingesetzten Ethe Validatoren werden für das ehrliche Vorschlagen und Validieren von Blöcken belohnt. Sie erhalten Ether als Belohnung, die zu ihrem Stake hinzugefügt werden. Andererseits entgehen den Validatoren, die abwesend sind und nicht handeln, wenn sie dazu aufgefordert werden, diese Belohnungen und sie verlieren manchmal einen kleinen Teil ihres bestehenden Stakes. Jedoch sind die Strafen dafür, offline zu bleiben, gering und belaufen sich in den meisten Fällen auf die Opportunitätskosten für die Belohnungen, die den Benutzern entgehen. Es gibt aber auch einige von Validatoren ausgeführte Aktionen, die sehr schwer versehentlich durchzuführen sind und auf eine böswillige Absicht hindeuten. Dazu gehört etwa, wenn mehrere Blöcke für denselben Slot vorgeschlagen werden, mehrere Blöcke für denselben Slot attestiert werden oder früheren Checkpoint-Stimmen wiedersprochen wird. Das sind Verhaltensweisen, die mit Slashing und damit etwas härter bestraft werden könen – das Slashing führt dazu, dass ein Teil des Stakes eines Validatoren zerstört wird und er vom Validatorennetzwerk entfernt wird. Dieser Prozess dauert 36 Tage. An Tag 1 wird eine Anfangsstrafe von bis zu 1 ETH erhoben. Dann geht die Anzahl der Ether des mit Slashing sanktionierten Validatoren über den gesamten Zeitraum des Ausstiegs langsam zurück. An Tag 18 erhalten sie allerdings eine „Korrelationsstrafe“, die größer ist, wenn mehrere Validatoren zur gleichen Zeit mit Slashing bestraft werden. Die Maximalstrafe ist der gesamte Stake. Diese Belohnungen und Bestrafungen sind als Anreiz für ehrliche Validatoren und als Abschreckung vor Angriffen auf das Netzwerk konzipiert. -### Inactivity Leak {#inactivity-leak} +### Inaktivitäts-Leck {#inactivity-leak} Zusätzlich zur Sicherheit bietet Gasper auch „plausible Liveness“. Dies beschreibt den Zustand, dass die Chain unabhängig von anderen Aktivitäten (wie Angriffen, Latenzproblemen oder Slashings) finalisiert werden kann, solange zwei Drittel der insgesamt eingesetzten Ether ehrlich und gemäß dem Protokoll abstimmen. Um es anders auszudrücken: Ein Drittel der gesamten eingesetzten Ether müssen auf irgendeine Weise kompromittiert sein, damit die Chain nicht finalisiert. In Gasper gibt es eine zusätzliche Verteidigungslinie gegen ein Versagen der Liveness, bekannt als „Inactivity Leak“. Dieser Mechanismus tritt in Kraft, wenn die Chain mehr als vier Epochen lang nicht finalisiert werde konnte. Den Validatoren, die nicht aktiv für die Mehrheits-Chan attestieren, wird ihr allmählich Stake entzogen, bis die Mehrheit wieder über zwei Drittel des gesamten Stakes verfügt. Auf diese Weise wird sichergestellt, dass ein Liveness-Vesagen nur vorübergehend ist. -### Abspaltung-Wahl {#fork-choice} +### Fork-Auswahl {#fork-choice} -Die ursprüngliche Definition von Casper-FFG enthielt einen Abspaltungs-Wahl-Algorithmus, der die folgende Regel auferlegte: `Folge der Chain, die den berechtigten Checkpoint mit der größten Höhe` enthält, wobei die Höhe als der größte Abstand zum Genesis-Block definiert ist. In Gasper wird die ursprüngliche Regel für die Wahl der Abspaltung zugunsten eines ausgefeilteren Algorithmus namens LMD-GHOST ersetzt. Es ist wichtig, zu erkennen, dass unter normalen Bedingungen eine Regel für die Wahl der Abspaltung unnötig ist – es gibt einen einzigen Block-Proposer für jeden Slot und ehrliche Validatoren, die das attestieren. Nur in Fällen von Asynchronität großer Netzwerke oder bei mehrdeutigen Handlungen eines unehrlichen Block-Proposer wird der Abspaltungs-Wahl-Algorithmus benötigt. Wenn solche Fälle jedoch eintreten, ist der Abspaltungs-Wahl-Algorithmus ein entscheidender Schutzmechanismus zur Sicherung der korrekten Chain. +Die ursprüngliche Definition von Casper-FFG enthielt einen Fork-Auswahl-Algorithmus, der die folgende Regel auferlegte: `folge der Kette, die den berechtigten Checkpoint mit der größten Höhe enthält`, wobei die Höhe als der größte Abstand vom Genesis-Block definiert ist. In Gasper wird die ursprüngliche Regel für die Wahl der Abspaltung zugunsten eines ausgefeilteren Algorithmus namens LMD-GHOST ersetzt. Es ist wichtig, zu erkennen, dass unter normalen Bedingungen eine Regel für die Wahl der Abspaltung unnötig ist – es gibt einen einzigen Block-Proposer für jeden Slot und ehrliche Validatoren, die das attestieren. Nur in Fällen von Asynchronität großer Netzwerke oder bei mehrdeutigen Handlungen eines unehrlichen Block-Proposer wird der Abspaltungs-Wahl-Algorithmus benötigt. Wenn solche Fälle jedoch eintreten, ist der Abspaltungs-Wahl-Algorithmus ein entscheidender Schutzmechanismus zur Sicherung der korrekten Chain. LMD-GHOST steht für „latest message-driven greedy heaviest observed sub-tree“ oder auf Deutsch „neuester, nachrichtengesteuerter, gieriger und schwerster beobachteter Unterbaum“. Hierbei handelt es sich um eine fachsprachenlastige Definition für einen Algorithmus, der die Abspaltung mit dem höchsten Gesamtgewicht an Attestierungen als die kanonische auswählt („greedy heaviest subtree“ oder auf Deutsch „gieriger, schwerster Unterbaum“) und sicherstellt, dass bei mehreren Nachrichten von einem Validator nur die neueste berücksichtigt wird („latest-message driven“ oder auf Deutsch „neuester, nachrichtengesteuerter“). Bevor ein Validator den schwersten Block zu seiner kanonischen Chain hinzufügt, bewertet er jeden Block anhand dieser Regel. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Gasper: Die Kombination aus GHOST und Kasper](https://arxiv.org/pdf/2003.03052.pdf) +- [Gasper: Combining GHOST and Casper](https://arxiv.org/pdf/2003.03052.pdf) - [Casper the Friendly Finality Gadget](https://arxiv.org/pdf/1710.09437.pdf) diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/index.md index dc5a02febc1..f6a91ed7fe1 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/index.md @@ -4,11 +4,11 @@ description: Eine Erklärung des Proof-of-Stake-Konsensprotokolls und seiner Rol lang: de --- -Proof-of-Stake (PoS) ist die Basis für Ethereums [Konsensmechanismus](/developers/docs/consensus-mechanisms/). Ethereum wechselte 2022 zum Proof-of-Stake-Mechanismus, da dieser sicherer und weniger energieintensiv ist sowie sich besser für die Implementierung neuer Skalierungslösungen eignet als die frühere [Proof-of-Work](/developers/docs/consensus-mechanisms/pow)-Architektur. +Proof-of-Stake (PoS) liegt dem [Konsensmechanismus](/developers/docs/consensus-mechanisms/) von Ethereum zugrunde. Ethereum wechselte 2022 zum Proof-of-Stake-Mechanismus, da dieser sicherer und weniger energieintensiv ist sowie sich besser für die Implementierung neuer Skalierungslösungen eignet als die frühere [Proof-of-Work](/developers/docs/consensus-mechanisms/pow)-Architektur. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst einen Blick auf [Konsensmechanismen](/developers/docs/consensus-mechanisms/) zu werfen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [Konsensmechanismen](/developers/docs/consensus-mechanisms/) zu informieren. ## Was ist Proof-of-Stake (PoS)? {#what-is-pos} @@ -20,38 +20,38 @@ Um als Validator teilzunehmen, muss ein Nutzer 32 ETH im Einzahlungsvertrag hint Bei Proof-of-Work war das Timing der Blocks durch die Schwierigkeit des Minings bestimmt. Bei Proof-of-Work ist das Tempo hingegen festgelegt. Die Zeit wird bei Proof-of-Stake-Ethereum in Slots (12 Sekunden) und Epochen (32 Slots) unterteilt. Ein Validator wird in jedem Slot zufällig für das Vorschlagen eines Blocks ausgewählt. Es ist die Aufgabe dieses Validators, einen neuen Block zu erstellen und ihn an andere Nodes im Netzwerk zu versenden. In jedem Slot wird außerdem zufällig ein Komitee aus Validatoren ausgewählt, das per Abstimmung über die Gültigkeit des vorgeschlagenen Blocks entscheidet. Die Aufteilung des Validatoren-Sets in Komitees ist wichtig, um die Netzwerkbelastung in einem kontrollierbaren Rahmen zu halten. Die Komitees teilen das Validatoren-Team so auf, dass jeder aktive Validator in jeder Epoche Attestierungen abgibt, jedoch nicht in jedem Slot. -## Wie eine Transaktion auf Ethereum PoS ausgeführt wird {#transaction-execution-ethereum-pos} +## Wie eine Transaktion in Ethereum-PoS ausgeführt wird {#transaction-execution-ethereum-pos} Der folgende Abschnitt enthält eine End-to-End-Erklärung, wie eine Transaktion auf Ethereum Proof of Stake ausgeführt wird. -1. Ein Nutzer erstellt und signiert eine [Transaktion](/developers/docs/transactions/) mit seinem privaten Schlüssel. Dies wird üblicherweise durch eine Wallet oder eine Bibliothek wie [ethers.js](https://docs.ethers.org/v6/), [web3js](https://docs.web3js.org/), [web3py](https://web3py.readthedocs.io/en/v5/) usw. verarbeitet, aber im Hintergrund stellt der Anwender mithilfe der [JSON-RPC-API](/developers/docs/apis/json-rpc/) von Ethereum eine Anfrage an einen Knoten. Der Nutzer setzte die Menge an Gas fest, die er als Trinkgeld an den Validator abgeben würde, um ihn dazu anzuregen, die Transaktion in einen Block aufzunehmen. Das [Trinkgeld](/developers/docs/gas/#priority-fee) wird an den Validator gezahlt, wohingegen die [Basisgebühr](/developers/docs/gas/#base-fee) verbrannt wird. -2. Die Transaktion wird an einen Ethereum [Ausführungsclient](/developers/docs/nodes-and-clients/#execution-client) übermittelt, der deren Gültigkeit verifiziert. Das bedeutet, sicherzustellen, dass der Sender über genügend ETH verfügt, um die Transaktion zu erfüllen, und dass er sie mit dem richtigen Schlüssel signiert hat. -3. Wenn die Transaktion gültig ist, fügt der Ausführungsclient sie seinem lokalen Mempool (Liste der ausstehenden Transaktionen) hinzu und versendet sie über die Ausführungsebene im Gossip-Netzwerk an andere Nodes. Wenn andere Nodes von der Transaktion erfahren, fügen sie sie ebenfalls ihrem lokalen Mempool hinzu. Erfahrene Nutzer könnten davon absehen, ihre Transaktionen zu versenden, und sie stattdessen an spezialisierte Blockersteller weiterleiten, wie z. B. die [Flashbots Auction](https://docs.flashbots.net/flashbots-auction/overview). Dies ermöglicht es Ihnen, die Transaktionen in kommenden Blöcken so zu organisieren, dass maximaler Profit ([MEV](/developers/docs/mev/#mev-extraction)) erzielt wird. -4. Einer der Validatoren-Nodes im Netzwerk ist der Block-Proposer für den aktuellen Slot, der zuvor mittels RANDAO pseudozufällig ausgewählt wurde. Dieser Node ist dafür verantwortlich, den nächsten Block zu erstellen und zu übertragen, der zur Ethereum-Blockchain hinzugefügt wird, und dafür, den globalen Status zu aktualisieren. Der Node setzt sich aus drei Teilen zusammen: einem Ausführungsclient, einem Konsensclient und einem Validatorenclient. Der Ausführungsclient bündelt Transaktionen aus dem lokalen Mempool zu einer „Ausführungsnutzlast“ und führt sie lokal aus, um eine Zustandsänderung herbeizuführen. Diese Informationen werden an den Konsensclient weitergeleitet, wo die Ausführungsnutzlast als Teil eines „Beacon-Blocks“ verpackt wird, der auch Informationen über Belohnungen, Strafen, Slashings, Attestierungen usw. enthält, die es dem Netzwerk ermöglichen, sich auf die Reihenfolge der Blöcke an der Spitze der Chain zu einigen. Die Kommunikation zwischen den Ausführungs- und Konsensclients wird in [Konsens- und Ausführungsclients miteinander verbinden](/developers/docs/networking-layer/#connecting-clients) näher beschrieben. -5. Andere Nodes empfangen den neuen Beacon-Block über das Gossip-Netzwerk auf der Konsensebene. Sie leiten ihn an ihren Ausführungs-Client weiter, wo die Transaktionen erneut lokal ausgeführt werden, um sicherzustellen, dass die vorgeschlagene Zustandsänderung gültig ist. Der Validator-Client attestiert dann die Gültigkeit des Blocks und dass er den logisch nächsten Block in seiner Sicht auf die Chain darstellt (d. h. er baut auf der Chain mit dem größten Gewicht an Attestierungen auf, o wie es in den [Abspaltungs-Wahl-Regeln](/developers/docs/consensus-mechanisms/pos/#fork-choice) definiert ist). Der Block wird zur lokalen Datenbank in jedem Node hinzugefügt, der ihn attestiert. +1. Ein Nutzer erstellt und signiert eine [Transaktion](/developers/docs/transactions/) mit seinem privaten Schlüssel. Dies wird in der Regel von einer Wallet oder einer Bibliothek wie [ethers.js](https://docs.ethers.org/v6/), [web3js](https://docs.web3js.org/), [web3py](https://web3py.readthedocs.io/en/v5/) usw. übernommen, aber im Hintergrund stellt der Nutzer über die [JSON-RPC-API](/developers/docs/apis/json-rpc/) von Ethereum eine Anfrage an einen Node. Der Nutzer setzte die Menge an Gas fest, die er als Trinkgeld an den Validator abgeben würde, um ihn dazu anzuregen, die Transaktion in einen Block aufzunehmen. Die [Prioritätsgebühren](/developers/docs/gas/#priority-fee) werden an den Validator gezahlt, während die [Grundgebühr](/developers/docs/gas/#base-fee) verbrannt wird. +2. Die Transaktion wird an einen Ethereum-[Ausführungs-Client](/developers/docs/nodes-and-clients/#execution-client) übermittelt, der ihre Gültigkeit verifiziert. Das bedeutet, sicherzustellen, dass der Sender über genügend ETH verfügt, um die Transaktion zu erfüllen, und dass er sie mit dem richtigen Schlüssel signiert hat. +3. Wenn die Transaktion gültig ist, fügt der Ausführungsclient sie seinem lokalen Mempool (Liste der ausstehenden Transaktionen) hinzu und versendet sie über die Ausführungsebene im Gossip-Netzwerk an andere Nodes. Wenn andere Nodes von der Transaktion erfahren, fügen sie sie ebenfalls ihrem lokalen Mempool hinzu. Fortgeschrittene Nutzer können darauf verzichten, ihre Transaktion zu übertragen und sie stattdessen an spezialisierte Blockersteller wie [Flashbots Auction](https://docs.flashbots.net/flashbots-auction/overview) weiterleiten. Dies ermöglicht es ihnen, die Transaktionen in kommenden Blöcken so zu organisieren, dass maximaler Profit ([MEV](/developers/docs/mev/#mev-extraction)) erzielt wird. +4. Einer der Validatoren-Nodes im Netzwerk ist der Block-Proposer für den aktuellen Slot, der zuvor mittels RANDAO pseudozufällig ausgewählt wurde. Dieser Node ist dafür verantwortlich, den nächsten Block zu erstellen und zu übertragen, der zur Ethereum-Blockchain hinzugefügt wird, und dafür, den globalen Status zu aktualisieren. Der Node setzt sich aus drei Teilen zusammen: einem Ausführungsclient, einem Konsensclient und einem Validatorenclient. Der Ausführungsclient bündelt Transaktionen aus dem lokalen Mempool zu einer „Ausführungsnutzlast“ und führt sie lokal aus, um eine Zustandsänderung herbeizuführen. Diese Informationen werden an den Konsensclient weitergeleitet, wo die Ausführungsnutzlast als Teil eines „Beacon-Blocks“ verpackt wird, der auch Informationen über Belohnungen, Strafen, Slashings, Attestierungen usw. enthält, die es dem Netzwerk ermöglichen, sich auf die Reihenfolge der Blöcke an der Spitze der Chain zu einigen. Die Kommunikation zwischen den Ausführungs- und Konsens-Clients wird unter [Verbinden von Konsens- und Ausführungs-Clients](/developers/docs/networking-layer/#connecting-clients) genauer beschrieben. +5. Andere Nodes empfangen den neuen Beacon-Block über das Gossip-Netzwerk auf der Konsensebene. Sie leiten ihn an ihren Ausführungs-Client weiter, wo die Transaktionen erneut lokal ausgeführt werden, um sicherzustellen, dass die vorgeschlagene Zustandsänderung gültig ist. Der Validator-Client attestiert dann, dass der Block gültig ist und aus seiner Sicht der Kette der logisch nächste Block ist (d.h. er baut auf der Kette mit dem größten Gewicht an Attestierungen auf, wie in den [Fork-Auswahlregeln](/developers/docs/consensus-mechanisms/pos/#fork-choice) definiert). Der Block wird zur lokalen Datenbank in jedem Node hinzugefügt, der ihn attestiert. 6. Eine Transaktion kann als „finalisiert“ angesehen werden, wenn sie Teil einer Chain geworden ist, wobei zwischen zwei Checkpoints eine „Supermajority-Verbindung“ besteht. Zu Checkpoints kommt es zu Beginn jeder Epoche. Sie sollen der Tatsache Rechnung tragen, dass in jedem Slot nur eine bestimmte Teilmenge der aktiven Validatoren Attestierungen abgibt, wohingegen über die gesamte Epoche gesehen alle aktiven Validatoren Attestierungen abgeben. Deshalb kann eine „Supermajority-Verbindung“ nur zwischen Epochen nachgewiesen werden (hier stimmen 66 % der gesamten eingesetzten ETH im Netzwerk über zwei Checkpoints überein). Weitere Details zur Endgültigkeit finden Sie unten. ## Endgültigkeit {#finality} -Eine Transaktion hat in verteilten Netzwerken „Endgültigkeit“, wenn sie Teil eines Blocks ist, der nicht geändern werden kann, ohne dass eine große Menge ETH verbrannt wird. Auf Proof-of-Stake-Ethereum wird dies mithilfe von „Checkpoint“-Blöcken verwaltet. Der erste Block jeder Epoche ist ein Checkpoint. Validatoren stimmen für Paare von Checkpoints ab, die sie als gültig einstufen. Wenn ein Paar von Checkpoints Stimmen auf sich vereint, die mindestens zwei Drittel der gesamten eingesetzten ETH repräsentieren, werden die Checkpoints aktualisiert. Der aktuellere der beiden (Ziel) wird „berechtigt“. Der frühere der beiden ist bereits berechtigt, da er in der vorherigen Epoche das „Ziel“ war. Jetzt wird er auf „finalisiert“ aktualisiert. +Eine Transaktion hat in verteilten Netzwerken „Endgültigkeit“, wenn sie Teil eines Blocks ist, der nicht geändern werden kann, ohne dass eine große Menge ETH verbrannt wird. Auf Proof-of-Stake-Ethereum wird dies mithilfe von „Checkpoint“-Blöcken verwaltet. Der erste Block jeder Epoche ist ein Checkpoint. Validatoren stimmen für Paare von Checkpoints ab, die sie als gültig einstufen. Wenn ein Paar von Checkpoints Stimmen auf sich vereint, die mindestens zwei Drittel der gesamten eingesetzten ETH repräsentieren, werden die Checkpoints aktualisiert. Der aktuellere der beiden (Ziel) wird „berechtigt“. Der frühere der beiden ist bereits berechtigt, da er in der vorherigen Epoche das „Ziel“ war. Jetzt wird er auf „finalisiert“ aktualisiert. Dieser Prozess der Aktualisierung der Checkpoints wird von **[Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437)** übernommen. Casper-FFG ist ein Tool für die Endgültigkeit von Blöcken im Konsens. Sobald ein Block finalisiert ist, kann er nicht ohne ein Slashing der Mehrheit der Staker rückgängig gemacht oder geändert werden, was dies wirtschaftlich unrentabel macht. -Um diesen Vorgang für einen finalisierten Block rückgängig zu machen, müsste ein Angreifer sich dazu bereit erklären, mindestens ein Drittel der Gesamtmenge an eingesetzten ETH zu verlieren. Der genaue Grund dafür wird in diesem [Ethereum Foundation-Blogbeitrag](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) erklärt. Da für die Endgültigkeit eine Zwei-Drittel-Mehrheit erforderlich ist, könnte ein Angreifer verhindern, dass das Netzwerk Endgültigkeit erreicht, indem er mit einem Drittel des gesamten Einsatzes abstimmt. Es gibt einen Mechanismus, um sich dagegen zu verteidigen: das [Inactivity Leak](https://eth2book.info/bellatrix/part2/incentives/inactivity). Dieses tritt immer dann in Kraft, wenn die Chain in mehr als vier Epochen nicht finalisiert wird. Das Inactivity Leak entzieht den Validatoren die eingesetzten ETH, die gegen die Mehrheit stimmen, wodurch die Mehrheit wieder eine Zwei-Drittel-Mehrheit erreichen und die Chain finalisieren kann. +Um diesen Vorgang für einen finalisierten Block rückgängig zu machen, müsste ein Angreifer sich dazu bereit erklären, mindestens ein Drittel der Gesamtmenge an eingesetzten ETH zu verlieren. Der genaue Grund dafür wird in diesem [Blogbeitrag der Ethereum Foundation](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) erklärt. Da für die Endgültigkeit eine Zwei-Drittel-Mehrheit erforderlich ist, könnte ein Angreifer verhindern, dass das Netzwerk Endgültigkeit erreicht, indem er mit einem Drittel des gesamten Einsatzes abstimmt. Es gibt einen Mechanismus, um sich dagegen zu verteidigen: das [Inaktivitäts-Leck](https://eth2book.info/bellatrix/part2/incentives/inactivity). Dieses tritt immer dann in Kraft, wenn die Chain in mehr als vier Epochen nicht finalisiert wird. Das Inactivity Leak entzieht den Validatoren die eingesetzten ETH, die gegen die Mehrheit stimmen, wodurch die Mehrheit wieder eine Zwei-Drittel-Mehrheit erreichen und die Chain finalisieren kann. ## Kryptoökonomische Sicherheit {#crypto-economic-security} Das Ausführen eines Validators ist ein Commitment. Vom Validator wird erwartet, dass er ausreichend Hardware und Konnektivität aufrechterhält, um an Blockvalidierung und -vorschlägen teilzunehmen. Im Gegenzug wird der Validator in ETH bezahlt (sein eingesetztes Guthaben erhöht sich). Auf der anderen Seite ergeben sich aus der Teilnahme als Validator auch neue Möglichkeiten für Nutzer, das Netzwerk aus Motiven der persönlichen Vorteilnahme oder Sabotage anzugreifen. Um dies zu verhindern, profitieren Validatoren nicht von ETH-Belohnungen, wenn sie trotz Aufforderung nicht teilnehmen. Außerdem kann ihr bestehender Stake bei unehrlichen Handlungen zerstört werden. Zwei primäre Verhaltensweisen können als unehrlich betrachtet werden: das Vorschlagen mehrerer Blöcke in einem einzelnen Slot (Äquivokation) und das Einreichen widersprüchlicher Attestierungen. -Die Höhe der geslashten ETH hängt davon ab, wie viele Validatoren ungefähr zur gleichen Zeit geslasht werden. Dies wird als [„Korrelationsstrafe“](https://eth2book.info/bellatrix/part2/incentives/slashing#the-correlation-penalty) bezeichnet. Sie kann geringfügig ausfallen (~1 % des Stakes, wenn ein einzelner Validator alleine geslasht wird) oder dazu führen, dass der gesamte Stake des Validators vernichtet wird (bei einem Massen-Slashing-Ereignis). Sie wird zur Hälfte der Zeit einer erzwungenen Austrittsperiode verhängt und beginnt mit einer sofortigen Strafe (bis zu 1 ETH) an Tag 1, setzt sich mit der Korrelationsstrafe an Tag 18 fort und führt schließlich zum Rauswurf aus dem Netzwerk an Tag 36. Sie erhalten täglich geringfügige Strafen für Attestierungen, da sie im Netzwerk präsent sind, aber keine Stimmen abgeben. All das bedeutet, dass ein koordinierter Angriff für den Angreifer sehr teuer wäre. +Die Höhe der geslashten ETH hängt davon ab, wie viele Validatoren ungefähr zur gleichen Zeit geslasht werden. Dies wird als [„Korrelationsstrafe“](https://eth2book.info/bellatrix/part2/incentives/slashing#the-correlation-penalty) bezeichnet, und sie kann geringfügig ausfallen (~1 % des Stakes, wenn ein einzelner Validator alleine geslasht wird) oder dazu führen, dass 100 % des Stakes des Validators vernichtet wird (Massen-Slashing-Ereignis). Sie wird zur Hälfte der Zeit einer erzwungenen Austrittsperiode verhängt und beginnt mit einer sofortigen Strafe (bis zu 1 ETH) an Tag 1, setzt sich mit der Korrelationsstrafe an Tag 18 fort und führt schließlich zum Rauswurf aus dem Netzwerk an Tag 36. Sie erhalten täglich geringfügige Strafen für Attestierungen, da sie im Netzwerk präsent sind, aber keine Stimmen abgeben. All das bedeutet, dass ein koordinierter Angriff für den Angreifer sehr teuer wäre. -## Auswahl abgeben {#fork-choice} +## Fork-Auswahl {#fork-choice} -Wenn das Netzwerk optimal und auf ehrliche Weise funktioniert, gibt es immer nur einen neuen Block an der Spitze der Chain und alle Validatoren bestätigen dies durch ihre Attestierungen. Es ist jedoch möglich, dass Validatoren aufgrund der Netzwerklatenz oder mehrdeutiger Aussagen eines Block-Proposers unterschiedliche Ansichten über Spitze der Chain haben. Daher benötigen Konsens-Clients einen Algorithmus, um zu entscheiden, welchen sie bevorzugen sollen. Der für Proof-of-Stake-Ethereum verwendete Algorithmus heißt [LMD-GHOST](https://arxiv.org/pdf/2003.03052.pdf). Er funktioniert so, dass er die Abspaltung identifiziert, die das größte Gewicht an Attestierungen in ihrer Historie hat. +Wenn das Netzwerk optimal und auf ehrliche Weise funktioniert, gibt es immer nur einen neuen Block an der Spitze der Chain und alle Validatoren bestätigen dies durch ihre Attestierungen. Es ist jedoch möglich, dass Validatoren aufgrund der Netzwerklatenz oder mehrdeutiger Aussagen eines Block-Proposers unterschiedliche Ansichten über Spitze der Chain haben. Daher benötigen Konsens-Clients einen Algorithmus, um zu entscheiden, welchen sie bevorzugen sollen. Der bei Proof-of-Stake-Ethereum verwendete Algorithmus heißt [LMD-GHOST](https://arxiv.org/pdf/2003.03052.pdf) und funktioniert, indem er den Fork identifiziert, der das größte Gewicht an Attestierungen in seiner Geschichte hat. ## Proof-of-Stake und Sicherheit {#pos-and-security} -Die Gefahr eines [51 %-Angriffs](https://www.investopedia.com/terms/1/51-attack.asp) besteht genauso unter Proof-of-Stake, wie sie unter Proof-of-Work bestand. Allerdings ist das Risiko für die Angreifer höher. Ein Angreifer müsste über 51 % der eingesetzten ETH verfügen. Er könnte dann seine eigenen Attestierungen einsetzen, um sicherzustellen, dass seine gewünschte Abspaltung diejenige mit den meisten kumulierten Attestierungen ist. Das „Gewicht“ der kumulierten Attestierungen wird von Konsens-Clients verwendet, um die richtige Chain zu bestimmen. Ein Angreifer mit 51 % der eingesetzten ETH hätte also die Möglichkeit, seine Abspaltung zur kanonischen zu machen. Ein Vorteil von Proof-of-Stake gegenüber Proof-of-Work besteht allerdings darin, dass die Community Flexibilität bei der Durchführung einer Gegenattacke hat. Zum Beispiel könnten die ehrlichen Validatoren beschließen, weiterhin auf der Minderheits-Chain aufzubauen und gleichzeitig die Abspaltung des Angreifers zu ignorieren, während sie Apps, Börsen und Pools ermutigen, es ihnen gleichzutun. Sie könnten auch beschließen, den Angreifer gewaltsam aus dem Netzwerk zu entfernen und seine eingesetzten ETH zu vernichten. Diese Maßnahmen stellen starke wirtschaftliche Verteidigungsmechanismen gegen einen 51 %-Angriff dar. +Die Gefahr eines [51-%-Angriffs](https://www.investopedia.com/terms/1/51-attack.asp) besteht bei Proof-of-Stake genauso wie bei Proof-of-Work, aber für die Angreifer ist das Risiko noch höher. Ein Angreifer müsste über 51 % der eingesetzten ETH verfügen. Er könnte dann seine eigenen Attestierungen einsetzen, um sicherzustellen, dass seine gewünschte Abspaltung diejenige mit den meisten kumulierten Attestierungen ist. Das „Gewicht“ der kumulierten Attestierungen wird von Konsens-Clients verwendet, um die richtige Chain zu bestimmen. Ein Angreifer mit 51 % der eingesetzten ETH hätte also die Möglichkeit, seine Abspaltung zur kanonischen zu machen. Ein Vorteil von Proof-of-Stake gegenüber Proof-of-Work besteht allerdings darin, dass die Community Flexibilität bei der Durchführung einer Gegenattacke hat. Zum Beispiel könnten die ehrlichen Validatoren beschließen, weiterhin auf der Minderheits-Chain aufzubauen und gleichzeitig die Abspaltung des Angreifers zu ignorieren, während sie Apps, Börsen und Pools ermutigen, es ihnen gleichzutun. Sie könnten auch beschließen, den Angreifer gewaltsam aus dem Netzwerk zu entfernen und seine eingesetzten ETH zu vernichten. Diese Maßnahmen stellen starke wirtschaftliche Verteidigungsmechanismen gegen einen 51 %-Angriff dar. Neben 51 %-Angriffen könnten böswillige Akteure auch versuchen, andere Arten von schädlichen Aktivitäten durchzuführen, wie zum Beispiel: @@ -62,14 +62,14 @@ Neben 51 %-Angriffen könnten böswillige Akteure auch versuchen, andere Arten v Es hat sich insgesamt gezeigt, dass Proof-of-Stake, wie es auf Ethereum implementiert ist, wirtschaftlich sicherer ist als Proof-of-Work. -## Vor- und Nachteile {#pros-and-cons} +## Pro und Kontra {#pros-and-cons} -| Vorteile | Nachteile | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | -| Das Staking erleichtert es Einzelpersonen, an der Sicherung des Netzwerks teilzuhaben, und fördert damit die Dezentralisierung. Validator-Node kann auf einem normalen Laptop ausgeführt werden. Staking Pools ermöglichen es Benutzern, Kapital einzusetzen, auch wenn sie nicht über 32 ETH verfügen. | Proof-of-Stake ist neuer und es liegt weniger Betriebserfahrung vor als bei Proof-of-Work | -| Staking ist stärker dezentralisiert. Skaleneffekte gelten beim Staking nicht in dem gleichen Maße wie beim Proof-of-Work-Mining. | Die Implementierung von Proof-of-Stake ist schwieriger als bei Proof-of-Work | -| Proof-of-Stake bietet mehr kryptoökonomische Sicherheit als Proof-of-Work | Benutzer müssen drei Komponenten von Software ausführen um an Ethereums Proof-of-Stake teilhaben zu können. | -| Weniger neue ETH müssen ausgegeben werden, um Anreize für Netzwerkteilnehmer zu schaffen | | +| Pro | Nachteile | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| Das Staking erleichtert es Einzelpersonen, an der Sicherung des Netzwerks teilzuhaben, und fördert damit die Dezentralisierung. Validator-Node kann auf einem normalen Laptop ausgeführt werden. Staking Pools ermöglichen es Benutzern, Kapital einzusetzen, auch wenn sie nicht über 32 ETH verfügen. | Proof-of-Stake ist neuer und es liegt weniger Betriebserfahrung vor als bei Proof-of-Work | +| Staking ist stärker dezentralisiert. Skaleneffekte gelten beim Staking nicht in dem gleichen Maße wie beim Proof-of-Work-Mining. | Die Implementierung von Proof-of-Stake ist schwieriger als bei Proof-of-Work | +| Proof-of-Stake bietet mehr kryptoökonomische Sicherheit als Proof-of-Work | Benutzer müssen drei Komponenten von Software ausführen um an Ethereums Proof-of-Stake teilhaben zu können. | +| Weniger neue ETH müssen ausgegeben werden, um Anreize für Netzwerkteilnehmer zu schaffen | | ### Vergleich mit Proof-of-Work {#comparison-to-proof-of-work} @@ -82,18 +82,18 @@ Ethereum nutzte ursprünglich Proof-of-Work, wechselte jedoch im September 2022 - wirtschaftliche Strafen für Fehlverhalten machen 51 %-Stil-Angriffe für einen Angreifer im Vergleich zu Proof-of-Work kostspieliger - die Community kann auf die „soziale Wiederherstellung“ einer ehrlichen Chain zurückgreifen, falls ein 51 %-Angriff die kryptoökonomischen Abwehrmechanismen überwinden sollte. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Proof of Stake FAQ](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ +- [Proof-of-Stake-FAQ](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ - [Was ist Proof-of-Stake](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ -- [Was Proof of Stake ist und warum sie wichtig ist](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ -- [Why Proof of Stake (Nov 2020)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ -- [Proof of Stake: How I Learned to Love Weak Subjectivity](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_ -- [Proof-of-stake Ethereum attack and defense](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) -- [A Proof of Stake Design Philosophy](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ -- [Video: Vitalik Buterin erklärt Lex Fridman die Funktionsweise von Proof-of-Stake](https://www.youtube.com/watch?v=3yrqBG-7EVE) +- [Was Proof-of-Stake ist und warum es wichtig ist](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ +- [Warum Proof-of-Stake (Nov. 2020)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ +- [Proof-of-Stake: Wie ich lernte, schwache Subjektivität zu lieben](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_ +- [Angriff und Verteidigung bei Proof-of-Stake-Ethereum](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) +- [Eine Designphilosophie für Proof-of-Stake](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ +- [Video: Vitalik Buterin erklärt Lex Fridman Proof-of-Stake](https://www.youtube.com/watch?v=3yrqBG-7EVE) ## Verwandte Themen {#related-topics} -- [Proof of work](/developers/docs/consensus-mechanisms/pow/) -- [Proof-of-authority](/developers/docs/consensus-mechanisms/poa/) +- [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) +- [Proof-of-Authority](/developers/docs/consensus-mechanisms/poa/) diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/keys/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/keys/index.md index 5c21f4e0413..bc4a267c9e6 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/keys/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/keys/index.md @@ -6,26 +6,26 @@ lang: de Ethereum sichert die Assets der Benutzer durch Verschlüsselung auf Basis öffentlicher/privater Schlüssel ab. Der öffentliche Schlüssel wird als Basis für eine Ethereum-Adresse verwendet – das bedeutet, dass er für die Allgemeinheit sichtbar ist und als einzigartiger Identifikator verwendet wird. Der private (oder „geheime“) Schlüssel sollte immer nur für den Kontoinhaber zugänglich sein. Der private Schlüssel wird dazu genutzt, Transaktionen und Daten zu „signieren“, sodass kryptographisch nachgewiesen werden kann, dass der Inhaber die Aktion eines bestimmten privaten Schlüssels genehmigt. -Ethereums Schlüssel werden mit Hilfe der [elliptischen Kurvenkryptografie](https://de.wikipedia.org/wiki/Elliptic-curve_cryptography) erzeugt. +Ethereums Schlüssel werden mittels [elliptischer-Kurven-Kryptographie](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography) generiert. -Als Ethereum jedoch von [Proof-of-Work](/developers/docs/consensus-mechanisms/pow) zu [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) wechselte, wurde eine neue Art von Schlüssel zu Ethereum hinzugefügt. Die ursprünglichen Schlüssel funktionieren immer noch genauso wie zuvor – es gab keine Änderungen an den elliptischen kurvenbasierten Schlüsseln, die die Konten sichern. Jedoch benötigten die Benutzer einen neuen Typ von Schlüssel, um am Proof-of-Stake-Mechanismus teilzunehmen, ETH einzusetzen und Validatoren zu betreiben. Dieses Bedürfnis entstand aus Skalierbarkeitsproblemen, die damit verbunden waren, dass viele Nachrichten zwischen einer großen Anzahl von Validatoren ausgetauscht wurden. Hierfür war eine kryptographische Methode erforderlich, die leicht aggregiert werden konnte, um den für das Erreichen eines Konsenses erforderlichen Kommunikationaufwand zu reduzieren. +Als Ethereum jedoch von [Proof-of-Work](/developers/docs/consensus-mechanisms/pow) auf [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) umstellte, wurde Ethereum eine neue Art von Schlüssel hinzugefügt. Die ursprünglichen Schlüssel funktionieren immer noch genauso wie zuvor – es gab keine Änderungen an den elliptischen kurvenbasierten Schlüsseln, die die Konten sichern. Jedoch benötigten die Benutzer einen neuen Typ von Schlüssel, um am Proof-of-Stake-Mechanismus teilzunehmen, ETH einzusetzen und Validatoren zu betreiben. Dieses Bedürfnis entstand aus Skalierbarkeitsproblemen, die damit verbunden waren, dass viele Nachrichten zwischen einer großen Anzahl von Validatoren ausgetauscht wurden. Hierfür war eine kryptographische Methode erforderlich, die leicht aggregiert werden konnte, um den für das Erreichen eines Konsenses erforderlichen Kommunikationaufwand zu reduzieren. -Dieser neue Schlüsseltyp verwendet das Signaturschema [**Boneh-Lynn-Shacham (BLS)**](https://wikipedia.org/wiki/BLS_digital_signature). BLS ermöglicht eine sehr effiziente Aggregation von Signaturen, erlaubt aber auch das Reverse Engineering von aggregierten individuellen Validatorenschlüsseln und ist ideal für die Verwaltung von Aktionen zwischen Validatoren. +Diese neue Art von Schlüssel verwendet das [\*\*Boneh-Lynn-Shacham-(BLS-)\*\*Signaturschema](https://wikipedia.org/wiki/BLS_digital_signature). BLS ermöglicht eine sehr effiziente Aggregation von Signaturen, erlaubt aber auch das Reverse Engineering von aggregierten individuellen Validatorenschlüsseln und ist ideal für die Verwaltung von Aktionen zwischen Validatoren. -## Die beiden Arten von Validatorenschlüsseln {#two-types-of-keys} +## Die zwei Arten von Validator-Schlüsseln {#two-types-of-keys} -Vor dem Wechsel zu Proof-of-Stake verfügten Ethereum-Benutzer nur über einen einzigen auf einer elliptischen Kurve basierenden privaten Schlüssel, mit dem sie auf ihre Geldmittel zugreifen konnten. Mit der Einführung von Proof-of-Stake brauchten Benutzer, die Solo-Staker sein wollten, auch einen **Validatorenschlüssel** und einen **Auszahlungsschlüssel**. +Vor dem Wechsel zu Proof-of-Stake verfügten Ethereum-Benutzer nur über einen einzigen auf einer elliptischen Kurve basierenden privaten Schlüssel, mit dem sie auf ihre Geldmittel zugreifen konnten. Mit der Einführung von Proof-of-Stake benötigten Benutzer, die Solo-Staker sein wollten, auch einen **Validator-Schlüssel** und einen **Auszahlungsschlüssel**. -### Der Validatorenschlüssel {#validator-key} +### Der Validator-Schlüssel {#validator-key} Der Schlüssel für die Validatorensignatur besteht aus zwei Elementen: -- dem **privaten** Schlüssel des Validatoren -- dem **öffentlichen** Schlüssel des Validatoren +- **Privater** Validator-Schlüssel +- **Öffentlicher** Validator-Schlüssel -Der Zweck eines privaten Validatorenschlüssel ist es, On-Chain-Operationen wie zum Beispiel Block-Proposals und Attestierungen zu signieren. Deshalb müssen diese Schlüssel in einer Hot Wallet gehalten werden. +Die Aufgabe des privaten Validator-Schlüssels besteht darin, On-Chain-Operationen wie Block Proposals und Attestations zu signieren. Deshalb müssen diese Schlüssel in einer Hot Wallet gehalten werden. -Diese Flexibilität hat den Vorteil, dass sich die Signaturschlüssel für Validatoren sehr schnell von einem zum anderen Gerät transferieren lassen. Sollten sie allerdings verloren gehen oder gestohlen werden, könnte ein Dieb auf mehrere Arten **böswillig handeln**: +Diese Flexibilität hat den Vorteil, dass sich die Signaturschlüssel für Validatoren sehr schnell von einem Gerät zum anderen transferieren lassen. Sollten sie allerdings verloren gehen oder gestohlen werden, könnte ein Dieb auf verschiedene Weisen **böswillig handeln**: - Bestrafung des Validatoren mit Slashing, indem er: - ein Proposer ist und zwei unterschiedliche Beacon-Blöcke für denselben Slot signiert @@ -33,13 +33,13 @@ Diese Flexibilität hat den Vorteil, dass sich die Signaturschlüssel für Valid - ein Attestierer ist und zwei unterschiedliche Attestierungen mit demselben Ziel signiert - Erzwingen eines freiwilligen Austritts, was den Validatoren vom Staking anhält und dem Besitzer des Auszahlungsschlüssel Zugriff auf sein ETH-Guthaben gewährt -Der **öffentliche Schlüssel des Validatoren** ist in den Transaktionsdaten enthalten, wenn ein Benutzer ETH in den Staking-Einzahlungsvertrag transferiert. Diese Daten sind als _Einzahlungsdaten_ bekannt. Mit ihnen kann Ethereum den Validatoren identifizieren. +Der **öffentliche Validator-Schlüssel** ist in den Transaktionsdaten enthalten, wenn ein Benutzer ETH in den Staking-Einzahlungsvertrag einzahlt. Dies wird als _Einzahlungsdaten_ bezeichnet und ermöglicht es Ethereum, den Validator zu identifizieren. -### Zugangsdaten für die Auszahlung {#withdrawal-credentials} +### Auszahlungs-Zugangsdaten {#withdrawal-credentials} -Jeder Validator hat eine Eigenschaft, bekannt als _Zugangsdaten für die Auszahlung_. Dieses 32-Byte-Feld beginnt entweder mit `0x00`, was BLS-Zugangsdaten für die Auszahlung repräsentiert, oder `0x01`, wobei es sich um Zugangsdaten handelt, die sich auf eine Ausführungsadresse beziehen. +Jeder Validator hat eine Eigenschaft, die als _Auszahlungs-Zugangsdaten_ bezeichnet wird. Dieses 32-Byte-Feld beginnt entweder mit `0x00`, das für BLS-Auszahlungs-Zugangsdaten steht, oder mit `0x01`, das für Zugangsdaten steht, die auf eine Ausführungsadresse verweisen. -Validatoren mit `0x00`-BLS-Schlüsseln müssen diese Zugangsdaten aktualisieren, damit auf eine Auszahlungsadresse verwiesen wird und überschüssige Zahlungen für ihr Guthaben oder vollständige Auszahlungen von Staking-Beträgen aktiviert werden können. Dies lässt sich erreichen, indem während der ersten Schlüsselgeneration eine Ausführungsadresse in den Einzahlungsdaten bereitstellt wird _ODER_, indem der Auszahlungsschlüssel zu einem späteren Zeitpunkt verwendet wird, um eine `BLSToExecutionChange`-Nachricht zu signieren und zu übertragen. +Validatoren mit `0x00` BLS-Schlüsseln müssen diese Zugangsdaten aktualisieren, damit sie auf eine Ausführungsadresse verweisen, um Auszahlungen von überschüssigem Guthaben oder die vollständige Auszahlung vom Staking zu aktivieren. Dies kann geschehen, indem bei der erstmaligen Schlüsselgenerierung eine Ausführungsadresse in den Einzahlungsdaten angegeben wird _ODER_ indem der Auszahlungsschlüssel zu einem späteren Zeitpunkt verwendet wird, um eine `BLSToExecutionChange`-Nachricht zu signieren und zu senden. ### Der Auszahlungsschlüssel {#withdrawal-key} @@ -50,31 +50,33 @@ Genau wie die Validatorenschlüssel setzen sich die Auszahlungsschlüssel auch a - **Privater** Auszahlungsschlüssel - **Öffentlicher** Auszahlungsschlüssel -Ein Verlust dieses Schlüssel, bevor die Zugangsdaten für die Auszahlung auf `0x01`-Typ aktualisiert wurden, ist gleichbedeutend mit dem Verlust des Zugriffs auf das Validatorenguthaben. Der Validator kann immer noch Attestierungen und Blöcke signieren, da für diese Aktionen der private Schlüssel des Validatoren erforderlich ist. Hierfür gibt es aber wenig bis keine Anreize, sollten die Auszahlungsschlüssel verloren gegangen sein. +Der Verlust dieses Schlüssels vor der Aktualisierung der Auszahlungs-Zugangsdaten auf den Typ `0x01` bedeutet den Verlust des Zugriffs auf das Validator-Guthaben. Der Validator kann immer noch Attestierungen und Blöcke signieren, da für diese Aktionen der private Schlüssel des Validatoren erforderlich ist. Hierfür gibt es aber wenig bis keine Anreize, sollten die Auszahlungsschlüssel verloren gegangen sein. Eine Trennung der Schlüssel der Validatoren von denen des Ethereum-Kontos ermöglicht das Betreiben mehrerer Validatoren durch einen einzigen Benutzer. -![Schema der Schlüssel für Validatoren](validator-key-schematic.png) +![Schema der Validator-Schlüssel](validator-key-schematic.png) -## Schlüssel aus einer Seed Phrase ableiten {#deriving-keys-from-seed} +**Hinweis**: Das Beenden der Staking-Pflichten und das Abheben des Guthabens eines Validators erfordert derzeit das Signieren einer [freiwilligen Austrittsnachricht (VEM)](https://mirror.xyz/ladislaus.eth/wmoBbUBes2Wp1_6DvP6slPabkyujSU7MZOFOC3QpErs&1) mit dem Validator-Schlüssel. [EIP-7002](https://eips.ethereum.org/EIPS/eip-7002) ist jedoch ein Vorschlag, der es Benutzern in Zukunft ermöglichen wird, den Austritt eines Validators auszulösen und sein Guthaben abzuheben, indem Austrittsnachrichten mit dem Auszahlungsschlüssel signiert werden. Dies wird die Vertrauensannahmen reduzieren, indem es Stakern, die ETH an [Staking-as-a-Service-Anbieter](/staking/saas/#what-is-staking-as-a-service) delegieren, ermöglicht, die Kontrolle über ihre Gelder zu behalten. + +## Ableiten von Schlüsseln aus einer Seed-Phrase {#deriving-keys-from-seed} Wenn für jede 32 eingesetzten ETH ein neues Set von zwei komplett unabhängigen Schlüsseln erforderlich wäre, würde die Schlüsselverwaltung schnell sehr unübersichtlich werden, besonders für Benutzer, die mehrere Validatoren ausführen. Stattdessen lassen sich mehrere Validatorenschlüssel von einem einzelnen gemeinsamen Geheimnis ableiten und das Speichern dieses Geheimnisses ermöglicht den Zugriff auf mehrere Validatorenschlüssel. -[Mnemoniken](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase) und Pfade sind wichtige Funktionen, mit denen Benutzer oft zu tun haben, wenn [sie auf ihre Wallets zugreifen](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0). Die Mnemonik ist eine Sequenz von Wörtern, die als erster Seed für einen privaten Schlüssel dienen. Durch Kombination mit zusätzlichen kann die Mnemonik einen Hash, bekannt als der „Master Key“, generieren. Das kann man sich wie die Wurzeln eines Baums vorstellen. Abzweigungen dieser Wurzeln lassen sich mithilfe eines hierarchischen Pfads ableiten, sodass Child Nodes als Kombinationen aus dem Hash der Parent Nodes und dem Index im Baum existieren können. Lesen Sie mehr zu [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) und [BIP-19](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)-Standards für die mnemonikbasierte Schlüsselerstellung. +[Mnemonics](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase) und Pfade sind wichtige Funktionen, auf die Benutzer häufig stoßen, wenn [sie auf](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0) ihre Wallets zugreifen. Die Mnemonik ist eine Sequenz von Wörtern, die als erster Seed für einen privaten Schlüssel dienen. Durch Kombination mit zusätzlichen kann die Mnemonik einen Hash, bekannt als der „Master Key“, generieren. Das kann man sich wie die Wurzeln eines Baums vorstellen. Abzweigungen dieser Wurzeln lassen sich mithilfe eines hierarchischen Pfads ableiten, sodass Child Nodes als Kombinationen aus dem Hash der Parent Nodes und dem Index im Baum existieren können. Lesen Sie mehr über die Standards [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) und [BIP-19](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) für die mnemotechnische Schlüsselgenerierung. Diese Pfade haben die folgende Struktur. Nutzer, die mit Hardware-Wallets interagiert haben, sollte sie bekannt vorkommen: ``` -m/44'/60'/0'/0` +`m/44'/60'/0'/0` ``` Die Schrägstriche in diesem Weg trennen Komponenten des privaten Schlüssels wie folgt: ``` -master_key / purpose / coin_type / account / change / address_index +`master_key / purpose / coin_type / account / change / address_index` ``` -Diese Logik ermöglicht es Benutzern, so viele Validatoren wie möglich an eine einzige **mnemonische Phrase** anzuhängen, da die Tree Root gewöhnlich sein kann und es an den Branches zur Differenzierung kommen kann. Der Benutzer kann **eine beliebige Anzahl von Schlüsseln** von der mnemonischen Phrase ableiten. +Diese Logik ermöglicht es Benutzern, so viele Validatoren wie möglich an eine einzige **mnemonische Phrase** anzuhängen, da die Baumwurzel (tree root) gemeinsam sein kann und die Differenzierung an den Zweigen (branches) stattfinden kann. Der Benutzer kann **beliebig viele Schlüssel** aus der mnemonischen Phrase **ableiten**. ``` [m / 0] @@ -86,11 +88,13 @@ Diese Logik ermöglicht es Benutzern, so viele Validatoren wie möglich an eine [m / 2] ``` -Jeder Branch ist durch einen `/` separiert, deshalb bedeutet `m/2`, dass Sie mit dem Master Key beginnen und dem zweiten Branch folgen. Im Schema unten kommt eine einzige mnemonische Phrase zum Einsatz, um drei Auszahlungsschlüssel mit jeweils zwei zugehörigen Validatoren zu speichern. +Jeder „Branch“ (Zweig) wird durch ein `/` getrennt. `m/2` bedeutet also, dass man mit dem Master-Schlüssel beginnt und dem Branch 2 folgt. Im Schema unten kommt eine einzige mnemonische Phrase zum Einsatz, um drei Auszahlungsschlüssel mit jeweils zwei zugehörigen Validatoren zu speichern. -![Logik für Validatorenschlüssel](multiple-keys.png) +![Logik der Validator-Schlüssel](multiple-keys.png) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Blogbeitrag der Ethereum Foundation von Carl Beekhuizen](https://blog.ethereum.org/2020/05/21/keys/) -- [Schlüsselerzeugung EIP-2333 BLS12-381](https://eips.ethereum.org/EIPS/eip-2333) +- [EIP-2333 BLS12-381 Schlüsselgenerierung](https://eips.ethereum.org/EIPS/eip-2333) +- [EIP-7002: Von der Ausführungsebene ausgelöste Austritte](https://web.archive.org/web/20250125035123/https://research.2077.xyz/eip-7002-unpacking-improvements-to-staking-ux-post-merge) +- [Schlüsselverwaltung in großem Umfang](https://docs.ethstaker.cc/ethstaker-knowledge-base/scaled-node-operators/key-management-at-scale) diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md index 07be8bea0f5..8041cf2e714 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md @@ -12,19 +12,19 @@ Auf dieser Seite werden die Gründe für Ethereums Wechsel von Proof-of-Work zu Ethereums Forscher halten Proof-of-Stake für sicherer als Proof-of-Work. Jedoch wurde es erst vor kurzer Zeit zum echtem Ethereum Mainnet hinzugefügt und ist weniger zeiterprobt als Proof-of-Work. In den folgenden Abschnitten werden die Vor- und Nachteile des Proof-of-Stake-Sicherheitsmodells im Vergleich zu Proof-of-Work diskutiert. -### Kosten eines Angriffs {#cost-to-attack} +### Kosten für einen Angriff {#cost-to-attack} -Bei Proof-of-Stake müssen Validatoren mindestens 32 ETH in einen Smart Contract transferieren („staken“). Ethereum kann eingesetzte Ether zerstören, um Validatoren, die sich falsch verhalten, zu bestrafen. Um einen Konsens zu erreichen, müssen mindestens 66 % der insgesamt eingesetzten Ether für eine bestimmte Gruppe von Blöcken abstimmen. Blöcke, für die >=66 % des Stakes abgestimmt haben, werden „finalisiert“, was bedeutet, dass sie nicht mehr entfernt oder neu organisiert werden können. +Bei Proof-of-Stake müssen Validatoren mindestens 32 ETH in einen Smart Contract transferieren („staken“). Ethereum kann eingesetzte Ether zerstören, um Validatoren, die sich falsch verhalten, zu bestrafen. Um einen Konsens zu erreichen, müssen mindestens 66 % der insgesamt eingesetzten Ether für eine bestimmte Gruppe von Blöcken abstimmen. Blöcke, für die >=66 % des Stakes abgestimmt haben, werden "finalisiert", was bedeutet, dass sie nicht entfernt oder neu organisiert werden können. Ein Angriff auf das Netzwerk kann bedeuten, das Finalisieren der Chain zu verhindern oder eine bestimmte Anordnung von Blöcken in der kanonischen Chain zu erreichen, die für den Angreifer von Vorteil ist. Dies erfordert, dass der Angreifer ehrliche Konsensbildung umgeht, indem er entweder eine große Menge an Ether anhäuft und damit direkt abstimmt oder ehrliche Validatoren dazu bringt, auf eine bestimmte Weise abzustimmen. Wenn wir ausgeklügelte, unwahrscheinliche Angriffe zur Täuschung ehrlicher Validierer für den Moment außen vor lassen, belaufen sich die Kosten für einen Angriff auf Ethereum auf die Kosten für den Stake, den ein Angreifer aufbringen muss, um den Konsens zu seinen Gunsten zu beeinflussen. -Die niedrigsten Angriffskosten sind >33 % des gesamten Stakes. Ein Angreifer, der >33 % des gesamten Stakes hält, könnte einfach nur, indem er offline geht, eine Endgültigkeitsverzögerung hervorrufen. Dies ist ein relativ geringes Problem für das Netzwerk, da es einen Mechanismus gibt, der als „Inactivity Leak“ bekannt ist und den Offline-Validatoren Stake entzieht, bis die Online-Mehrheit 66 % des Stakes repräsentiert und die Chain wieder finalisieren kann. Es ist für einen Angreifer auch theoretisch möglich, mit etwas über 33 % des Gesamt-Stakes eine doppelte Endgültigkeit herbeizuführen. Hierzu würde er zwei Blöcke statt einem Block erzeugen, wenn er darum gebeten wird, als Block-Producer zu fungieren, und dann mit all seinen Validatoren doppelt abstimmen. Bei jeder Abspaltung müssen nur 50 % der verbleibenden ehrlichen Validatoren jeden Block zuerst sehen. Wenn der Angreifer es also schafft, seine Nachrichten zum genau richtigen Zeitpunkt zu versenden, könnte es ihm gelingen, beide Abspaltungen zu finalisieren. Die Wahrscheinlichkeit, dass dies gelingt, ist zwar gering. Wenn ein Angreifer jedoch in der Lage wäre, eine doppelte Endgültigkeit herbeizuführen, müsste sich die Ethereum-Community dazu entscheiden, einer der Abspaltungen zu folgen. In diesem Fall würden die Validatoren des Angreifers auf der anderen Abspaltung zwangsläufig mit Slashing bestraft werden. +Die niedrigsten Kosten für einen Angriff betragen >33 % des gesamten Stakes. Ein Angreifer, der >33 % des gesamten Stakes hält, kann eine Endgültigkeitsverzögerung verursachen, indem er einfach offline geht. Dies ist ein relativ geringes Problem für das Netzwerk, da es einen Mechanismus gibt, der als „Inactivity Leak“ bekannt ist und den Offline-Validatoren Stake entzieht, bis die Online-Mehrheit 66 % des Stakes repräsentiert und die Chain wieder finalisieren kann. Es ist für einen Angreifer auch theoretisch möglich, mit etwas über 33 % des Gesamt-Stakes eine doppelte Endgültigkeit herbeizuführen. Hierzu würde er zwei Blöcke statt einem Block erzeugen, wenn er darum gebeten wird, als Block-Producer zu fungieren, und dann mit all seinen Validatoren doppelt abstimmen. Bei jeder Abspaltung müssen nur 50 % der verbleibenden ehrlichen Validatoren jeden Block zuerst sehen. Wenn der Angreifer es also schafft, seine Nachrichten zum genau richtigen Zeitpunkt zu versenden, könnte es ihm gelingen, beide Abspaltungen zu finalisieren. Die Wahrscheinlichkeit, dass dies gelingt, ist zwar gering. Wenn ein Angreifer jedoch in der Lage wäre, eine doppelte Endgültigkeit herbeizuführen, müsste sich die Ethereum-Community dazu entscheiden, einer der Abspaltungen zu folgen. In diesem Fall würden die Validatoren des Angreifers auf der anderen Abspaltung zwangsläufig mit Slashing bestraft werden. -Mit >33 % des gesamten Stakes hat ein Angreifer die Chance, das Ethereum-Netzwerk geringfügig (Endgültigkeitsverzögerung) oder schwerwiegender (doppelte Endgültigkeit) zu beeinflussen. Bei mehr als 14.000.000 ETH im Netzwerk und einem repräsentativen Preis von 1.000 $/ETH betragen die Mindestkosten für diese Angriffe `1.000 x 14.000.000 x 0,33 = 4.620.000.000 $`. Der Angreifer würde dieses Geld durch das Slashing verlieren und vom Netzwerk ausgestoßen werden. Um nochmal anzugreifen, müsste er erneut >33 % des Stakes ansammeln und erneut verbrennen. Jeder Versuch, das Netzwerk anzugreifen, würde >4,6 Milliarden $ kosten (bei 1.000 $/ETH und 14 Mio. eingesetzten ETH). Der Angreifer wird auch vom Netzwerk ausgeschlossen, wenn er mit Slashing bestraft wird, und müsste einer Aktivierungswarteschlange beitreten, um wieder ins Netzwerk zu gelangen. Das bedeutet, dass die Wiederholungsrate eines Angriffs nicht nur durch die Geschwindigkeit begrenzt ist, mit der der Angreifer >33 % des Gesamt-Stakes anhäufen kann, sondern auch durch die Zeit, die er benötigt, um alle seine Validatoren in das Netz einzubinden. Jedes Mal, wenn ein Akteur angreift, verliert er Unmengen an Geld, und der Rest der Community profitiert finanziell dank des aus dem Angriff resultierenden Angebotsschocks. +Mit >33 % des gesamten Stakes hat ein Angreifer die Chance, eine geringfügige (Endgültigkeitsverzögerung) oder schwerwiegendere (doppelte Endgültigkeit) Auswirkung auf das Ethereum-Netzwerk zu haben. Bei mehr als 14.000.000 im Netzwerk gestaketen ETH und einem repräsentativen Preis von 1.000 $/ETH betragen die Mindestkosten für diese Angriffe `1000 x 14,000,000 x 0.33 = $4,620,000,000`. Der Angreifer würde dieses Geld durch das Slashing verlieren und vom Netzwerk ausgestoßen werden. Um erneut anzugreifen, müssten sie (erneut) >33 % des Stakes ansammeln und diesen (erneut) verbrennen. Jeder Versuch, das Netzwerk anzugreifen, würde >4,6 Milliarden $ kosten (bei 1.000 $/ETH und 14 Mio. gestaketen ETH). Der Angreifer wird auch vom Netzwerk ausgeschlossen, wenn er mit Slashing bestraft wird, und müsste einer Aktivierungswarteschlange beitreten, um wieder ins Netzwerk zu gelangen. Das bedeutet, dass die Rate eines wiederholten Angriffs nicht nur durch die Geschwindigkeit begrenzt ist, mit der der Angreifer >33 % des gesamten Stakes ansammeln kann, sondern auch durch die Zeit, die benötigt wird, um alle seine Validatoren in das Netzwerk aufzunehmen. Jedes Mal, wenn ein Akteur angreift, verliert er Unmengen an Geld, und der Rest der Community profitiert finanziell dank des aus dem Angriff resultierenden Angebotsschocks. Für andere Angriffe wie 51 %-Angriffe oder Endgültigkeitsumkehrung mit 66 % des gesamten Stakes sind wesentlich mehr ETH erforderlich. Sie sind auch für den Angreifer deutlich kostspieliger. -Vergleichen Sie das mit Proof-of-Stake. Die Kosten für einen Angriff auf Proof-of-Work-Ethereum entsprachen den Kosten, die notwendig waren, um konstant >50 % der gesamten Hash-Rate des Netzwerks zu besitzen. Dies waren die Hardware- und Betriebskosten zur Aufrechterhaltung von ausreichend Rechenleistung, um andere Miner konstant bei der Berechnung von Proof-of-Work-Lösungen zu übertreffen. Auf Ethereum wurde größtenteils mit GPUs und nicht mit ASICs geschürft, was die Kosten niedrig hielt (obwohl auf Ethereum, hätte es am Proof-of-Work-Mechanismus festgehalten, ASIC Mining möglicherweise populärer geworden wäre). Ein Angreifer müsste eine Menge Hardware kaufen und den Strom dafür bezahlen, um ein Proof-of-Work-Ethereum-Netzwerk anzugreifen. Die Gesamtkosten wären allerdings geringer als die Kosten, die erforderlich sind, um genug ETH für einen Angriff zu sammeln. Ein 51 %-Angriff ist [20-mal weniger](https://youtu.be/1m12zgJ42dI?t=1562) teuer bei Proof-of-Work als bei Proof-of-Stake. Wenn der Angriff entdeckt und die Chain hart abgespalten worden wäre, um die Änderungen wieder zu entfernen, könnte der Angreifer wiederholt dieselbe Hardware verwenden, um die neue Abspaltung anzugreifen. +Vergleichen Sie das mit Proof-of-Stake. Die Kosten für einen Angriff auf Proof-of-Work-Ethereum waren die Kosten, um konstant >50 % der gesamten Hash-Rate des Netzwerks zu besitzen. Dies waren die Hardware- und Betriebskosten zur Aufrechterhaltung von ausreichend Rechenleistung, um andere Miner konstant bei der Berechnung von Proof-of-Work-Lösungen zu übertreffen. Auf Ethereum wurde größtenteils mit GPUs und nicht mit ASICs geschürft, was die Kosten niedrig hielt (obwohl auf Ethereum, hätte es am Proof-of-Work-Mechanismus festgehalten, ASIC Mining möglicherweise populärer geworden wäre). Ein Angreifer müsste eine Menge Hardware kaufen und den Strom dafür bezahlen, um ein Proof-of-Work-Ethereum-Netzwerk anzugreifen. Die Gesamtkosten wären allerdings geringer als die Kosten, die erforderlich sind, um genug ETH für einen Angriff zu sammeln. Eine 51-%-Attacke ist bei Proof-of-Work ~[20-mal günstiger](https://youtu.be/1m12zgJ42dI?t=1562) als bei Proof-of-Stake. Wenn der Angriff entdeckt und die Chain hart abgespalten worden wäre, um die Änderungen wieder zu entfernen, könnte der Angreifer wiederholt dieselbe Hardware verwenden, um die neue Abspaltung anzugreifen. ### Komplexität {#complexity} @@ -36,7 +36,7 @@ Um die Proof-of-Stake-Konsenslogik sicher zu testen und zu entwickeln, wurde die Proof-of-Stake ist komplexer als Proof-of-Work, was bedeutet, dass mehr potenzielle Angriffsvektoren berücksichtigt werden müssen. Anstatt eines Peer-to-Peer-Netzwerks zur Verbindung von Clients gibt es davon zwei, die jeweils ein eigenes Protokoll implementieren. Wenn in jedem Slot ein bestimmter Validator für ein Block-Proposal vorausgewählt wird, kann es potenziell zu einem Denial-of-Service kommen, wobei via große Mengen an Datenverkehr im Netzwerk dieser spezielle Validator außer Gefecht gesetzt wird. -Es gibt auch Möglichkeiten für Angreifer, die Freigabe ihrer Blöcke oder Attestierungen sorgfältig so zu timen, dass sie von einem bestimmten Teil des ehrlichen Netzwerks empfangen werden und ihn dazu bringen, auf eine bestimmte Weise abzustimmen. Schließlich kann ein Angreifer einfach genügend ETH anhäufen, um den Konsensmechanismus mit seinem Stake zu dominieren. Für jeden dieser [Angriffsvektoren existieren entsprechende Abwehrmaßnahmen](/developers/docs/consensus-mechanisms/pos/attack-and-defense), diese sind jedoch nicht für eine Verteidigung im Rahmen eines Proof-of-Work-Angriffs gedacht. +Es gibt auch Möglichkeiten für Angreifer, die Freigabe ihrer Blöcke oder Attestierungen sorgfältig so zu timen, dass sie von einem bestimmten Teil des ehrlichen Netzwerks empfangen werden und ihn dazu bringen, auf eine bestimmte Weise abzustimmen. Schließlich kann ein Angreifer einfach genügend ETH anhäufen, um den Konsensmechanismus mit seinem Stake zu dominieren. Jeder dieser [Angriffsvektoren hat zugehörige Abwehrmaßnahmen](/developers/docs/consensus-mechanisms/pos/attack-and-defense), die aber bei Proof-of-Work nicht zur Verteidigung existieren. ## Dezentralisierung {#decentralization} @@ -50,9 +50,9 @@ Die beste Option für Ethereum sind Validatoren, die lokal auf Heimcomputern bet Proof-of-Stake ist ein kohlenstoffarmer Weg zur Sicherung der Blockchain. Unter Proof-of-Work konkurrieren Miner um das Recht, einen Block zu schürfen. Miner sind erfolgreicher, wenn sie ihre Berechnungen schneller durchführen können. Das schafft Anreize für Investitionen in die Hardware und sorgt für höheren Energieverbrauch. Dies wurde für Ethereum vor dem Wechsel zu Proof-of-Stake beobachtet. Kurz vorm Übergang zu Proof-of-Stake verbrauchte Ethereum ungefähr 78 TWh/Jahr gebraucht – so viel wie ein kleines Land. Der Wechsel zu Proof-of-Stake hat den Energieverbrauch hingegen um ~99,98 % gesenkt. Proof-of-Stake machte Ethereum zu einer energieeffizienten Plattform, für die wenig Kohlenstoff ausgestoßen wird. -[Mehr über Ethereums Energieverbrauch](/energy-consumption) +[Mehr über den Energieverbrauch von Ethereum](/energy-consumption) -## Ausgabe {#issuance} +## Emission {#issuance} Proof-of-Stake-Ethereum kann für seine Sicherheit bezahlen, indem viel weniger Münzen als bei Proof-of-Work-Ethereum ausgeben werden, da die Validatoren keine hohen Stromkosten bezahlen müssen. Infolgedessen kann ETH seine Inflation verringern oder sogar deflationär werden, sollten große Mengen an ETH verbrannt werden. Niedrigere Inflationsniveaus bedeuten, dass Ethereums Sicherheit günstiger ist, als das unter Proof-of-Work der Fall gewesen war. @@ -62,8 +62,8 @@ Hier erklärt Justin Drake die Vorteile von Proof-of-Stake im Vergleich zu Proof -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Vitaliks Designphilosophie für Proof-of-Stake](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) -- [Vitaliks Proof-of-Stake-FAQs](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) -- [„Einfach erklärt“-Video zu PoS vs. PoW](https://www.youtube.com/watch?v=M3EFi_POhps) +- [Vitaliks FAQs zu Proof-of-Stake](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- ["Simply Explained"-Video über PoS vs. PoW](https://www.youtube.com/watch?v=M3EFi_POhps) diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md index 9ab712fd77c..16ee84d899a 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md @@ -4,7 +4,7 @@ description: Erfahren Sie mehr über die protokollinternen Anreize auf Proof-of- lang: de --- -Ethereum wird durch seine native Kryptowährung Ether (ETH) gesichert. Node-Betreiber, die an der Validierung von Blöcken und der Identifizierung der Spitze der Chain teilnehmen möchten, zahlen Ether in den [Einzahlungsvertrag](/staking/deposit-contract/) auf Ethereum ein. Sie werden dann in Ether dafür bezahlt, dass sie eine Validatorensoftware laufen lassen. Diese prüft die Gültigkeit neuer Blöcke, die über das Peer-to-Peer-Netzwerk empfangen werden, und wendet den Abspaltungs-Wahl-Algorithmus an, um die Spitze der Chain zu identifizieren. +Ethereum wird durch seine native Kryptowährung Ether (ETH) gesichert. Node-Betreiber, die an der Validierung von Blöcken und der Identifizierung des Chain-Heads teilnehmen möchten, zahlen Ether in den [Einzahlungsvertrag](/staking/deposit-contract/) auf Ethereum ein. Sie werden dann in Ether dafür bezahlt, dass sie eine Validatorensoftware laufen lassen. Diese prüft die Gültigkeit neuer Blöcke, die über das Peer-to-Peer-Netzwerk empfangen werden, und wendet den Abspaltungs-Wahl-Algorithmus an, um die Spitze der Chain zu identifizieren. Es gibt zwei Hauptaufgaben für einen Validatoren: 1) Er prüft neue Blöcke und „attestiert“ deren Gültigkeit, 2) er schlägt neue Blöcke vor, falls er nach dem Zufallsprinzip aus dem gesamten Validatoren-Pool ausgewählt wurde. Wenn der Validator eine dieser Aufgaben ach Aufforderung nicht erfüllt, verpasst er die Ether-Auszahlung. Validatoren werden manchmal auch mit der Aggregierung von Signaturen und der Teilnahme an Synchronisierungskomitees beauftragt. @@ -14,53 +14,53 @@ Alle Belohnungen und Strafen werden in jeder Epoche einmal angewendet. Lesen Sie weiter und erfahren Sie mehr Details ... -## Belohnungen und Bestrafungen {#rewards} +## Belohnungen und Strafen {#rewards} ### Belohnungen {#rewards} -Validatoren erhalten Belohnungen, wenn sie Stimmen abgeben, die mit der Mehrheit der anderen Validatoren übereinstimmen, wenn sie Blöcke vorschlagen und wenn sie an Synchronisierungs-Komitees teilnehmen. Der Wert der Belohnungen in jeder Epoche wird über eine `base_reward` berechnet. Von dieser Basiseinheit werden andere Belohnungen berechnet. Die `Base_Reward` stellt die durchschnittliche Belohnung dar, die ein Validator unter optimalen Bedingungen in jeder Epoche erhält. Sie wird wie folgt aus dem Effektivguthaben des Validatoren und der Gesamtzahl an aktiven Validatoren berechnet: +Validatoren erhalten Belohnungen, wenn sie Stimmen abgeben, die mit der Mehrheit der anderen Validatoren übereinstimmen, wenn sie Blöcke vorschlagen und wenn sie an Synchronisierungs-Komitees teilnehmen. Der Wert der Belohnungen in jeder Epoche wird aus einem `base_reward` berechnet. Von dieser Basiseinheit werden andere Belohnungen berechnet. Der `base_reward` stellt die durchschnittliche Belohnung dar, die ein Validator unter optimalen Bedingungen pro Epoche erhält. Sie wird wie folgt aus dem Effektivguthaben des Validatoren und der Gesamtzahl an aktiven Validatoren berechnet: ``` base_reward = effective_balance * (base_reward_factor / (base_rewards_per_epoch * sqrt(sum(active_balance)))) ``` -wenn `base_reward_factor` 64 ist, ist `base_rewards_per_epoch` 4 und `sum(active balance)` ist die Gesamtheit der eingesetzten Ether über alle aktiven Validatoren hinweg. +wobei `base_reward_factor` 64 ist, `base_rewards_per_epoch` 4 ist und `sum(active balance)` der gesamte gestakte Ether über alle aktiven Validatoren hinweg ist. -Das bedeutet, dass die Basisbelohnung proportional zum Effektivguthaben des Validatoren und invers proportional zur Anzahl der Validatoren auf dem Netzwerk ist. Je mehr Validatoren, desto höher die Gesamtausgabe (als `sqrt(N)`, aber desto kleiner die `base_reward` pro Validator (als `1/sqrt(N)`). Diese Faktoren beeinflussen die APR für das Staking eines Nodes. Lesen Sie die Gründe dafür in [Vitaliks Notizen](https://notes.ethereum.org/@vbuterin/rkhCgQteN?type=view#Basisbelohnungen). +Das bedeutet, dass die Basisbelohnung proportional zum Effektivguthaben des Validatoren und invers proportional zur Anzahl der Validatoren auf dem Netzwerk ist. Je mehr Validatoren, desto größer die Gesamtemission (als `sqrt(N)`), aber desto kleiner der `base_reward` pro Validator (als `1/sqrt(N)`). Diese Faktoren beeinflussen die APR für das Staking eines Nodes. Lesen Sie die Begründung dafür in [Vitaliks Notizen](https://notes.ethereum.org/@vbuterin/rkhCgQteN?type=view#Base-rewards). Die Gesamtbelohnung wird dann als die Summe von fünf Komponenten berechnet, die jeweils eine Gewichtung haben, mit der sich bestimmen lässt, wie viel jede Komponente zur Gesamtbelohnung beiträgt. Die Komponenten sind: ``` -1. source vote: the validator has made a timely vote for the correct source checkpoint -2. target vote: the validator has made a timely vote for the correct target checkpoint -3. head vote: the validator has made a timely vote for the correct head block -4. sync committee reward: the validator has participated in a sync committee -5. proposer reward: the validator has proposed a block in the correct slot +1. Source-Abstimmung: Der Validator hat rechtzeitig für den korrekten Source-Checkpoint gestimmt +2. Target-Abstimmung: Der Validator hat rechtzeitig für den korrekten Target-Checkpoint gestimmt +3. Head-Abstimmung: Der Validator hat rechtzeitig für den korrekten Head-Block gestimmt +4. Sync-Komitee-Belohnung: Der Validator hat an einem Sync-Komitee teilgenommen +5. Proposer-Belohnung: Der Validator hat einen Block im korrekten Slot vorgeschlagen ``` Die Gewichtungen für jede Komponoente lauten wie folgt: ``` -TIMELY_SOURCE_WEIGHT uint64(14) -TIMELY_TARGET_WEIGHT uint64(26) -TIMELY_HEAD_WEIGHT uint64(14) -SYNC_REWARD_WEIGHT uint64(2) -PROPOSER_WEIGHT uint64(8) +TIMELY_SOURCE_WEIGHT uint64(14) +TIMELY_TARGET_WEIGHT uint64(26) +TIMELY_HEAD_WEIGHT uint64(14) +SYNC_REWARD_WEIGHT uint64(2) +PROPOSER_WEIGHT uint64(8) ``` -Die Summe dieser Gewichte beträgt 64. Die Belohnung ergibt sich aus der Summe der anwendbaren Gewichte geteilt durch 64. Ein Validator, der rechtzeitig Quell-, Ziel- und Spitzenstimmen abgegeben, einen Block vorgeschlagen sowie an einem Synchronisierungs-Komitee teilgenommen hat, könnte `64/64 * base_reward == base_reward` erhalten. Jedoch ist ein Validator normalerweise kein Block-Proposer, weshalb seine maximale Belohnung `64-8 /64 * base_reward == 7/8 * base_reward` beträgt. Validatoren, die weder Block-Proposer noch in einem Synchronisierungskomitee sind, können `64-8-2 / 64 * base_reward == 6.75/8 * base_reward` erhalten. +Die Summe dieser Gewichte beträgt 64. Die Belohnung ergibt sich aus der Summe der anwendbaren Gewichte geteilt durch 64. Ein Validator, der rechtzeitig Source-, Target- und Head-Abstimmungen abgegeben, einen Block vorgeschlagen und an einem Sync-Komitee teilgenommen hat, könnte `64/64 * base_reward == base_reward` erhalten. Jedoch ist ein Validator normalerweise kein Block-Proposer, weshalb seine maximale Belohnung `64-8 /64 * base_reward == 7/8 * base_reward` beträgt. Validatoren, die weder Block-Proposer noch in einem Sync-Komitee sind, können `64-8-2 / 64 * base_reward == 6.75/8 * base_reward` erhalten. -Eine zusätzliche Belohnung wird als Anreiz für schnelle Attestierungen hinzugefügt. Dies ist die `inclusion_delay_reward`. Sie hat denselben Wert wie die `base_reward` mal `1/delay`, wobei `delay` die Anzahl an Slots ist, die das Block-Proposal und die Attestierungen trennen. Wird die Attestierung beispielsweise innerhalb eines Slots des Block-Proposals eingereicht, erhält der Attestierer `base_reward * 1/1 == base_reward`. Wenn die Attestierung im nächsten Slot eintrifft, erhält der Attestierer `base_reward * 1/2` und so weiter. +Eine zusätzliche Belohnung wird als Anreiz für schnelle Attestierungen hinzugefügt. Dies ist die `inclusion_delay_reward`. Dieser hat einen Wert, der dem `base_reward` multipliziert mit `1/delay` entspricht, wobei `delay` die Anzahl der Slots ist, die zwischen dem Block-Vorschlag und der Attestierung liegen. Wird die Attestierung beispielsweise innerhalb eines Slots des Block-Vorschlags eingereicht, erhält der Attestierer `base_reward * 1/1 == base_reward`. Wenn die Attestierung im nächsten Slot eintrifft, erhält der Attestierer `base_reward * 1/2` und so weiter. -Block-Proposer erhalten `8 / 64 * base_reward` für **jede im Block enthaltene gültige Attestierung**. Der echte Wert der Belohnung skaliert also mit der Anzahl an attestierenden Validatoren. Block-Proposer können ihre Belohnungen auch erhöhen, wenn sie Beweise für das Fehlverhalten anderer Validatoren in den von ihnen vorgeschlagenen Block mit aufnehmen. Diese Belohnungen sind das „Zuckerbrot“, das ehrliches Verhalten vonseiten der Validatoren fördert. Ein Block-Proposer einschließlich Slashing wird mit dem `slashed_validators_effective_balance / 512` belohnt. +Block-Proposer erhalten `8 / 64 * base_reward` für **jede gültige Attestierung**, die im Block enthalten ist, sodass der tatsächliche Wert der Belohnung mit der Anzahl der attestierenden Validatoren skaliert. Block-Proposer können ihre Belohnungen auch erhöhen, wenn sie Beweise für das Fehlverhalten anderer Validatoren in den von ihnen vorgeschlagenen Block mit aufnehmen. Diese Belohnungen sind das „Zuckerbrot“, das ehrliches Verhalten vonseiten der Validatoren fördert. Ein Block-Proposer, der ein Slashing enthält, wird mit `slashed_validators_effective_balance / 512` belohnt. ### Strafen {#penalties} Bisher haben wir uns nur mit Validatoren beschäftigt, die sich benehmenden. Was aber ist mit Validatoren, die nicht rechtzeitig für Spitze, Quelle und Ziel abstimmen oder dies nur langsam tun? -Die Strafen für das Verpassen der Ziel- und Quellstimmen entsprechen den Belohnungen, die der Attestierer erhalten hätte, wenn er sie eingereicht hätte. Das bedeutet, dass die Belohnung ihrem Guthaben nicht hinzugefügt wird, sondern der gleiche Wert von ihrem Guthaben abgezogen wird. Es gibt keine Strafe für das Verpassen der Spitzenabstimmung („Head Vote“) (d. h. für Spitzenabstimmungen gibt es nur Belohnungen, niemals Strafen). Es gibt keine mit der `inclusion_delay` verbundene Strafe – die Belohnung wird einfach nicht zum Guthaben des Validatoren hinzugefügt. Es gibt auch keine Strafe für das Versäumnis, einen Block vorzuschlagen. +Die Strafen für das Verpassen der Ziel- und Quellstimmen entsprechen den Belohnungen, die der Attestierer erhalten hätte, wenn er sie eingereicht hätte. Das bedeutet, dass die Belohnung ihrem Guthaben nicht hinzugefügt wird, sondern der gleiche Wert von ihrem Guthaben abgezogen wird. Es gibt keine Strafe für das Verpassen der Head-Abstimmung (d. h., Head-Abstimmungen werden nur belohnt, niemals bestraft). Es gibt keine mit `inclusion_delay` verbundene Strafe – die Belohnung wird einfach nicht zum Guthaben des Validators hinzugefügt. Es gibt auch keine Strafe für das Versäumnis, einen Block vorzuschlagen. -Lesen Sie mehr zu Belohnungen und Strafen in den [Konsensspezifikationen](https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/beacon-chain.md). Belohnungen und Strafen wurden im Bellatrix-Upgrade angepasst – sehen Sie zu, wie Danny Ryan und Vitalik dies in einem [Peep an EIP-Video](https://www.youtube.com/watch?v=iaAEGs1DMgQ) diskutieren. +Lesen Sie mehr über Belohnungen und Strafen in den [Konsens-Spezifikationen](https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/beacon-chain.md). Belohnungen und Strafen wurden im Bellatrix-Upgrade angepasst – sehen Sie, wie Danny Ryan und Vitalik dies in diesem [Peep an EIP-Video](https://www.youtube.com/watch?v=iaAEGs1DMgQ) diskutieren. ## Slashing {#slashing} @@ -70,20 +70,21 @@ Slashing ist eine schwerwiegendere Maßnahme, die zum gewaltsamen Ausschluss ein - duch das Attestieren für einen Block, der einen anderen „umgibt“ (was die Historie faktisch verändert) - durch „doppeltes Abstimmen“, indem für zwei Kandidaten für denselben Block attestiert wird -Wenn diese Aktionen erkannt werden, wird der Validator geslasht. Das bedeutet, dass 1/32 des von ihm eingesetzten Ether (bis zu maximal 1 Ether) direkt verbrannt werden, danach beginnt ein 36-tägiger Löschungszeitraum. Während dieses Löschungszeitraums verringert sich der Stake des Validatoren allmählich bis auf null. Zum Mittelpunkt (Tag 18) wird eine zusätzliche Strafe verhängt. Deren Höhe richtet sich nach dem Gesamteinsatz aller mit Slashing sanktionierten Validatoren in den 36 Tagen vor dem Slashing-Ereignis. Dies bedeutet, dass sich das Ausmaß des Slashings erhöht, wenn mehrere Validatoren mit Slashing bestraft werden. Der maximale Slashing-Betrag ist das volle Effektivguthaben aller Validatoren, die mit Slashing sanktioniert wurden (d. h. wenn viele Validatoren mit Slashing bestraft werden, könnten sie ihren gesamten Stake verlieren). Andererseits wird nach einem einzigen, isolierten Slashing-Ereignis nur ein kleiner Anteil des Validatoren-Stakes verbrannt. Diese mit der Anzahl der Validatoren skalierende Mittelpunktstrafe wird als „Korrelationsstrafe“ bezeichnet. +Wenn diese Aktionen erkannt werden, wird der Validator geslasht. Dies läuft in zwei Schritten ab: Zuerst werden bei einem 32-ETH-Validator sofort 0,0078125 ETH geburnt (linear abhängig vom aktiven Guthaben). Danach startet eine 36-tägige Austrittsperiode. Während dieses Löschungszeitraums verringert sich der Stake des Validatoren allmählich bis auf null. Zum Mittelpunkt (Tag 18) wird eine zusätzliche Strafe verhängt. Deren Höhe richtet sich nach dem Gesamteinsatz aller mit Slashing sanktionierten Validatoren in den 36 Tagen vor dem Slashing-Ereignis. Dies bedeutet, dass sich das Ausmaß des Slashings erhöht, wenn mehrere Validatoren mit Slashing bestraft werden. Der maximale Slash ist das gesamte effektive Guthaben aller geslashten Validatoren (d. h., wenn viele Validatoren geslasht werden, könnten sie ihren gesamten Stake verlieren). Andererseits wird nach einem einzigen, isolierten Slashing-Ereignis nur ein kleiner Anteil des Validatoren-Stakes verbrannt. Diese mit der Anzahl der Validatoren skalierende Mittelpunktstrafe wird als „Korrelationsstrafe“ bezeichnet. -## Inactivity Leak {#inactivity-leak} +## Inaktivitäts-Leck {#inactivity-leak} -Wenn es in der Konsensebene mehr als vier Epochen lang zu keiner Finalisierung kam, wird ein Notfallprotokoll namens „Inactivity Leak“ aktiviert. Das ultimative Ziel des Inactivity Leak ist es, die Bedingungen dafür zu schaffen, dass die Chain Endgültigkeit wiedererlangen kann. Wie oben erläutert erfordert die Endgültigkeit eine 2/3-Mehrheit des gesamten eingesetzten Ethers, um sich auf Quell- und Ziel-Checkpoints zu einigen. Wenn Validatoren, die mehr als 1/3 der gesamten Validatoren repräsentieren, offline gehen oder es versäumen, korrekten Attestierungen einzureichen, ist es für eine 2/3-Supermajority nicht möglich, die Checkpoints zu finalisieren. Das Inactivity Leak sorgt dafür, dass der Stake der inaktiven Validatoren allmählich verschwindet, bis sie weniger als 1/3 des gesamten Stakes kontrollieren, sodass die verbleibenden aktiven Validatoren die Chain finalisieren können. Wie groß der Pool der inaktiven Validatoren auch sein mag, die verbleibenden aktiven Validatoren werden schließlich >2/3 des Stakes kontrollieren. Der Verlust von Stake ist ein starker Anreiz für inaktive Validatoren, so schnell wie möglich wieder aktiv zu werden! Zu einem Szenario mit Inactivity Leak kam es auf dem Medalle-Testnetz, als \<66 % der aktiven Validatoren in der Lage waren, einen Konsens zur derzeitigen Spitze der Blockchain zu erreichen. Das Inactivity Leak wurde aktiviert und später wurde die Endgültigkeit zurückgewonnen! +Wenn es in der Konsensebene mehr als vier Epochen lang zu keiner Finalisierung kam, wird ein Notfallprotokoll namens „Inactivity Leak“ aktiviert. Das ultimative Ziel des Inactivity Leak ist es, die Bedingungen dafür zu schaffen, dass die Chain Endgültigkeit wiedererlangen kann. Wie oben erläutert erfordert die Endgültigkeit eine 2/3-Mehrheit des gesamten eingesetzten Ethers, um sich auf Quell- und Ziel-Checkpoints zu einigen. Wenn Validatoren, die mehr als 1/3 der gesamten Validatoren repräsentieren, offline gehen oder es versäumen, korrekten Attestierungen einzureichen, ist es für eine 2/3-Supermajority nicht möglich, die Checkpoints zu finalisieren. Das Inactivity Leak sorgt dafür, dass der Stake der inaktiven Validatoren allmählich verschwindet, bis sie weniger als 1/3 des gesamten Stakes kontrollieren, sodass die verbleibenden aktiven Validatoren die Chain finalisieren können. Wie groß der Pool der inaktiven Validatoren auch sein mag, die verbleibenden aktiven Validatoren werden schließlich >2/3 des Stakes kontrollieren. Der Verlust von Stake ist ein starker Anreiz für inaktive Validatoren, so schnell wie möglich wieder aktiv zu werden! Zu einem Szenario mit Inactivity Leak kam es auf dem Medalle-Testnetz, als <66 % der aktiven Validatoren in der Lage waren, einen Konsens zur derzeitigen Spitze der Blockchain zu erreichen. Das Inactivity Leak wurde aktiviert und später wurde die Endgültigkeit zurückgewonnen! Das Belohnungs-, Strafen- und Slashing-Design des Konsensmechanismus ermutigt die einzelnen Validatoren dazu, sich korrekt zu verhalten. Aus diesen Designentscheidungen ergibt sich jedoch ein System, das starke Anreize für eine gleichmäßige Verteilung der Validatoren auf mehrere Clients setzt und die Anreize zur Dominanz eines einzelnen Clients stark reduzieren sollte. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Upgrading Ethereum: The incentive layer](https://eth2book.info/altair/part2/incentives) -- [Incentives in Ethereum's hybrid Casper protocol](https://arxiv.org/pdf/1903.04205.pdf) -- [Vitalik's annotated spec](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#rewards-and-penalties-1) -- [Eth2 Slashing Prevention Tips](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50) +- [Ethereum upgraden: Die Anreizebene](https://eth2book.info/altair/part2/incentives) +- [Anreize im hybriden Casper-Protokoll von Ethereum](https://arxiv.org/pdf/1903.04205.pdf) +- [Vitaliks kommentierte Spezifikation](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#rewards-and-penalties-1) +- [Eth2-Tipps zur Slashing-Prävention](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50) +- [Analyse der Slashing-Strafen unter EIP-7251](https://ethresear.ch/t/slashing-penalty-analysis-eip-7251/16509) _Quellen_ diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md index acb801f2e33..c9f74d9125b 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md @@ -8,17 +8,17 @@ Subjektivität in Blockchains bezieht sich auf die Abhängigkeit davon, dass soz ## Voraussetzungen {#prerequisites} -Um diese Seite zu verstehen, müssen zuerst die Grundlagen von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) verstanden werden. +Um diese Seite zu verstehen, ist es notwendig, zunächst die Grundlagen von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) zu verstehen. ## Welche Probleme löst die schwache Subjektivität? {#problems-ws-solves} Subjektivität ist bei Proof-of-Stake-Blockchains inhärent, da die Auswahl der korrekten Chain aus mehreren Abspaltungen durch das Zählen historischer Stimmen erfolgt. Dies setzt die Blockchain mehreren Angriffsvektoren aus. Dazu gehören auch Langstreckenangriffe, bei denen Nodes, die sehr früh an der Chain beteiligt waren, eine alternative Abspaltung aufrechterhalten, die sie viel später zu ihrem eigenen Vorteil freigeben. Wenn 33 % der Validatoren ihren Stake zurückziehen, jedoch weiter attestieren und Blöcke produzieren, könnten diese andererseits eine alternative Abspaltung generieren, die mit der kanonischen Chain in Konflikt steht. Neue Nodes oder Nodes, die lange Zeit offline waren, wissen möglicherweise nicht, dass diese angreifenden Validatoren ihre Geldmittel zurückgezogen haben. Angreifer könnten sie also dazu bringen, einer falschen Chain zu folgen. Ethereum kann dieses Problem mit Angriffsvektoren lösen, indem es Beschränkungen auferlegt, die die subjektiven Aspekte des Mechanismus – und damit die Vertrauensannahmen – auf das absolute Minimum reduziert. -## Checkpoints von schwacher Subjektivität {#ws-checkpoints} +## Checkpoints schwacher Subjektivität {#ws-checkpoints} -Schwache Subjektivität wird in Proof-of-Stake-Ethereum durch die Verwendung von „Checkpoints von schwacher Subjektivität“ implementiert. Dabei handelt es sich um State Roots, bei denen sich alle Nodes auf dem Netzwerk einig sind, dass sie zur kanonischen Chain gehören. Sie dienen demselben Zweck der „universellen Wahrheit“ wie Genesis-Blöcke, nur dass sie nicht an der Genesis-Position in der Blockchain sitzen. Der Abspaltungs-Wahl-Algorithmus vertraut darauf, dass der in diesem Checkpoint definierte Blockchain-Zustand korrekt ist und dass er die Chain von diesem Punkt an unabhängig und objektiv verifiziert. Die Checkpoints fungieren als „Rückkehrlimits“, da Blöcke, die sich vor Checkpoints von schwacher Subjektivität befinden, nicht verändert werden können. Dies untergräbt Langstreckenangriffe, indem Langstreckenabspaltungen als Teil des Mechanismusdesigns einfach als ungültig definiert werden. Wenn die Checkpoints von schwacher Subjektivität in einem geringeren Abstand zueinander liegen als der Zeitraum, in dem die Validatoren ihre Stakes zurückziehen können, wird sichergestellt, dass ein Validator, der die Chain aufspaltet, zumindest um einen gewissen Schwellenwert geslasht wird, bevor er seinen Stake abziehen kann, und dass neue Teilnehmer nicht von Validatoren, deren Stakes abgezogen wurden, zu falschen Abspaltungen verleitet werden können. +Schwache Subjektivität wird in Proof-of-Stake-Ethereum durch die Verwendung von „Checkpoints von schwacher Subjektivität“ implementiert. Dabei handelt es sich um State Roots, bei denen sich alle Nodes auf dem Netzwerk einig sind, dass sie zur kanonischen Chain gehören. Sie dienen demselben Zweck der „universellen Wahrheit“ wie Genesis-Blöcke, mit der Ausnahme, dass sie sich nicht an der Genesis-Position in der Blockchain befinden. Der Abspaltungs-Wahl-Algorithmus vertraut darauf, dass der in diesem Checkpoint definierte Blockchain-Zustand korrekt ist und dass er die Chain von diesem Punkt an unabhängig und objektiv verifiziert. Die Checkpoints fungieren als „Rückkehrlimits“, da Blöcke, die sich vor Checkpoints von schwacher Subjektivität befinden, nicht verändert werden können. Dies untergräbt Langstreckenangriffe, indem Langstreckenabspaltungen als Teil des Mechanismusdesigns einfach als ungültig definiert werden. Wenn die Checkpoints von schwacher Subjektivität in einem geringeren Abstand zueinander liegen als der Zeitraum, in dem die Validatoren ihre Stakes zurückziehen können, wird sichergestellt, dass ein Validator, der die Chain aufspaltet, zumindest um einen gewissen Schwellenwert geslasht wird, bevor er seinen Stake abziehen kann, und dass neue Teilnehmer nicht von Validatoren, deren Stakes abgezogen wurden, zu falschen Abspaltungen verleitet werden können. -## Unterschiede zwischen Checkpoints von schwacher Subjektivität und finalisierten Blöcken {#difference-between-ws-and-finalized-blocks} +## Unterschied zwischen Checkpoints schwacher Subjektivität und finalisierten Blöcken {#difference-between-ws-and-finalized-blocks} Finalisierte Blöcke und Checkpoints von schwacher Subjektivität werden von Ethereum-Nodes unterschiedlich behandelt. Wenn ein Node von zwei konkurrierenden finalisierten Blöcken erfährt, ist er zwischen den beiden hin- und hergerissen – er hat keine Möglichkeit, automatisch zu erkennen, welche die kanonische Abspaltung ist. Das ist symptomatisch für ein Konsensversagen. Im Gegensatz dazu lehnt ein Node einfach jeden Block ab, der im Widerspruch zu seinem Checkpoint von schwacher Subjektivität steht. Aus Sicht des Nodes stellt der Checkpoint von schwachen Subjektivität eine absolute Wahrheit dar, die nicht durch neues Wissen seiner Peers untergraben werden kann. @@ -30,10 +30,10 @@ Ein Checkpoint von schwacher Subjektivität könnte sogar als Teil der Client-So Schließlich können Checkpoints von anderen Nodes angefordert werden; möglicherweise kann ein anderer Ethereum-Benutzer, der einen vollständigen Node betreibt, einen Checkpoint bereitstellen, den Validatoren dann mit Daten von einem Block-Explorer abgleichen können. Insgesamt kann das Vertrauen in den Anbieter eines Checkpoints von schwachen Subjektivität als ebenso problematisch angesehen werden wie das Vertrauen in die Client-Entwickler. Das erforderliche Vertrauen ist insgesamt gering. Es ist wichtig, darauf hinzuweisen, dass diese Überlegungen nur in dem sehr unwahrscheinlichen Fall wichtig werden, dass sich eine Mehrheit der Validatoren zusammenschließt, um eine alternative Abspaltung der Blockchain zu produzieren. Unter allen anderen Umständen gibt es nur eine Ethereum-Chain, aus der gewählt werden kann. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Weak subjectivity in Eth2](https://notes.ethereum.org/@adiasg/weak-subjectvity-eth2) -- [Vitalik: How I learned to love weak subjectivity](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) -- [Weak subjectivity (Teku docs)](https://docs.teku.consensys.net/en/latest/Concepts/Weak-Subjectivity/) -- [Phase-0 Weak subjectivity guide](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/weak-subjectivity.md) -- [Analysis of weak subjectivity in Ethereum 2.0](https://github.com/runtimeverification/beacon-chain-verification/blob/master/weak-subjectivity/weak-subjectivity-analysis.pdf) +- [Schwache Subjektivität in Eth2](https://notes.ethereum.org/@adiasg/weak-subjectvity-eth2) +- [Vitalik: Wie ich lernte, die schwache Subjektivität zu lieben](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) +- [Schwache Subjektivität (Teku-Dokumentation)](https://docs.teku.consensys.io/concepts/weak-subjectivity) +- [Phase-0-Leitfaden zur schwachen Subjektivität](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/weak-subjectivity.md) +- [Analyse der schwachen Subjektivität in Ethereum 2.0](https://github.com/runtimeverification/beacon-chain-verification/blob/master/weak-subjectivity/weak-subjectivity-analysis.pdf) diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/index.md index 38aaa8fad6d..c2520f5d121 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/index.md @@ -17,11 +17,11 @@ Das Ethereum-Netzwerk hat zu Beginn einen Konsensmechanismus verwendet, der **[P ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zuerst etwas über [Transaktionen](/developers/docs/transactions/), [Blöcke](/developers/docs/blocks/) und [Konsensmechanismen](/developers/docs/consensus-mechanisms/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [Transaktionen](/developers/docs/transactions/), [Blöcke](/developers/docs/blocks/) und [Konsensmechanismen](/developers/docs/consensus-mechanisms/) zu informieren. ## Was ist Proof-of-Work (PoW)? {#what-is-pow} -Der Nakamoto-Konsens, der Proof-of-Work nutzt, ist der Mechanismus, der es dem dezentralisierten Ethereum-Netzwerk früher ermöglichte, einen Konsens zu erzielen (d. h., alle Knoten stimmen überein) – beispielsweise über Kontostände und die Reihenfolge von Transaktionen. Das verhinderte, dass Benutzer ihre Münzen „doppelt ausgeben“ konnten, und stellte sicher, dass die Ethereum-Kette extrem schwierig anzugreifen oder zu manipulieren war. Diese Sicherheitseigenschaften stammen jetzt stattdessen von Proof-of-Stake – unter Verwendung des Konsensmechanismus [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/). +Der Nakamoto-Konsens, der Proof-of-Work nutzt, ist der Mechanismus, der es dem dezentralisierten Ethereum-Netzwerk früher ermöglichte, einen Konsens zu erzielen (d. h., alle Knoten stimmen überein) – beispielsweise über Kontostände und die Reihenfolge von Transaktionen. Das verhinderte, dass Benutzer ihre Münzen „doppelt ausgeben“ konnten, und stellte sicher, dass die Ethereum-Kette extrem schwierig anzugreifen oder zu manipulieren war. Diese Sicherheitseigenschaften stammen nun stattdessen von Proof-of-Stake, wobei der als [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) bekannte Konsensmechanismus verwendet wird. ## Proof-of-Work und Mining {#pow-and-mining} @@ -34,12 +34,12 @@ Proof-of-Work ist der grundlegende Algorithmus, der den Schwierigkeitsgrad und d Ethereums Transaktionen werden zu Blöcken verarbeitet. Im mittlerweile veralteten Proof-of-Work-Ethereum enthielt jeder Block: - einen Block-Schwierigkeitsgrad – zum Beispiel: 3.324.092.183.262.715, -- einen mixHash – zum Beispiel, `0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29`, -- eine Nonce – zum Beispiel: `0xd3ee432b4fb3d26b`. +- mixHash – zum Beispiel: `0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29` +- Nonce – zum Beispiel: `0xd3ee432b4fb3d26b` Diese Blockdaten standen in direktem Zusammenhang zu Proof-of-Work. -### Die "Arbeit" (Work) in Proof-of-Work {#the-work} +### Die „Arbeit“ in Proof-of-Work {#the-work} Ethash, das Proof-of-Work-Protokoll, verlangte von Minern, dass sie sich an einem intensiven Trial-and-Error-Wettlauf beteiligten, um die Nonce für einen Block zu finden. Nur Blöcke mit einer gültigen Nonce konnten zur Kette hinzugefügt werden. @@ -49,7 +49,7 @@ Die Schwierigkeit bestimmte das Ziel für den Hash. Je niedriger das Ziel, desto „Hashing“ macht es leichter, Betrug zu erkennen. Aber auch der Proof-of-Work-Prozess selbst war eine große Abschreckung für Angriffe auf die Chain. -### Sicherheit von Proof-of-Work {#security} +### Proof-of-Work und Sicherheit {#security} Die Miner wurden dazu angeregt, diese Arbeit auf der Haupt-Kette von Ethereum zu leisten. Für Untergruppen von Minern gab es wenig Anreiz, eine eigene Kette zu starten – das untergräbt das System. Bockchains verlassen sich auf einen einzigen Status als Quelle der Wahrheit. @@ -61,7 +61,7 @@ Um konsequent bösartige, aber gültige Blöcke zu erstellen, hätte ein bösart Proof-of-Work war auch dafür verantwortlich, neue Währung in das System einzuspeisen und Miner zur Ausführung der Arbeit zu motivieren. -Seit dem [Konstantinopel-Upgrade](/ethereum-forks/#constantinople) wurden Miner, die erfolgreich einen Block erstellen, mit zwei frisch geprägten ETH und einem Teil der Transaktionsgebühren belohnt. Ommer-Blöcke wurden ebenfalls mit 1,75 ETH vergütet. Ommer-Blöcke waren gültige Blöcke, die von einem Miner praktisch zur selben Zeit erstellt wurden wie ein durch einen anderen Miner erstellter kanonischer Block. Die endgültige Bestimmung erfolgte anhand der Kette, auf die zuerst aufgebaut wurde. Zu Ommer-Blöcken kam es in der Regel durch Netzwerklatenzen. +Seit dem [Constantinople-Upgrade](/ethereum-forks/#constantinople) wurden Miner, die erfolgreich einen Block erstellen, mit zwei frisch geprägten ETH und einem Teil der Transaktionsgebühren belohnt. Ommer-Blöcke wurden ebenfalls mit 1,75 ETH vergütet. Ommer-Blöcke waren gültige Blöcke, die von einem Miner praktisch zur selben Zeit erstellt wurden wie ein durch einen anderen Miner erstellter kanonischer Block. Die endgültige Bestimmung erfolgte anhand der Kette, auf die zuerst aufgebaut wurde. Zu Ommer-Blöcken kam es in der Regel durch Netzwerklatenzen. ## Endgültigkeit {#finality} @@ -73,15 +73,15 @@ Um es noch komplizierter zu machen, wurden Transaktionen, die auf der temporäre ## Energieverbrauch von Proof-of-Work {#energy} -Ein Hauptkritikpunkt an Proof-of-Work ist die Menge an Energie, die benötigt wird, um das Netzwerk sicher zu halten. Um Sicherheit und Dezentralisierung zu erhalten, verbrauchte Ethereums Proof-of-Work große Mengen an Energie. Kurz vor der Umstellung auf Proof-of-Stake verbrauchten die Ethereum-Miner zusammen etwa 70 TWh/Jahr (ungefähr so viel wie die Tschechische Republik – laut [digiconomist](https://digiconomist.net/) am 18. Juli 2022). +Ein Hauptkritikpunkt an Proof-of-Work ist die Menge an Energie, die benötigt wird, um das Netzwerk sicher zu halten. Um Sicherheit und Dezentralisierung zu erhalten, verbrauchte Ethereums Proof-of-Work große Mengen an Energie. Kurz vor der Umstellung auf Proof-of-Stake verbrauchten die Ethereum-Miner zusammen etwa 70 TWh/Jahr (etwa so viel wie die Tschechische Republik – laut [digiconomist](https://digiconomist.net/) am 18. Juli 2022). -## Vor- und Nachteile {#pros-and-cons} +## Pro und Kontra {#pros-and-cons} -| Vorteile | Nachteile | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | -| Proof-of-Work ist neutral. Du brauchst keine ETH, um loszulegen, und die Blockbelohnungen erlauben dir von 0 ETH auf einen positiven Kontostand zu kommen. Für [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) brauchst du zu Beginn ETH. | Proof-of-Work verbraucht so viel Energie, dass es schlecht für die Umwelt ist. | -| Proof-of-Work ist ein bewährter Konsensmechanismus, der Bitcoin und Ethereum seit vielen Jahren sicher und dezentralisiert macht. | Wenn du Mining betreiben willst, brauchst du eine so spezielle Ausrüstung, dass es eine große Investition ist, damit anzufangen. | -| Verglichen mit dem Proof-of-Stake ist es relativ einfach zu implementieren. | Da immer mehr Rechenleistung benötigt wird, könnten Mining-Pools das Mining-Geschäft dominieren, was zu Zentralisierung und Sicherheitsrisiken führt. | +| Pro | Nachteile | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Proof-of-Work ist neutral. Du brauchst keine ETH, um loszulegen, und die Blockbelohnungen erlauben dir von 0 ETH auf einen positiven Kontostand zu kommen. Mit [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) benötigen Sie zu Beginn ETH. | Proof-of-Work verbraucht so viel Energie, dass es schlecht für die Umwelt ist. | +| Proof-of-Work ist ein bewährter Konsensmechanismus, der Bitcoin und Ethereum seit vielen Jahren sicher und dezentralisiert macht. | Wenn du Mining betreiben willst, brauchst du eine so spezielle Ausrüstung, dass es eine große Investition ist, damit anzufangen. | +| Verglichen mit dem Proof-of-Stake ist es relativ einfach zu implementieren. | Da immer mehr Rechenleistung benötigt wird, könnten Mining-Pools das Mining-Geschäft dominieren, was zu Zentralisierung und Sicherheitsrisiken führt. | ## Vergleich mit Proof-of-Stake {#compared-to-pos} @@ -94,14 +94,14 @@ Im Großen und Ganzen hat Proof-of-Stake dasselbe Ziel wie Proof-of-Work: dem de [Mehr über Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) -## Eher ein visueller Lerner? {#visual-learner} +## Eher der visuelle Lernende? {#visual-learner} -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Mehrheitsangriff](https://en.bitcoin.it/wiki/Majority_attack) -- [Zur Endgültigkeit der Abrechnung](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) +- [Über die Endgültigkeit der Abwicklung](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) ### Videos {#videos} diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/index.md index c015f445a5a..c67c4a03ce8 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/index.md @@ -8,14 +8,14 @@ lang: de -Proof-of-Work ist nicht mehr der zugrunde liegende Konsensmechanismus von Ethereum, was bedeutet, dass das Mining ausgeschaltet wurde. Stattdessen wird Ethereum von Validatoren gesichert, die ETH staken. Du kannst schon heute mit dem Staking deiner ETH beginnen. Lese mehr dazu unter den Merge, Proof-of-Stake, und Staking. Diese Seite dient ausschließlich zu Archivierungszwecken, um Ereignisse rund um Ethereum zu dokumentieren. +Proof-of-Work ist nicht mehr der zugrunde liegende Konsensmechanismus von Ethereum, was bedeutet, dass das Mining ausgeschaltet wurde. Stattdessen wird Ethereum von Validatoren gesichert, die ETH staken. Sie können schon heute mit dem Staking von ETH beginnen. Lese mehr dazu unter den Merge, Proof-of-Stake, und Staking. Diese Seite dient ausschließlich dem geschichtlichen Interesse.
## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst [Transaktionen](/developers/docs/transactions/), [Blöcke](/developers/docs/blocks/) und [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [Transaktionen](/developers/docs/transactions/), [Blöcke](/developers/docs/blocks/) und [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) zu informieren. ## Was ist Ethereum-Mining? {#what-is-ethereum-mining} @@ -31,41 +31,41 @@ Mining ist das Lebenselixier jeder Proof-of-Work Blockchain. Ethereum-Miner – In dezentralisierten Systemen wie Ethereum müssen wir sicherstellen, dass jeder mit der Reihenfolge der Transaktionen einverstanden ist. Miner halfen dabei, indem sie rechnerisch schwierige Puzzles lösten, um Blöcke zu produzieren und dabei das Netzwerk vor Attacken zu schützen. -[Mehr zu Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) +[Mehr über Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) Zuvor war es jedem möglich, mit dem eigenen Computer im Ethereum-Netzwerk zu minen. Allerdings konnte nicht jeder profitabel Ether (ETH) minen. In den meisten Fällen mussten Miner dedizierte Computer-Hardware kauften und Zugang zu günstigen Energiequellen haben. Es war unwahrscheinlich, dass ein durchschnittlicher Computer genug Blockbelohnungen verdienen konnte, um die Kosten für das Mining zu kompensieren. -### Mining-Kosten {#cost-of-mining} +### Kosten des Minings {#cost-of-mining} - Mögliche Kosten für die Hardware, die für den Bau und die Wartung einer Mining-Anlage erforderlich ist - Stromkosten für den Betrieb der Mining-Anlage - Wenn man Miner in einem Pool war, erhob der Pool üblicherweise eine pauschale prozentuale Gebühr für jeden im Pool generierten Block - Mögliche Kosten für die Ausrüstung zur Unterstützung der Mining-Anlage (Belüftung, Energieüberwachung, elektrische Verkabelung usw.) -Um die Rentabilität des Minings weiterzuerkunden, können Sie einen Mining-Rechner verwenden, beispielsweise den von [Etherscan](https://etherscan.io/ether-mining-calculator). +Um die Rentabilität des Minings weiter zu erkunden, verwenden Sie einen Mining-Rechner, wie ihn [Etherscan](https://etherscan.io/ether-mining-calculator) zur Verfügung stellt. ## Wie Ethereum-Transaktionen gemint wurden {#how-ethereum-transactions-were-mined} Im Folgenden wird ein Überblick darüber gegeben, wie Transaktionen in Ethereum-Proof-of-Work gemint wurden. Eine analoge Beschreibung dieses Prozesses für Ethereum-Proof-of-Stake finden Sie [hier](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos). -1. Ein Benutzer schreibt und signiert eine Anfrage für eine [Transaktion](/developers/docs/transactions/) mit seinem privaten Schlüssel von einem [Konto](/developers/docs/accounts/). -2. Der Benutzer überträgt die Transaktionsanfrage von einigen [Nodes](/developers/docs/nodes-and-clients/) an das gesamte Ethereum-Netzwerk. +1. Ein Benutzer schreibt und signiert eine [Transaktions](/developers/docs/transactions/)anfrage mit dem privaten Schlüssel eines [Kontos](/developers/docs/accounts/). +2. Der Benutzer überträgt die Transaktionsanfrage von einem [Node](/developers/docs/nodes-and-clients/) aus an das gesamte Ethereum-Netzwerk. 3. Wenn sie von der neuen Transaktionsanfrage hören, fügen alle Nodes die Anfrage ihrem lokalen Mempool (eine Liste aller Transaktionsanfragen, die noch nicht an die Blockchain übertragen wurden, von denen sie gehört haben) hinzu. -4. Irgendwann fasst ein Mining-Node mehrere Dutzend oder Hundert Transaktionsanfragen in einem potenziellen [Block](/developers/docs/blocks/) zusammen, sodass die [Transaktionsentgelte](/developers/docs/gas/), die sie verdienen, maximiert werden, während sie unter dem Block-Ressourcen-Limit bleiben. Zu diesem Zeitpunkt tut der Mining-Node Folgendes: - 1. Er überprüft die Gültigkeit jeder Transaktionsanfrage (z. B. es versucht keiner, die Ether von einem Konto ohne Signatur zu transferieren, die Anfrage ist nicht fehlerhaft etc.), führt dann den Code der Anfrage aus und ändert den Status ihrer lokalen Kopie der EVM. Die Miner erhalten die Transaktionsentgelte für jede dieser Transaktionsanfragen auf ihr eigenes Konto. +4. Irgendwann fasst ein Mining-Node mehrere Dutzend oder Hundert Transaktionsanfragen in einem potenziellen [Block](/developers/docs/blocks/) so zusammen, dass die [Transaktionsgebühren](/developers/docs/gas/), die er verdient, maximiert werden, während das Gaslimit des Blocks eingehalten wird. Zu diesem Zeitpunkt tut der Mining-Node Folgendes: + 1. Überprüft die Gültigkeit jeder Transaktionsanfrage (d. h., niemand versucht, Ether von einem Konto zu überweisen, für das keine Signatur erstellt wurde, die Anfrage nicht fehlerhaft ist usw.), und führt dann den Code der Anfrage aus, was den Zustand der lokalen Kopie der EVM ändert. Die Miner erhalten die Transaktionsentgelte für jede dieser Transaktionsanfragen auf ihr eigenes Konto. 2. Startet den Prozess der Erstellung des Proof-of-Work "Nachweiszertifikat der Legitimität" für den potenziellen Block, sobald alle Transaktionsanfragen in dem Block verifiziert und in der lokalen EVM-Kopie ausgeführt wurden. 5. Letztendlich wird ein Miner ein Zertifikat für einen Block erstellen, der unsere spezifische Transaktionsanfrage enthält. Dieser Miner sendet dann den vollendeten Block, der das Zertifikat und eine Prüfsumme des beanspruchten neuen EVM-Status enthält. 6. Andere Nodes hören von dem neuen Block. Sie prüfen das Zertifikat, führen alle Transaktionen in dem Block selbst aus (einschließlich der ursprünglich von unserem Nutzer übermittelten Transaktion) und überprüfen, ob die Prüfsumme von ihrem neuem EVM-Status nach der Ausführung aller Transaktionen mit der Prüfsumme aus dem vom Miner-Block selbst behaupteten Status übereinstimmt. Nur dann fügen diese Nodes den Block an den Schwanz ihrer Blockchain an und akzeptieren den neuen EVM-Status als kanonischen Status. 7. Jeder Node entfernt alle Transaktionen in dem neuen Block aus seinem lokalen Mempool aus unerfüllten Transaktionsanfragen. 8. Neue Knoten, die dem Netzwerk beitreten, laden alle Blöcke in Reihenfolge herunter, einschließlich des Blocks mit der von uns vefolgten Transaktion. Sie initialisieren eine lokale EVM-Kopie (diese startet als ein leerer EVM-Status), gehen dann durch den Ausführungsprozess jeder Transaktion in jedem Block an der Spitze der lokalen EVM-Kopie und überprüfen dabei in jedem Block die Prüfsummenstatus. -Jede Transaktion wird einmal gemint (in einen neuen Block eingeschlossen und zum ersten Mal propagiert), aber von jedem Teilnehmer im Prozess der Weitergabe des kanonischen EVM-Status ausgeführt und verifiziert. Dies hebt eines der wichtigsten Mantras der Blockchain hervor: **Nicht vertrauen – prüfen**. +Jede Transaktion wird einmal gemint (in einen neuen Block eingeschlossen und zum ersten Mal propagiert), aber von jedem Teilnehmer im Prozess der Weitergabe des kanonischen EVM-Status ausgeführt und verifiziert. Dies unterstreicht eines der zentralen Mantras der Blockchain: **Nicht vertrauen, sondern verifizieren**. -## Ommer(Onkel)-Blöcke {#ommer-blocks} +## Ommer-Blöcke (Onkel-Blöcke) {#ommer-blocks} -Das Mining von Blöcken bei Proof-of-Work war probabilistisch, was bedeutet, dass manchmal aufgrund von Netzwerklatenz gleichzeitig zwei gültige Blöcke veröffentlicht wurden. In diesem Fall musste das Protokoll die längste (und daher „gültigste“) Kette bestimmen und gleichzeitig Fairness gegenüber den Minern gewährleisten, indem es den vorgeschlagenen, aber nicht einbezogenen gültigen Block teilweise belohnte. Das förderte eine weitere Dezentralisierung des Netzwerks, da kleinere Miner, die möglicherweise mit größerer Latenz konfrontiert sind, immer noch Erträge durch [Ommer](/glossary/#ommer)-Blockbelohnungen generieren konnten. +Das Mining von Blöcken bei Proof-of-Work war probabilistisch, was bedeutet, dass manchmal aufgrund von Netzwerklatenz gleichzeitig zwei gültige Blöcke veröffentlicht wurden. In diesem Fall musste das Protokoll die längste (und daher „gültigste“) Kette bestimmen und gleichzeitig Fairness gegenüber den Minern gewährleisten, indem es den vorgeschlagenen, aber nicht einbezogenen gültigen Block teilweise belohnte. Dies förderte die weitere Dezentralisierung des Netzwerks, da kleinere Miner, die möglicherweise mit einer größeren Latenz konfrontiert sind, über [Ommer](/glossary/#ommer)-Blockbelohnungen immer noch Renditen erwirtschaften konnten. -Der Begriff „Ommer" ist der bevorzugte geschlechtsneutrale Begriff für das Geschwisterteil eines Elternblocks, aber manchmal ist auch die Rede von „Onkel". **Seit dem Übergang von Ethereum zu Proof-of-Stake werden keine Ommer-Blöcke mehr gemint**, da in jedem Slot nur ein Vorschlaggeber gewählt wird. Sie können diese Veränderung im [Geschichtsdiagramm](https://ycharts.com/indicators/ethereum_uncle_rate) der geminten Ommer-Blöcke einsehen. +Der Begriff „Ommer" ist der bevorzugte geschlechtsneutrale Begriff für das Geschwisterteil eines Elternblocks, aber manchmal ist auch die Rede von „Onkel". **Seit dem Übergang von Ethereum auf Proof-of-Stake werden keine Ommer-Blöcke mehr gemint**, da in jedem Slot nur ein Vorschlaggeber gewählt wird. Diese Änderung können Sie im [historischen Diagramm](https://ycharts.com/indicators/ethereum_uncle_rate) der geminten Ommer-Blöcke einsehen. ## Eine visuelle Demo {#a-visual-demo} @@ -75,12 +75,12 @@ Sehen Sie Austin bei einer Führung durch das Mining und die Proof-of-Work-Block ## Der Mining-Algorithmus {#mining-algorithm} -Das Ethereum-Mainnet hat immer nur einen Mining-Algorithmus verwendet – [„Ethash“](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/). Ethash war der Nachfolger eines ursprünglichen Algorithmus für Forschung und Entwicklung namens [„Dagger-Hashimoto“](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/). +Das Ethereum Mainnet hat immer nur einen einzigen Mining-Algorithmus verwendet – ['Ethash'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/). Ethash war der Nachfolger eines ursprünglichen F&E-Algorithmus, der als ['Dagger-Hashimoto'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/) bekannt war. [Mehr über Mining-Algorithmen](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/). ## Verwandte Themen {#related-topics} -- [Ressourcen](/developers/docs/gas/) +- [Gas](/developers/docs/gas/) - [EVM](/developers/docs/evm/) -- [Proof-of-Work (Arbeitsnachweis)](/developers/docs/consensus-mechanisms/pow/) +- [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index 4279b0f0273..199e970d62d 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -4,32 +4,32 @@ description: Dagger-Hashimoto-Algorithmus im Detail. lang: de --- -Dagger-Hashimoto war die ursprüngliche Forschungsimplementierung und Spezifikation für den Mining-Algorithmus von Ethereum. Dagger-Hashimoto wurde durch [Ethash](#ethash) abgelöst. Das Mining wurde mit [der Zusammenführung](/roadmap/merge/) am 15. September 2022 komplett ausgeschaltet. Seitdem wird die Sicherheit von Ethereum durch einen [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos)-Mechanismus gewährleistet. Diese Seite dient dem geschichtlichen Interesse – die Informationen hier sind seit der Zusammenführung für Ethereum nicht mehr relevant. +Dagger-Hashimoto war die ursprüngliche Forschungsimplementierung und Spezifikation für den Mining-Algorithmus von Ethereum. Dagger-Hashimoto wurde durch [Ethash](#ethash) abgelöst. Das Mining wurde mit [der Zusammenführung](/roadmap/merge/) am 15. September 2022 komplett abgeschaltet. Seitdem wird Ethereum stattdessen über einen [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos)-Mechanismus gesichert. Diese Seite dient dem geschichtlichen Interesse – die Informationen hier sind seit der Zusammenführung für Ethereum nicht mehr relevant. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst in den [Proof-of-Work-Konsens](/developers/docs/consensus-mechanisms/pow), das [Mining](/developers/docs/consensus-mechanisms/pow/mining) und [Mining-Algorithmen](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms) einzulesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über den [Proof-of-Work-Konsens](/developers/docs/consensus-mechanisms/pow), das [Mining](/developers/docs/consensus-mechanisms/pow/mining) und [Mining-Algorithmen](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms) zu informieren. ## Dagger-Hashimoto {#dagger-hashimoto} Dagger-Hashimoto will zwei Ziele erreichen: -1. **ASIC-Resistenz**: Der Vorteil der Erstellung von spezieller Hardware für den Algorithmus sollte so gering wie möglich sein. -2. **Light-Client-Verifizierbarkeit**: Ein Block sollte durch einen Light-Client effizient verifiziert werden können. +1. **ASIC-Resistenz**: Der Nutzen aus der Erstellung spezialisierter Hardware für den Algorithmus sollte so gering wie möglich sein. +2. **Light-Client-Verifizierbarkeit**: Ein Block sollte durch einen Light-Client effizient verifiziert werden können. Durch eine weitere Modifikation spezifizieren wir außerdem, wie – sofern gewünscht – ein drittes Ziel erreicht wird, was jedoch zusätzliche Komplexität mit sich bringt: -**Speichern der vollen Kette**: Mining sollte das Speichern des gesamten Blockchain-Status erfordern (wegen der irregulären Struktur des Ethereum-Statusbaums wird erwartet, dass einige Kürzungen möglich sein werden, insbedondere von eingen oft genutzten Contracts; dies soll aber minimiert werden). +**Speicherung der gesamten Kette**: Mining sollte die Speicherung des kompletten Blockchain-Zustands erfordern (aufgrund der unregelmäßigen Struktur des Ethereum State-Tries gehen wir davon aus, dass ein gewisses Pruning möglich sein wird, insbesondere bei einigen häufig genutzten Contracts, aber wir wollen dies minimieren). ## DAG-Generierung {#dag-generation} -Der Code für den Algorithmus wird unten in Python definiert. Zunächst geben wir `encode_int` zur Anordnung nicht unterzeichneter Einheiten spezifizierter Präzision an Strings. Die entsprechend Umkehrung wird ebenfalls bereitgestellt: +Der Code für den Algorithmus wird unten in Python definiert. Zuerst stellen wir `encode_int` für das Marshalling von vorzeichenlosen Ganzzahlen (unsigned ints) mit festgelegter Präzision in Zeichenketten (Strings) bereit. Die entsprechend Umkehrung wird ebenfalls bereitgestellt: ```python NUM_BITS = 512 def encode_int(x): - "Encode an integer x as a string of 64 characters using a big-endian scheme" + "Kodiert eine Ganzzahl x als eine Zeichenkette von 64 Zeichen unter Verwendung eines Big-Endian-Schemas" o = '' for _ in range(NUM_BITS / 8): o = chr(x % 256) + o @@ -37,7 +37,7 @@ def encode_int(x): return o def decode_int(s): - "Unencode an integer x from a string using a big-endian scheme" + "Dekodiert eine Ganzzahl x aus einer Zeichenkette unter Verwendung eines Big-Endian-Schemas" x = 0 for c in s: x *= 256 @@ -45,7 +45,7 @@ def decode_int(s): return x ``` -Als Nächstes gehen wir davon aus, dass `sah3` eine Funktion ist, die eine Ganzzahl bezieht und eine Ganzzahl ausgibt, und `dbl_sah3` eine Doppelt-sah3-Funktion ist; wenn man diesen Referenzcode in eine Implementierungsanwendung umwandelt: +Als Nächstes nehmen wir an, dass `sha3` eine Funktion ist, die eine Ganzzahl als Eingabe nimmt und eine Ganzzahl ausgibt, und `dbl_sha3` eine doppelte sha3-Funktion ist. Wenn Sie diesen Referenzcode in eine Implementierung umwandeln, verwenden Sie: ```python from pyethereum import utils @@ -65,26 +65,25 @@ def dbl_sha3(x): Folgende Parameter werden für den Algorithmus verwendet: ```python -SAFE_PRIME_512 = 2**512 - 38117 # Largest Safe Prime less than 2**512 +SAFE_PRIME_512 = 2**512 - 38117 # Größte sichere Primzahl kleiner als 2**512 params = { - "n": 4000055296 * 8 // NUM_BITS, # Size of the dataset (4 Gigabytes); MUST BE MULTIPLE OF 65536 - "n_inc": 65536, # Increment in value of n per period; MUST BE MULTIPLE OF 65536 - # with epochtime=20000 gives 882 MB growth per year - "cache_size": 2500, # Size of the light client's cache (can be chosen by light - # client; not part of the algo spec) - "diff": 2**14, # Difficulty (adjusted during block evaluation) - "epochtime": 100000, # Length of an epoch in blocks (how often the dataset is updated) - "k": 1, # Number of parents of a node - "w": w, # Used for modular exponentiation hashing - "accesses": 200, # Number of dataset accesses during hashimoto - "P": SAFE_PRIME_512 # Safe Prime for hashing and random number generation + "n": 4000055296 * 8 // NUM_BITS, # Größe des Datensatzes (4 Gigabyte); MUSS EIN VIELFACHES VON 65536 SEIN + "n_inc": 65536, # Inkrement des Wertes n pro Periode; MUSS EIN VIELFACHES VON 65536 SEIN + # bei epochtime=20000 ergibt dies ein Wachstum von 882 MB pro Jahr + "cache_size": 2500, # Größe des Caches des Light-Clients (kann vom Light-Client gewählt werden; nicht Teil der Algo-Spezifikation) + "diff": 2**14, # Schwierigkeit (wird während der Blockauswertung angepasst) + "epochtime": 100000, # Länge einer Epoche in Blöcken (wie oft der Datensatz aktualisiert wird) + "k": 1, # Anzahl der Eltern eines Knotens + "w": w, # Wird für modulares Exponentiations-Hashing verwendet + "accesses": 200, # Anzahl der Datensatzzugriffe während Hashimoto + "P": SAFE_PRIME_512 # Sichere Primzahl für Hashing und Zufallszahlengenerierung } ``` -`P` ist in diesem Fall eine Primzahl, die so gewählt wurde, dass `log₂(P)` nur etwas geringer als 512 ist, was den 512 Bits entspricht, die wir zur Darstellung unserer Zahlen nutzen. Beachten Sie, dass nur die zweite Hälfte des DAG tatsächlich gespeichert werden muss, sodass der tatsächliche RAM-Bedarf bei 1 GB beginnt und um 441 MB pro Jahr wächst. +`P` ist in diesem Fall eine Primzahl, die so gewählt wurde, dass `log₂(P)` nur geringfügig kleiner als 512 ist, was den 512 Bits entspricht, die wir zur Darstellung unserer Zahlen verwendet haben. Beachten Sie, dass nur die zweite Hälfte des DAG tatsächlich gespeichert werden muss, sodass der tatsächliche RAM-Bedarf bei 1 GB beginnt und um 441 MB pro Jahr wächst. -### Bau eines Dagger-Graphen {#dagger-graph-building} +### Dagger-Graph-Erstellung {#dagger-graph-building} Der Primitiv des Baus eines Dagger-Graphen ist wie folgt definiert: @@ -101,11 +100,11 @@ def produce_dag(params, seed, length): return o ``` -Im Wesentlichen wird ein Graph mit einem einzigen Knoten begonnen, `sha3(seed)`, und von dort aus werden nacheinander weitere Knoten auf der Grundlage zufälliger vorheriger Knoten hinzugefügt. Wenn ein neuer Knoten erstellt wird, wird eine modulare Potenz des Seeds berechnet, um zufällig einige Indizes auszuwählen, die kleiner sind als `i` (bei Verwendung von `x % i` oben), und die Werte der Knoten an diesen Indizes werden in einer Berechnung verwendet, um einen neuen Wert für `x` zu generieren, welcher dann in eine kleine Proof-of-Work-Funktion (auf XOR-Basis) hinzugegeben wird, um letztlich den Wert des Graphen an Index `i` zu generieren. Der Grundgedanke hinter diesem speziellen Design ist, einen sequentiellen Zugriff auf den DAG zu erzwingen; der nächste Wert des DAG, auf den zugegriffen wird, kann nicht bestimmt werden, bis der aktuelle Wert bekannt ist. Schließlich wird das Ergebnis durch modulare Potenzierung weiter gehasht. +Im Wesentlichen beginnt ein Graph mit einem einzigen Knoten, `sha3(seed)`, und von dort aus werden nacheinander weitere Knoten auf der Grundlage zufälliger vorheriger Knoten hinzugefügt. Wenn ein neuer Knoten erstellt wird, wird eine modulare Potenz des Seeds berechnet, um zufällig einige Indizes kleiner als `i` auszuwählen (unter Verwendung von `x % i` oben). Die Werte der Knoten an diesen Indizes werden in einer Berechnung verwendet, um einen neuen Wert für `x` zu generieren, der dann in eine kleine Proof-of-Work-Funktion (basierend auf XOR) eingespeist wird, um schließlich den Wert des Graphen am Index `i` zu erzeugen. Der Grundgedanke hinter diesem speziellen Design ist, einen sequentiellen Zugriff auf den DAG zu erzwingen; der nächste Wert des DAG, auf den zugegriffen wird, kann nicht bestimmt werden, bis der aktuelle Wert bekannt ist. Schließlich wird das Ergebnis durch modulare Potenzierung weiter gehasht. Dieser Algorithmus stützt sich auf mehrere Ergebnisse aus der Zahlentheorie. Schauen Sie sich den unteren Zusatz mit einer Diskussion an. -## Light-Client-Bewertung {#light-client-evaluation} +## Light-Client-Evaluierung {#light-client-evaluation} Die oben beschriebene Konstruktion des Graphen soll es ermöglichen, jeden Knoten des Graphen zu rekonstruieren, indem ein Unterbaum mit nur wenigen Knoten berechnet wird und wobei nur nur eine geringe Menge an Zusatzspeicher notig ist. Beachten Sie, dass mit „k=1“ dieser Unterbaum nur eine Kette von Werten ist, die sich bis zum ersten Element im DAG hochziehen. @@ -131,11 +130,11 @@ def quick_calc(params, seed, p): return quick_calc_cached(p) ``` -Im Wesentlichen handelt es sich einfach um eine neue Implementierung des obigen Algorithmus, bei der die Schleife zur Berechnung der Werte für den gesamten DAG entfällt und die frühere Knotensuche durch einen rekursiven Aufruf oder eine Cache-Suche ersetzt wird. Beachten Sie, dass für `k=1` der Cache unnötig ist, obwohl eine weitere Optimierung die ersten paar Tausend Werte der DAG vorab berechnet und diese als statischen Cache für Berechnungen aufbewahrt; im Zusatz finden Sie eine entsprechende Code-Implementierung. +Im Wesentlichen handelt es sich einfach um eine neue Implementierung des obigen Algorithmus, bei der die Schleife zur Berechnung der Werte für den gesamten DAG entfällt und die frühere Knotensuche durch einen rekursiven Aufruf oder eine Cache-Suche ersetzt wird. Beachten Sie, dass für `k=1` der Cache unnötig ist, obwohl eine weitere Optimierung tatsächlich die ersten paar tausend Werte des DAG vorab berechnet und diese als statischen Cache für Berechnungen behält; eine Code-Implementierung hierfür finden Sie im Anhang. -## Doppelte DAG-Puffer {#double-buffer} +## Doppelpuffer von DAGs {#double-buffer} -In einem vollen Client wird ein [_doppelter Puffer_](https://wikipedia.org/wiki/Multiple_buffering) von 2 DAGs verwendet, die mithilfe der obigen Formel produziert wurden. Der Gedanke dahinter ist, dass DAGs jede `epochtime` Anzahl von Blöcken entsprechend den obigen Parametern erzeugt werden. Der Client verwendet nicht den zuletzt erstellten DAG, sondern den vorherigen. Das hat den Vorteil, dass die DAGs im Laufe der Zeit ersetzt werden können, ohne dass ein Schritt eingefügt werden muss, bei dem Miner plötzlich alle Daten neu berechnen müssen. Andernfalls besteht die Gefahr einer abrupten, vorübergehenden Verlangsamung der Chain-Verarbeitung in regelmäßigen Abständen und einer dramatisch zunehmenden Zentralisierung. Dadurch könnte es 51-%-Angriffe in diesen wenigen Minuten geben, bevor alle Daten neu berechnet sind. +In einem Full-Client wird ein [_Doppelpuffer_](https://wikipedia.org/wiki/Multiple_buffering) aus 2 DAGs verwendet, die mit der obigen Formel erzeugt werden. Die Idee ist, dass DAGs alle `epochtime` Blöcke gemäß der obigen Parameter erzeugt werden. Der Client verwendet nicht den zuletzt erstellten DAG, sondern den vorherigen. Das hat den Vorteil, dass die DAGs im Laufe der Zeit ersetzt werden können, ohne dass ein Schritt eingefügt werden muss, bei dem Miner plötzlich alle Daten neu berechnen müssen. Andernfalls besteht die Gefahr einer abrupten, vorübergehenden Verlangsamung der Chain-Verarbeitung in regelmäßigen Abständen und einer dramatisch zunehmenden Zentralisierung. Dadurch könnte es 51-%-Angriffe in diesen wenigen Minuten geben, bevor alle Daten neu berechnet sind. Der Algorithmus für das Generieren des DAG-Sets zur Berechnung der Arbeit für einen Block ist wie folgt: @@ -254,56 +253,52 @@ Beachten Sie außerdem, dass Dagger-Hashimoto zusätzliche Anforderungen an den - Damit eine Verifizierung mit zwei Ebenen funktioniert, muss ein Block-Header sowohl die Nonce als auch den mittleren Wert vor sha3 haben. - Irgendwo muss ein Block-Header den sha3 des aktuellen Seed-Sets speichern. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -_Kennst du eine Community-Ressource, die dir geholfen hat? Bearbeite diese Seite und füge sie hinzu!_ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Anhang {#appendix} -Wie oben erwähnt, basiert der für die DAG-Generierung verwendete RNG auf einigen Ergebnissen aus der Zahlentheorie. Zunächst stellen wir sicher, dass der Lehmer-RNG, welcher die Grundlage für die Variable `picker` bildet, eine lange Periode besitzt. Im zweiten Schritt zeigen wir, dass `pow(x,3,P)` `x` nicht `1` oder `P-1` zuordnet, sofern `x ∈ [2,P-2]` als Startwert gilt. Schließlich zeigen wir, dass `pow(x,3,P)` eine niedrige Kollisionsrate hat, wenn es als Hashing-Funktion behandelt wird. +Wie oben erwähnt, basiert der für die DAG-Generierung verwendete RNG auf einigen Ergebnissen aus der Zahlentheorie. Zunächst stellen wir sicher, dass der Lehmer-RNG, der die Grundlage für die `picker`-Variable ist, eine lange Periode hat. Zweitens zeigen wir, dass `pow(x,3,P)` `x` nicht auf `1` oder `P-1` abbildet, vorausgesetzt `x ∈ [2,P-2]` ist der Startwert. Schließlich zeigen wir, dass `pow(x,3,P)` eine niedrige Kollisionsrate aufweist, wenn es als Hashing-Funktion behandelt wird. ### Lehmer-Zufallszahlengenerator {#lehmer-random-number} Obwohl die Funktion `produce_dag` keine unverzerrten Zufallszahlen erzeugen muss, besteht eine potenzielle Gefahr darin, dass `seed**i % P` nur eine Handvoll Werte annimmt. Dies könnte Minern, die das Muster erkennen, einen Vorteil gegenüber denen verschaffen, die es nicht tun. -Um dies zu vermeiden, wird auf ein Ergebnis aus der Zahlentheorie zurückgegriffen. Eine [_sichere Primzahl_](https://en.wikipedia.org/wiki/Safe_prime) ist definiert als eine Primzahl `P`, sodass `(P-1)/2` ebenfalls eine Primzahl ist. Die _Reihenfolge_ eines Mitglieds `x` der [multiplikativen Gruppe](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) `ℤ/nℤ` ist definiert als das minimale `m`, sodass
xᵐ mod P ≡ 1
-Angesichts dieser Definitionen haben wir: +Um dies zu vermeiden, wird auf ein Ergebnis aus der Zahlentheorie zurückgegriffen. Eine [_sichere Primzahl_](https://en.wikipedia.org/wiki/Safe_prime) ist definiert als eine Primzahl `P`, für die `(P-1)/2` ebenfalls eine Primzahl ist. Die _Ordnung_ eines Elements `x` der [multiplikativen Gruppe](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) `ℤ/nℤ` ist definiert als das minimale `m`, sodass
xᵐ mod P ≡ 1
+Ausgehend von diesen Definitionen gilt: -> Beobachtung 1. Lassen Sie `x` ein Mitglied der multiplikativen Gruppe `ℤ/Pℤ` für eine sichere Primzahl `P` sein. Bei `x mod P ≠ 1 mod P` und `x mod P ≠ P-1 mod P` ist die Ordnung von `x` entweder `P-1` oder `(P-1)/2`. +> Beobachtung 1. `x` sei ein Element der multiplikativen Gruppe `ℤ/Pℤ` für eine sichere Primzahl `P`. Wenn `x mod P ≠ 1 mod P` und `x mod P ≠ P-1 mod P`, dann ist die Ordnung von `x` entweder `P-1` oder `(P-1)/2`. -_Beweis_. Da `P` eine sichere Primzahl ist, gilt nach dem \[Satz von Lagrange\]\[lagrange\], dass die Ordnung von `x` entweder `1`, `2`, `(P-1)/2` oder `P-1` ist. +_Beweis_. Da `P` eine sichere Primzahl ist, ist nach dem [Satz von Lagrange][lagrange] die Ordnung von `x` entweder `1`, `2`, `(P-1)/2` oder `P-1`. -Die Ordnung von `x` kann nicht `1` sein, da wir gemäß dem Little Theorem von Fermat Folgendes haben: +Die Ordnung von `x` kann nicht `1` sein, da nach dem kleinen Satz von Fermat gilt:
xP-1 mod P ≡ 1
-Daher muss `x` eine multiplikative Identität von `ℤ/nℤ` sein, die eindeutig ist. Da wir angenommen haben, dass `x ≠ 1`, ist dies nicht möglich. +Daher muss `x` eine multiplikative Identität von `ℤ/nℤ` sein, die eindeutig ist. Da wir per Annahme `x ≠ 1` vorausgesetzt haben, ist dies nicht möglich. -Die Ordnung von `x` kann nicht `2` sein, es sei denn, `x = P-1`, weil dies die Aussage verletzen würde, dass `P` eine Primzahl ist. +Die Ordnung von `x` kann nicht `2` sein, es sei denn, `x = P-1`, da dies der Annahme, dass `P` eine Primzahl ist, widersprechen würde. -Aus dem obigen Vorschlag können wir erkennen, dass die Iteration von `(picker * init) % P` eine Zykluslänge von mindestens `(P-1)/2` hat. Das liegt daran, dass wir `P` als sichere Primzahl gewählt haben, die etwa einer höheren Potenz von zwei entspricht, und `init` im Intervall `[2,2**256+1]` liegt. Angesichts der Größe von `P` sollten wir niemals einen Zyklus aus der modularen Potenzierung erwarten. +Aus der obigen Aussage können wir erkennen, dass die Iteration von `(picker * init) % P` eine Zykluslänge von mindestens `(P-1)/2` haben wird. Das liegt daran, dass wir `P` als eine sichere Primzahl gewählt haben, die ungefähr einer höheren Zweierpotenz entspricht, und `init` im Intervall `[2,2**256+1]` liegt. Angesichts der Größenordnung von `P` sollten wir niemals einen Zyklus bei der modularen Exponentiation erwarten. -Wenn wir die erste Zelle im DAG zuweisen (die Variable mit der Bezeichnung `init`), berechnen wir `pow(sha3(seed) + 2, 3, P)`. Auf den ersten Blick stellt dies nicht sicher, dass das Ergebnis weder `1` noch `P-1` ist. Da `P-1` jedoch eine sichere Primzahl ist, haben wir die folgende zusätzliche Sicherheit, die eine Folgerung aus Beobachtung 1 ist: +Wenn wir die erste Zelle im DAG zuweisen (die Variable mit der Bezeichnung `init`), berechnen wir `pow(sha3(seed) + 2, 3, P)`. Auf den ersten Blick garantiert dies nicht, dass das Ergebnis weder `1` noch `P-1` ist. Da `P-1` jedoch eine sichere Primzahl ist, haben wir die folgende zusätzliche Zusicherung, die ein Korollar von Beobachtung 1 ist: -> Beobachtung 2. `x` sei ein Element der multiplikativen Gruppe `ℤ/Pℤ` für eine sichere Primzahl `P`, und `w` sei eine natürliche Zahl. Wenn `x mod P ≠ 1 mod P` und `x mod P ≠ P-1 mod P` sowie `w mod P ≠ P-1 mod P` und `w mod P ≠ 0 mod P`, dann `xʷ mod P ≠ 1 mod P` und `xʷ mod P ≠ P-1 mod P`. +> Beobachtung 2. `x` sei ein Element der multiplikativen Gruppe `ℤ/Pℤ` für eine sichere Primzahl `P`, und `w` sei eine natürliche Zahl. Wenn `x mod P ≠ 1 mod P` und `x mod P ≠ P-1 mod P`, sowie `w mod P ≠ P-1 mod P` und `w mod P ≠ 0 mod P`, dann `xʷ mod P ≠ 1 mod P` und `xʷ mod P ≠ P-1 mod P` -### Modulare Potenzierung als Hash-Funktion {#modular-exponentiation} +### Modulare Exponentiation als Hash-Funktion {#modular-exponentiation} -Bei bestimmten Werten von `P` und `w` kann es bei der Funktion `pow(x, w, P)` zu zahlreichen Kollisionen kommen. Beispielsweise nimmt `pow(x,9,19)` nur die Werte `{1,18}` an. +Für bestimmte Werte von `P` und `w` kann die Funktion `pow(x, w, P)` viele Kollisionen aufweisen. Beispielsweise nimmt `pow(x,9,19)` nur die Werte `{1,18}` an. -Wenn `P` eine Primzahl ist, kann ein geeignetes `w` für eine Hash-Funktion zur modularen Potenzierung mithilfe des folgenden Ergebnisses ausgewählt werden: +Vorausgesetzt, dass `P` eine Primzahl ist, kann ein geeignetes `w` für eine Hash-Funktion mit modularer Exponentiation unter Verwendung des folgenden Ergebnisses gewählt werden: -> Beobachtung 3. `P` sei eine Primzahl; `w` und `P-1` sind nur dann teilerfremd, wenn für alle `a` und `b` in `ℤ/Pℤ` Folgendes gilt: -> ->
-> „aʷ mod P ≡ bʷ mod P“ gilt nur dann, wenn „a mod P ≡ b mod P“ ->
+> Beobachtung 3. `P` sei eine Primzahl; `w` und `P-1` sind genau dann teilerfremd, wenn für alle `a` und `b` in `ℤ/Pℤ` gilt:
`aʷ mod P ≡ bʷ mod P` genau dann, wenn `a mod P ≡ b mod P`
-Da `P` eine Primzahl ist und `w` teilerfremd zu `P-1` ist, gilt, dass `|{pow(x, w, P) : x ∈ ℤ}| = P`, was bedeutet, dass die Hashing-Funktion die minimal mögliche Kollisionsrate aufweist. +Wenn also `P` eine Primzahl ist und `w` teilerfremd zu `P-1` ist, dann gilt `|{pow(x, w, P) : x ∈ ℤ}| = P`, was bedeutet, dass die Hashing-Funktion die geringstmögliche Kollisionsrate hat. -Im speziellen Fall, dass `P` eine sichere Primzahl ist, wie wir sie ausgewählt haben, hat `P-1` nur die Faktoren 1, 2, `(P-1)/2` und `P-1`. Da `P` > 7 ist, wissen wir, dass 3 teilerfremd zu `P-1` ist, daher erfüllt `w=3` die obige Aussage. +Im Sonderfall, dass `P` eine sichere Primzahl ist, wie wir sie gewählt haben, hat `P-1` nur die Faktoren 1, 2, `(P-1)/2` und `P-1`. Da `P` > 7, wissen wir, dass 3 teilerfremd zu `P-1` ist, daher erfüllt `w=3` die obige Aussage. -## Effizienterer cache-basierter Auswertungsalgorithmus {#cache-based-evaluation} +## Effizienterer Cache-basierter Auswertungsalgorithmus {#cache-based-evaluation} ```python def quick_calc(params, seed, p): diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index b42bba6a799..ff1ddddd9a1 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -8,12 +8,12 @@ lang: de - Ethash war der Proof-of-Work-Mining-Algorithmus von Ethereum. Proof-of-work wurde nun **komplett abgeschaltet** und Ethereum wird jetzt stattdessen durch [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) gesichert. Lesen Sie mehr über [die Zusammenführung](/roadmap/merge/), [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) und [Staking](/staking/). Diese Seite dient dem geschichtlichen Interesse! + Ethash war der Proof-of-Work-Mining-Algorithmus von Ethereum. Proof-of-Work wurde mittlerweile **komplett abgeschaltet** und Ethereum wird nun durch [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) gesichert. Lesen Sie mehr über [The Merge](/roadmap/merge/), [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) und [Staking](/staking/). Diese Seite dient dem geschichtlichen Interesse! -Ethash ist eine modifizierte Version des [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto)-Algorithmus. Ethash-Proof-of-Work ist [speicherhart](https://wikipedia.org/wiki/Memory-hard_function), was die Algorithmus-ASIC resistent machen sollte. Zwar wurden schließlich Ethash-ASICs entwickelt, aber GPU-Mining war weiterhin eine gangbare Option, bis Proof-of-Work abgeschaltet wurde. Ethash wird immer noch verwendet, um andere Coins zu minen, die nicht auf Proof-of-Work-Netzwerken von Ethereum laufen. +Ethash ist eine modifizierte Version des [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto)-Algorithmus. Der Ethash-Proof-of-Work ist [speicherhart](https://wikipedia.org/wiki/Memory-hard_function), weshalb angenommen wurde, dass der Algorithmus ASIC-resistent ist. Zwar wurden schließlich Ethash-ASICs entwickelt, aber GPU-Mining war weiterhin eine gangbare Option, bis Proof-of-Work abgeschaltet wurde. Ethash wird immer noch verwendet, um andere Coins zu minen, die nicht auf Proof-of-Work-Netzwerken von Ethereum laufen. ## Wie funktioniert Ethash? {#how-does-ethash-work} @@ -21,9 +21,9 @@ Speicherhärte wird durch einen Proof-of-Work-Algorithmus erreicht, der das Ausw Die allgemeine Route, die der Algorithmus nimmt, ist wie folgt: -1. Es gibt einen **Seed**, welcher für jeden Block berechnet werden kann, indem die Block-Header bis zu diesem Punkt durchsucht werden. -2. Aus dem Seed kann ein **16 MB großer pseudozufälliger Cache** berechnet werden. Light-Clients speichern den Cache. -3. Aus dem Cache können wir einen **1 GB großen Datensatz** mit der Eigenschaft generieren, dass jedes Element im Datensatz nur von einer sehr kleinen Anzahl an Elementen aus dem Cache abhängt. Volle Clients und Miner speichern den Datensatz. Der Datensatz wächst linear über die Zeit. +1. Es existiert ein **Seed**, der für jeden Block berechnet werden kann, indem die Block-Header bis zu diesem Punkt durchsucht werden. +2. Aus dem Seed kann ein **pseudozufälliger 16-MB-Cache** berechnet werden. Light-Clients speichern den Cache. +3. Aus dem Cache können wir einen **1-GB-Datensatz** mit der Eigenschaft generieren, dass jedes Element im Datensatz nur von einer kleinen Anzahl von Elementen aus dem Cache abhängt. Volle Clients und Miner speichern den Datensatz. Der Datensatz wächst linear über die Zeit. 4. Beim Mining werden zufällige Ausschnitte aus dem Datensatz entnommen und zu einem Hash zusammengefügt. Die Verifizierung kann mit wenig Speicher durchgeführt werden, indem der Cache verwendet wird, um die spezifischen Teile des Datensatzes, die Sie benötigen, neu zu generieren, sodass Sie nur den Cache speichern müssen. Der große Datensatz wird alle 30.000 Blöcke aktualisiert, sodass der größte Teil der Arbeit eines Miners darin besteht, den Datensatz zu lesen, und nicht darin, ihn zu verändern. @@ -33,23 +33,23 @@ Der große Datensatz wird alle 30.000 Blöcke aktualisiert, sodass der größte Wir verwenden die folgenden Definitionen: ``` -WORD_BYTES = 4 # bytes in word -DATASET_BYTES_INIT = 2**30 # bytes in dataset at genesis -DATASET_BYTES_GROWTH = 2**23 # dataset growth per epoch -CACHE_BYTES_INIT = 2**24 # bytes in cache at genesis -CACHE_BYTES_GROWTH = 2**17 # cache growth per epoch -CACHE_MULTIPLIER=1024 # Size of the DAG relative to the cache -EPOCH_LENGTH = 30000 # blocks per epoch -MIX_BYTES = 128 # width of mix -HASH_BYTES = 64 # hash length in bytes -DATASET_PARENTS = 256 # number of parents of each dataset element -CACHE_ROUNDS = 3 # number of rounds in cache production -ACCESSES = 64 # number of accesses in hashimoto loop +WORD_BYTES = 4 # Bytes im Wort +DATASET_BYTES_INIT = 2**30 # Bytes im Datensatz bei Genesis +DATASET_BYTES_GROWTH = 2**23 # Datensatzwachstum pro Epoche +CACHE_BYTES_INIT = 2**24 # Bytes im Cache bei Genesis +CACHE_BYTES_GROWTH = 2**17 # Cache-Wachstum pro Epoche +CACHE_MULTIPLIER=1024 # Größe des DAG relativ zum Cache +EPOCH_LENGTH = 30000 # Blöcke pro Epoche +MIX_BYTES = 128 # Breite des Mix +HASH_BYTES = 64 # Hash-Länge in Bytes +DATASET_PARENTS = 256 # Anzahl der Parents jedes Datensatzelements +CACHE_ROUNDS = 3 # Anzahl der Runden in der Cache-Erstellung +ACCESSES = 64 # Anzahl der Zugriffe in der Hashimoto-Schleife ``` -### Die Verwendung von „SHA3“ {#sha3} +### Die Verwendung von 'SHA3' {#sha3} -Die Entwicklung von Ethereum fiel mit der Entwicklung des SHA3-Standards zusammen, und im Verlauf des Standardisierungsprozesses wurde eine späte Änderung im Padding des finalen Hash-Algorithmus vorgenommen. Daher sind Ethereums „sha3_256“- und „sha3_512“-Hashes keine standardmäßigen SHA3-Hashes, sondern eine Abwandlung, die in anderen Zusammenhängen oft als „Keccak-256“ und „Keccak-512“ bezeichnet wird. Die Diskussion finden Sie beispielsweise [hier](https://eips.ethereum.org/EIPS/eip-1803), [hier](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) oder [hier](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). +Die Entwicklung von Ethereum fiel mit der Entwicklung des SHA3-Standards zusammen, und im Verlauf des Standardisierungsprozesses wurde eine späte Änderung im Padding des finalen Hash-Algorithmus vorgenommen. Daher sind Ethereums „sha3_256“- und „sha3_512“-Hashes keine standardmäßigen SHA3-Hashes, sondern eine Abwandlung, die in anderen Zusammenhängen oft als „Keccak-256“ und „Keccak-512“ bezeichnet wird. Siehe Diskussion, z. B. [hier](https://eips.ethereum.org/EIPS/eip-1803), [hier](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) oder [hier](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). Bitte behalten Sie das im Hinterkopf, da im Folgenden bei der Beschreibung des Algorithmus auf „sha3“-Hashes Bezug genommen wird. @@ -75,7 +75,7 @@ def get_full_size(block_number): Tabellen mit Werten zu Datensatz- und Cache-Größe finden Sie im Zusatz. -## Cache-Gegerierung {#cache-generation} +## Cache-Generierung {#cache-generation} Nun geben wir die Funktion zur Erzeugung eines Cache an: @@ -83,12 +83,12 @@ Nun geben wir die Funktion zur Erzeugung eines Cache an: def mkcache(cache_size, seed): n = cache_size // HASH_BYTES - # Sequentially produce the initial dataset + # Sequenziell den initialen Datensatz erstellen o = [sha3_512(seed)] for i in range(1, n): o.append(sha3_512(o[-1])) - # Use a low-round version of randmemohash + # Eine Version von randmemohash mit wenigen Runden verwenden for _ in range(CACHE_ROUNDS): for i in range(n): v = o[i][0] % n @@ -97,9 +97,9 @@ def mkcache(cache_size, seed): return o ``` -Der Cache-Produktionsprozess des Cache umfasst zunächst das sequenzielle Auffüllen von 32 MB Speicher und dann das Ausführen von zwei Durchläufen des _RandMemoHash_-Algorithmus von Sergio Demian Lerner aus [_Strict Memory Hard Hashing Functions_ (2014)](http://www.hashcash.org/papers/memohash.pdf). Die Ausgabe ist ein Satz von 524288 64-Byte-Werten. +Der Prozess der Cache-Erstellung beinhaltet zunächst das sequenzielle Füllen von 32 MB Speicher und anschließend die Durchführung von zwei Durchläufen des _RandMemoHash_-Algorithmus von Sergio Demian Lerner aus [_Strict Memory Hard Hashing Functions_ (2014)](http://www.hashcash.org/papers/memohash.pdf). Die Ausgabe ist ein Satz von 524288 64-Byte-Werten. -## Funktion der Datenaggregation {#date-aggregation-function} +## Datenaggregationsfunktion {#date-aggregation-function} Wir verwenden in einigen Fällen einen vom [FNV-Hash](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) inspirierten Algorithmus als nicht-assoziativen Ersatz für XOR. Beachten Sie, dass wir die Primzahl mit dem vollständigen 32-Bit-Input multiplizieren, im Gegensatz zur FNV-1-Spezifikation, die die Primzahl wiederum mit einem Byte (Oktett) multipliziert. @@ -112,7 +112,7 @@ def fnv(v1, v2): Bitte beachten Sie, dass selbst das Yellow Paper fnv als v1\*(FNV_PRIME ^ v2) spezifiziert, alle aktuellen Implementierungen verwenden durchgängig die obige Definition. -## Berechnung des gesamten Datensatzes {#full-dataset-calculation} +## Berechnung des vollständigen Datensatzes {#full-dataset-calculation} Jedes 64-Byte-Element im vollständigen 1-GB-Datensatz wird wie folgt berechnet: @@ -120,11 +120,11 @@ Jedes 64-Byte-Element im vollständigen 1-GB-Datensatz wird wie folgt berechnet: def calc_dataset_item(cache, i): n = len(cache) r = HASH_BYTES // WORD_BYTES - # initialize the mix + # den Mix initialisieren mix = copy.copy(cache[i % n]) mix[0] ^= i mix = sha3_512(mix) - # fnv it with a lot of random cache nodes based on i + # FNV mit vielen zufälligen Cache-Nodes basierend auf i anwenden for j in range(DATASET_PARENTS): cache_index = fnv(i ^ j, mix[j % r]) mix = map(fnv, mix, cache[cache_index % n]) @@ -140,27 +140,27 @@ def calc_dataset(full_size, cache): ## Hauptschleife {#main-loop} -Nun legen wir die „Hashimoto“-ähnliche Hauptschleife fest, in der wir Daten aus dem gesamten Datensatz aggregieren, um unseren endgültigen Wert für einen bestimmten Header und eine bestimmte Nonce zu ermitteln. Im folgenden Code stellt `header` den SHA3-256-_Hash_ der RLP-Darstellung eines _abgeschnittenen_ Block-Headers dar, d. h. eines Headers ohne die Felder **mixHash** und **nonce**. `nonce` sind die acht Byte einer vorzeichenlosen 64-Bit-Ganzzahl in Big-Endian-Reihenfolge. Daher ist `nonce[::-1]` die Little-Endian-Darstellung dieses Werts mit acht Byte: +Nun legen wir die „Hashimoto“-ähnliche Hauptschleife fest, in der wir Daten aus dem gesamten Datensatz aggregieren, um unseren endgültigen Wert für einen bestimmten Header und eine bestimmte Nonce zu ermitteln. Im nachstehenden Code stellt `header` den SHA3-256-_Hash_ der RLP-Darstellung eines _abgeschnittenen_ Block-Headers dar, d. h. eines Headers ohne die Felder **mixHash** und **nonce**. `nonce` sind die acht Bytes einer vorzeichenlosen 64-Bit-Ganzzahl in Big-Endian-Reihenfolge. Daher ist `nonce[::-1]` die Acht-Byte-Little-Endian-Darstellung dieses Wertes: ```python def hashimoto(header, nonce, full_size, dataset_lookup): n = full_size / HASH_BYTES w = MIX_BYTES // WORD_BYTES mixhashes = MIX_BYTES / HASH_BYTES - # combine header+nonce into a 64 byte seed + # header+nonce zu einem 64-Byte-Seed kombinieren s = sha3_512(header + nonce[::-1]) - # start the mix with replicated s + # den Mix mit repliziertem s starten mix = [] for _ in range(MIX_BYTES / HASH_BYTES): mix.extend(s) - # mix in random dataset nodes + # zufällige Datensatz-Nodes einmischen for i in range(ACCESSES): p = fnv(i ^ s[0], mix[i % w]) % (n // mixhashes) * mixhashes newdata = [] for j in range(MIX_BYTES / HASH_BYTES): newdata.extend(dataset_lookup(p + j)) mix = map(fnv, mix, newdata) - # compress mix + # Mix komprimieren cmix = [] for i in range(0, len(mix), 4): cmix.append(fnv(fnv(fnv(mix[i], mix[i+1]), mix[i+2]), mix[i+3])) @@ -176,9 +176,9 @@ def hashimoto_full(full_size, dataset, header, nonce): return hashimoto(header, nonce, full_size, lambda x: dataset[x]) ``` -Im Wesentlichen halten wir einen 128 Byte breiten „Mix“ aufrecht und holen wiederholt sequentiell 128 Byte aus dem vollständigen Datensatz, um sie mithilfe der `fnv`-Funktion mit dem Mix zu kombinieren. Es werden 128 Byte sequentieller Zugriff verwendet, sodass bei jeder Runde des Algorithmus immer eine vollständige Seite aus dem RAM geholt wird, wodurch Fehlübersetzungen im Lookaside-Puffer, die ASICs theoretisch vermeiden könnten, minimiert werden. +Im Wesentlichen pflegen wir einen 128 Byte breiten \"Mix\", rufen wiederholt sequenziell 128 Bytes aus dem vollständigen Datensatz ab und kombinieren sie mithilfe der `fnv`-Funktion mit dem Mix. Es werden 128 Byte sequentieller Zugriff verwendet, sodass bei jeder Runde des Algorithmus immer eine vollständige Seite aus dem RAM geholt wird, wodurch Fehlübersetzungen im Lookaside-Puffer, die ASICs theoretisch vermeiden könnten, minimiert werden. -Liegt das Ergebnis dieses Algorithmus unter dem gewünschten Zielwert, so ist die Nonce gültig. Beachten Sie, dass die zusätzliche Anwendung von `sha3_256` am Ende sicherstellt, dass es eine Zwischen-Nonce gibt, die bereitgestellt werden kann, um zu beweisen, dass zumindest etwas Arbeit geleistet wurde; diese schnelle äußere PoW-Verifizierung kann für Anti-DoS-Zwecke verwendet werden. Ein weiterer Zweck ist die statistische Sicherheit darüber, dass das Ergebnis eine unverzerrte 256-Bit-Zahl ist. +Liegt das Ergebnis dieses Algorithmus unter dem gewünschten Zielwert, so ist die Nonce gültig. Beachten Sie, dass die zusätzliche Anwendung von `sha3_256` am Ende sicherstellt, dass eine intermediäre Nonce existiert, die bereitgestellt werden kann, um zu beweisen, dass zumindest ein geringer Arbeitsaufwand erbracht wurde; diese schnelle äußere PoW-Verifizierung kann für Anti-DDoS-Zwecke verwendet werden. Ein weiterer Zweck ist die statistische Sicherheit darüber, dass das Ergebnis eine unverzerrte 256-Bit-Zahl ist. ## Mining {#mining} @@ -186,7 +186,7 @@ Der Mining-Algorithmus wird wie folgt definiert: ```python def mine(full_size, dataset, header, difficulty): - # zero-pad target to compare with hash on the same digit + # Ziel mit Nullen auffüllen, um es mit dem Hash an derselben Ziffer zu vergleichen target = zpad(encode_int(2**256 // difficulty), 64)[::-1] from random import randint nonce = randint(0, 2**64) @@ -195,7 +195,7 @@ def mine(full_size, dataset, header, difficulty): return nonce ``` -## Seed-Hashes definieren {#seed-hash} +## Definition des Seed-Hashes {#seed-hash} Um den Seed-Hash zu berechnen, der für das Mining auf einem bestimmten Block verwendet wird, nutzen wir den folgenden Algorithmus: @@ -209,18 +209,18 @@ Um den Seed-Hash zu berechnen, der für das Mining auf einem bestimmten Block ve Beachten Sie, dass wir für reibungsloses Mining und Überprüfen empfehlen, zukünftige Seed-Hashes und Datensätze in einem separaten Thread vorab zu berechnen. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ -## Zusatz {#appendix} +## Anhang {#appendix} Der folgende Code sollte vorangestellt werden, wenn Sie daran interessiert sind, die obige Python-Spezifikation als Code auszuführen. ```python import sha3, copy -# Assumes little endian bit ordering (same as Intel architectures) +# Setzt Little-Endian-Bit-Reihenfolge voraus (wie bei Intel-Architekturen) def decode_int(s): return int(s[::-1].encode('hex'), 16) if s else 0 @@ -248,7 +248,7 @@ def serialize_cache(ds): serialize_dataset = serialize_cache -# sha3 hash function, outputs 64 bytes +# SHA3-Hash-Funktion, gibt 64 Bytes aus def sha3_512(x): return hash_words(lambda v: sha3.sha3_512(v).digest(), 64, x) @@ -751,269 +751,268 @@ cache_sizes = [ 70907968, 71040832, 71171648, 71303104, 71432512, 71564992, 71695168, 71826368, 71958464, 72089536, 72219712, 72350144, 72482624, 72613568, 72744512, 72875584, 73006144, 73138112, 73268672, 73400128, 73530944, -73662272, 73793344, 73924544, 74055104, 74185792, 74316992, 74448832, -74579392, 74710976, 74841664, 74972864, 75102784, 75233344, 75364544, -75497024, 75627584, 75759296, 75890624, 76021696, 76152256, 76283072, -76414144, 76545856, 76676672, 76806976, 76937792, 77070016, 77200832, -77331392, 77462464, 77593664, 77725376, 77856448, 77987776, 78118336, -78249664, 78380992, 78511424, 78642496, 78773056, 78905152, 79033664, -79166656, 79297472, 79429568, 79560512, 79690816, 79822784, 79953472, -80084672, 80214208, 80346944, 80477632, 80608576, 80740288, 80870848, -81002048, 81133504, 81264448, 81395648, 81525952, 81657536, 81786304, -81919808, 82050112, 82181312, 82311616, 82443968, 82573376, 82705984, -82835776, 82967744, 83096768, 83230528, 83359552, 83491264, 83622464, -83753536, 83886016, 84015296, 84147776, 84277184, 84409792, 84540608, -84672064, 84803008, 84934336, 85065152, 85193792, 85326784, 85458496, -85589312, 85721024, 85851968, 85982656, 86112448, 86244416, 86370112, -86506688, 86637632, 86769344, 86900672, 87031744, 87162304, 87293632, -87424576, 87555392, 87687104, 87816896, 87947968, 88079168, 88211264, -88341824, 88473152, 88603712, 88735424, 88862912, 88996672, 89128384, -89259712, 89390272, 89521984, 89652544, 89783872, 89914816, 90045376, -90177088, 90307904, 90438848, 90569152, 90700096, 90832832, 90963776, -91093696, 91223744, 91356992, 91486784, 91618496, 91749824, 91880384, -92012224, 92143552, 92273344, 92405696, 92536768, 92666432, 92798912, -92926016, 93060544, 93192128, 93322816, 93453632, 93583936, 93715136, -93845056, 93977792, 94109504, 94240448, 94371776, 94501184, 94632896, -94764224, 94895552, 95023424, 95158208, 95287744, 95420224, 95550016, -95681216, 95811904, 95943872, 96075328, 96203584, 96337856, 96468544, -96599744, 96731072, 96860992, 96992576, 97124288, 97254848, 97385536, -97517248, 97647808, 97779392, 97910464, 98041408, 98172608, 98303168, -98434496, 98565568, 98696768, 98827328, 98958784, 99089728, 99220928, -99352384, 99482816, 99614272, 99745472, 99876416, 100007104, -100138048, 100267072, 100401088, 100529984, 100662592, 100791872, -100925248, 101056064, 101187392, 101317952, 101449408, 101580608, -101711296, 101841728, 101973824, 102104896, 102235712, 102366016, -102498112, 102628672, 102760384, 102890432, 103021888, 103153472, -103284032, 103415744, 103545152, 103677248, 103808576, 103939648, -104070976, 104201792, 104332736, 104462528, 104594752, 104725952, -104854592, 104988608, 105118912, 105247808, 105381184, 105511232, -105643072, 105774784, 105903296, 106037056, 106167872, 106298944, -106429504, 106561472, 106691392, 106822592, 106954304, 107085376, -107216576, 107346368, 107478464, 107609792, 107739712, 107872192, -108003136, 108131392, 108265408, 108396224, 108527168, 108657344, -108789568, 108920384, 109049792, 109182272, 109312576, 109444928, -109572928, 109706944, 109837888, 109969088, 110099648, 110230976, -110362432, 110492992, 110624704, 110755264, 110886208, 111017408, -111148864, 111279296, 111410752, 111541952, 111673024, 111803456, -111933632, 112066496, 112196416, 112328512, 112457792, 112590784, -112715968, 112852672, 112983616, 113114944, 113244224, 113376448, -113505472, 113639104, 113770304, 113901376, 114031552, 114163264, -114294592, 114425536, 114556864, 114687424, 114818624, 114948544, -115080512, 115212224, 115343296, 115473472, 115605184, 115736128, -115867072, 115997248, 116128576, 116260288, 116391488, 116522944, -116652992, 116784704, 116915648, 117046208, 117178304, 117308608, -117440192, 117569728, 117701824, 117833024, 117964096, 118094656, -118225984, 118357312, 118489024, 118617536, 118749632, 118882112, -119012416, 119144384, 119275328, 119406016, 119537344, 119668672, -119798464, 119928896, 120061376, 120192832, 120321728, 120454336, -120584512, 120716608, 120848192, 120979136, 121109056, 121241408, -121372352, 121502912, 121634752, 121764416, 121895744, 122027072, -122157632, 122289088, 122421184, 122550592, 122682944, 122813888, -122945344, 123075776, 123207488, 123338048, 123468736, 123600704, -123731264, 123861952, 123993664, 124124608, 124256192, 124386368, -124518208, 124649024, 124778048, 124911296, 125041088, 125173696, -125303744, 125432896, 125566912, 125696576, 125829056, 125958592, -126090304, 126221248, 126352832, 126483776, 126615232, 126746432, -126876608, 127008704, 127139392, 127270336, 127401152, 127532224, -127663552, 127794752, 127925696, 128055232, 128188096, 128319424, -128449856, 128581312, 128712256, 128843584, 128973632, 129103808, -129236288, 129365696, 129498944, 129629888, 129760832, 129892288, -130023104, 130154048, 130283968, 130416448, 130547008, 130678336, -130807616, 130939456, 131071552, 131202112, 131331776, 131464384, -131594048, 131727296, 131858368, 131987392, 132120256, 132250816, -132382528, 132513728, 132644672, 132774976, 132905792, 133038016, -133168832, 133299392, 133429312, 133562048, 133692992, 133823296, -133954624, 134086336, 134217152, 134348608, 134479808, 134607296, -134741056, 134872384, 135002944, 135134144, 135265472, 135396544, -135527872, 135659072, 135787712, 135921472, 136052416, 136182848, -136313792, 136444864, 136576448, 136707904, 136837952, 136970048, -137099584, 137232064, 137363392, 137494208, 137625536, 137755712, -137887424, 138018368, 138149824, 138280256, 138411584, 138539584, -138672832, 138804928, 138936128, 139066688, 139196864, 139328704, -139460032, 139590208, 139721024, 139852864, 139984576, 140115776, -140245696, 140376512, 140508352, 140640064, 140769856, 140902336, -141032768, 141162688, 141294016, 141426496, 141556544, 141687488, -141819584, 141949888, 142080448, 142212544, 142342336, 142474432, -142606144, 142736192, 142868288, 142997824, 143129408, 143258944, -143392448, 143523136, 143653696, 143785024, 143916992, 144045632, -144177856, 144309184, 144440768, 144570688, 144701888, 144832448, -144965056, 145096384, 145227584, 145358656, 145489856, 145620928, -145751488, 145883072, 146011456, 146144704, 146275264, 146407232, -146538176, 146668736, 146800448, 146931392, 147062336, 147193664, -147324224, 147455936, 147586624, 147717056, 147848768, 147979456, -148110784, 148242368, 148373312, 148503232, 148635584, 148766144, -148897088, 149028416, 149159488, 149290688, 149420224, 149551552, -149683136, 149814976, 149943616, 150076352, 150208064, 150338624, -150470464, 150600256, 150732224, 150862784, 150993088, 151125952, -151254976, 151388096, 151519168, 151649728, 151778752, 151911104, -152042944, 152174144, 152304704, 152435648, 152567488, 152698816, -152828992, 152960576, 153091648, 153222976, 153353792, 153484096, -153616192, 153747008, 153878336, 154008256, 154139968, 154270912, -154402624, 154533824, 154663616, 154795712, 154926272, 155057984, -155188928, 155319872, 155450816, 155580608, 155712064, 155843392, -155971136, 156106688, 156237376, 156367424, 156499264, 156630976, -156761536, 156892352, 157024064, 157155008, 157284416, 157415872, -157545536, 157677248, 157810496, 157938112, 158071744, 158203328, -158334656, 158464832, 158596288, 158727616, 158858048, 158988992, -159121216, 159252416, 159381568, 159513152, 159645632, 159776192, -159906496, 160038464, 160169536, 160300352, 160430656, 160563008, -160693952, 160822208, 160956352, 161086784, 161217344, 161349184, -161480512, 161611456, 161742272, 161873216, 162002752, 162135872, -162266432, 162397888, 162529216, 162660032, 162790976, 162922048, -163052096, 163184576, 163314752, 163446592, 163577408, 163707968, -163839296, 163969984, 164100928, 164233024, 164364224, 164494912, -164625856, 164756672, 164887616, 165019072, 165150016, 165280064, -165412672, 165543104, 165674944, 165805888, 165936832, 166067648, -166198336, 166330048, 166461248, 166591552, 166722496, 166854208, -166985408, 167116736, 167246656, 167378368, 167508416, 167641024, -167771584, 167903168, 168034112, 168164032, 168295744, 168427456, -168557632, 168688448, 168819136, 168951616, 169082176, 169213504, -169344832, 169475648, 169605952, 169738048, 169866304, 169999552, -170131264, 170262464, 170393536, 170524352, 170655424, 170782016, -170917696, 171048896, 171179072, 171310784, 171439936, 171573184, -171702976, 171835072, 171966272, 172097216, 172228288, 172359232, -172489664, 172621376, 172747712, 172883264, 173014208, 173144512, -173275072, 173407424, 173539136, 173669696, 173800768, 173931712, -174063424, 174193472, 174325696, 174455744, 174586816, 174718912, -174849728, 174977728, 175109696, 175242688, 175374272, 175504832, -175636288, 175765696, 175898432, 176028992, 176159936, 176291264, -176422592, 176552512, 176684864, 176815424, 176946496, 177076544, -177209152, 177340096, 177470528, 177600704, 177731648, 177864256, -177994816, 178126528, 178257472, 178387648, 178518464, 178650176, -178781888, 178912064, 179044288, 179174848, 179305024, 179436736, -179568448, 179698496, 179830208, 179960512, 180092608, 180223808, -180354752, 180485696, 180617152, 180748096, 180877504, 181009984, -181139264, 181272512, 181402688, 181532608, 181663168, 181795136, -181926592, 182057536, 182190016, 182320192, 182451904, 182582336, -182713792, 182843072, 182976064, 183107264, 183237056, 183368384, -183494848, 183631424, 183762752, 183893824, 184024768, 184154816, -184286656, 184417984, 184548928, 184680128, 184810816, 184941248, -185072704, 185203904, 185335616, 185465408, 185596352, 185727296, -185859904, 185989696, 186121664, 186252992, 186383552, 186514112, -186645952, 186777152, 186907328, 187037504, 187170112, 187301824, -187429184, 187562048, 187693504, 187825472, 187957184, 188087104, -188218304, 188349376, 188481344, 188609728, 188743616, 188874304, -189005248, 189136448, 189265088, 189396544, 189528128, 189660992, -189791936, 189923264, 190054208, 190182848, 190315072, 190447424, -190577984, 190709312, 190840768, 190971328, 191102656, 191233472, -191364032, 191495872, 191626816, 191758016, 191888192, 192020288, -192148928, 192282176, 192413504, 192542528, 192674752, 192805952, -192937792, 193068608, 193198912, 193330496, 193462208, 193592384, -193723456, 193854272, 193985984, 194116672, 194247232, 194379712, -194508352, 194641856, 194772544, 194900672, 195035072, 195166016, -195296704, 195428032, 195558592, 195690304, 195818176, 195952576, -196083392, 196214336, 196345792, 196476736, 196607552, 196739008, -196869952, 197000768, 197130688, 197262784, 197394368, 197523904, -197656384, 197787584, 197916608, 198049472, 198180544, 198310208, -198442432, 198573632, 198705088, 198834368, 198967232, 199097792, -199228352, 199360192, 199491392, 199621696, 199751744, 199883968, -200014016, 200146624, 200276672, 200408128, 200540096, 200671168, -200801984, 200933312, 201062464, 201194944, 201326144, 201457472, -201588544, 201719744, 201850816, 201981632, 202111552, 202244032, -202374464, 202505152, 202636352, 202767808, 202898368, 203030336, -203159872, 203292608, 203423296, 203553472, 203685824, 203816896, -203947712, 204078272, 204208192, 204341056, 204472256, 204603328, -204733888, 204864448, 204996544, 205125568, 205258304, 205388864, -205517632, 205650112, 205782208, 205913536, 206044736, 206176192, -206307008, 206434496, 206569024, 206700224, 206831168, 206961856, -207093056, 207223616, 207355328, 207486784, 207616832, 207749056, -207879104, 208010048, 208141888, 208273216, 208404032, 208534336, -208666048, 208796864, 208927424, 209059264, 209189824, 209321792, -209451584, 209582656, 209715136, 209845568, 209976896, 210106432, -210239296, 210370112, 210501568, 210630976, 210763712, 210894272, -211024832, 211156672, 211287616, 211418176, 211549376, 211679296, -211812032, 211942592, 212074432, 212204864, 212334016, 212467648, -212597824, 212727616, 212860352, 212991424, 213120832, 213253952, -213385024, 213515584, 213645632, 213777728, 213909184, 214040128, -214170688, 214302656, 214433728, 214564544, 214695232, 214826048, -214956992, 215089088, 215219776, 215350592, 215482304, 215613248, -215743552, 215874752, 216005312, 216137024, 216267328, 216399296, -216530752, 216661696, 216790592, 216923968, 217054528, 217183168, -217316672, 217448128, 217579072, 217709504, 217838912, 217972672, -218102848, 218233024, 218364736, 218496832, 218627776, 218759104, -218888896, 219021248, 219151936, 219281728, 219413056, 219545024, -219675968, 219807296, 219938624, 220069312, 220200128, 220331456, -220461632, 220592704, 220725184, 220855744, 220987072, 221117888, -221249216, 221378368, 221510336, 221642048, 221772736, 221904832, -222031808, 222166976, 222297536, 222428992, 222559936, 222690368, -222820672, 222953152, 223083968, 223213376, 223345984, 223476928, -223608512, 223738688, 223869376, 224001472, 224132672, 224262848, -224394944, 224524864, 224657344, 224788288, 224919488, 225050432, -225181504, 225312704, 225443776, 225574592, 225704768, 225834176, -225966784, 226097216, 226229824, 226360384, 226491712, 226623424, -226754368, 226885312, 227015104, 227147456, 227278528, 227409472, -227539904, 227669696, 227802944, 227932352, 228065216, 228196288, -228326464, 228457792, 228588736, 228720064, 228850112, 228981056, -229113152, 229243328, 229375936, 229505344, 229636928, 229769152, -229894976, 230030272, 230162368, 230292416, 230424512, 230553152, -230684864, 230816704, 230948416, 231079616, 231210944, 231342016, -231472448, 231603776, 231733952, 231866176, 231996736, 232127296, -232259392, 232388672, 232521664, 232652608, 232782272, 232914496, -233043904, 233175616, 233306816, 233438528, 233569984, 233699776, -233830592, 233962688, 234092224, 234221888, 234353984, 234485312, -234618304, 234749888, 234880832, 235011776, 235142464, 235274048, -235403456, 235535936, 235667392, 235797568, 235928768, 236057152, -236190272, 236322752, 236453312, 236583616, 236715712, 236846528, -236976448, 237108544, 237239104, 237371072, 237501632, 237630784, -237764416, 237895232, 238026688, 238157632, 238286912, 238419392, -238548032, 238681024, 238812608, 238941632, 239075008, 239206336, -239335232, 239466944, 239599168, 239730496, 239861312, 239992384, -240122816, 240254656, 240385856, 240516928, 240647872, 240779072, -240909632, 241040704, 241171904, 241302848, 241433408, 241565248, -241696192, 241825984, 241958848, 242088256, 242220224, 242352064, -242481856, 242611648, 242744896, 242876224, 243005632, 243138496, -243268672, 243400384, 243531712, 243662656, 243793856, 243924544, -244054592, 244187072, 244316608, 244448704, 244580032, 244710976, -244841536, 244972864, 245104448, 245233984, 245365312, 245497792, -245628736, 245759936, 245889856, 246021056, 246152512, 246284224, -246415168, 246545344, 246675904, 246808384, 246939584, 247070144, -247199552, 247331648, 247463872, 247593536, 247726016, 247857088, -247987648, 248116928, 248249536, 248380736, 248512064, 248643008, -248773312, 248901056, 249036608, 249167552, 249298624, 249429184, -249560512, 249692096, 249822784, 249954112, 250085312, 250215488, -250345792, 250478528, 250608704, 250739264, 250870976, 251002816, -251133632, 251263552, 251395136, 251523904, 251657792, 251789248, -251919424, 252051392, 252182464, 252313408, 252444224, 252575552, -252706624, 252836032, 252968512, 253099712, 253227584, 253361728, -253493056, 253623488, 253754432, 253885504, 254017216, 254148032, -254279488, 254410432, 254541376, 254672576, 254803264, 254933824, -255065792, 255196736, 255326528, 255458752, 255589952, 255721408, -255851072, 255983296, 256114624, 256244416, 256374208, 256507712, -256636096, 256768832, 256900544, 257031616, 257162176, 257294272, -257424448, 257555776, 257686976, 257818432, 257949632, 258079552, -258211136, 258342464, 258473408, 258603712, 258734656, 258867008, -258996544, 259127744, 259260224, 259391296, 259522112, 259651904, -259784384, 259915328, 260045888, 260175424, 260308544, 260438336, -260570944, 260700992, 260832448, 260963776, 261092672, 261226304, -261356864, 261487936, 261619648, 261750592, 261879872, 262011968, -262143424, 262274752, 262404416, 262537024, 262667968, 262799296, -262928704, 263061184, 263191744, 263322944, 263454656, 263585216, -263716672, 263847872, 263978944, 264108608, 264241088, 264371648, -264501184, 264632768, 264764096, 264895936, 265024576, 265158464, -265287488, 265418432, 265550528, 265681216, 265813312, 265943488, -266075968, 266206144, 266337728, 266468032, 266600384, 266731072, -266862272, 266993344, 267124288, 267255616, 267386432, 267516992, -267648704, 267777728, 267910592, 268040512, 268172096, 268302784, -268435264, 268566208, 268696256, 268828096, 268959296, 269090368, -269221312, 269352256, 269482688, 269614784, 269745856, 269876416, -270007616, 270139328, 270270272, 270401216, 270531904, 270663616, -270791744, 270924736, 271056832, 271186112, 271317184, 271449536, -271580992, 271711936, 271843136, 271973056, 272105408, 272236352, -272367296, 272498368, 272629568, 272759488, 272891456, 273022784, -273153856, 273284672, 273415616, 273547072, 273677632, 273808448, -273937088, 274071488, 274200896, 274332992, 274463296, 274595392, -274726208, 274857536, 274988992, 275118656, 275250496, 275382208, -275513024, 275643968, 275775296, 275906368, 276037184, 276167872, -276297664, 276429376, 276560576, 276692672, 276822976, 276955072, -277085632, 277216832, 277347008, 277478848, 277609664, 277740992, -277868608, 278002624, 278134336, 278265536, 278395328, 278526784, -278657728, 278789824, 278921152, 279052096, 279182912, 279313088, -279443776, 279576256, 279706048, 279838528, 279969728, 280099648, -280230976, 280361408, 280493632, 280622528, 280755392, 280887104, -281018176, 281147968, 281278912, 281411392, 281542592, 281673152, -281803712, 281935552, 282066496, 282197312, 282329024, 282458816, -282590272, 282720832, 282853184, 282983744, 283115072, 283246144, -283377344, 283508416, 283639744, 283770304, 283901504, 284032576, -284163136, 284294848, 284426176, 284556992, 284687296, 284819264, -284950208, 285081536] +73662272, 73793344, 74055104, 74185792, 74316992, 74448832, 74579392, +74710976, 74841664, 74972864, 75102784, 75233344, 75364544, 75497024, +75627584, 75759296, 75890624, 76021696, 76152256, 76283072, 76414144, +76545856, 76676672, 76806976, 76937792, 77070016, 77200832, 77331392, +77462464, 77593664, 77725376, 77856448, 77987776, 78118336, 78249664, +78380992, 78511424, 78642496, 78773056, 78905152, 79033664, 79166656, +79297472, 79429568, 79560512, 79690816, 79822784, 79953472, 80084672, +80214208, 80346944, 80477632, 80608576, 80740288, 80870848, 81002048, +81133504, 81264448, 81395648, 81525952, 81657536, 81786304, 81919808, +82050112, 82181312, 82311616, 82443968, 82573376, 82705984, 82835776, +82967744, 83096768, 83230528, 83359552, 83491264, 83622464, 83753536, +83886016, 84015296, 84147776, 84277184, 84409792, 84540608, 84672064, +84803008, 84934336, 85065152, 85193792, 85326784, 85458496, 85589312, +85721024, 85851968, 85982656, 86112448, 86244416, 86370112, 86506688, +86637632, 86769344, 86900672, 87031744, 87162304, 87293632, 87424576, +87555392, 87687104, 87816896, 87947968, 88079168, 88211264, 88341824, +88473152, 88603712, 88735424, 88862912, 88996672, 89128384, 89259712, +89390272, 89521984, 89652544, 89783872, 89914816, 90045376, 90177088, +90307904, 90438848, 90569152, 90700096, 90832832, 90963776, 91093696, +91223744, 91356992, 91486784, 91618496, 91749824, 91880384, 92012224, +92143552, 92273344, 92405696, 92536768, 92666432, 92798912, 92926016, +93060544, 93192128, 93322816, 93453632, 93583936, 93715136, 93845056, +93977792, 94109504, 94240448, 94371776, 94501184, 94632896, 94764224, +94895552, 95023424, 95158208, 95287744, 95420224, 95550016, 95681216, +95811904, 95943872, 96075328, 96203584, 96337856, 96468544, 96599744, +96731072, 96860992, 96992576, 97124288, 97254848, 97385536, 97517248, +97647808, 97779392, 97910464, 98041408, 98172608, 98303168, 98434496, +98565568, 98696768, 98827328, 98958784, 99089728, 99220928, 99352384, +99482816, 99614272, 99745472, 99876416, 100007104, 100138048, 100267072, +100401088, 100529984, 100662592, 100791872, 100925248, 101056064, 101187392, +101317952, 101449408, 101580608, 101711296, 101841728, 101973824, +102104896, 102235712, 102366016, 102498112, 102628672, 102760384, +102890432, 103021888, 103153472, 103284032, 103415744, 103545152, +103677248, 103808576, 103939648, 104070976, 104201792, 104332736, +104462528, 104594752, 104725952, 104854592, 104988608, 105118912, +105247808, 105381184, 105511232, 105643072, 105774784, 105903296, +106037056, 106167872, 106298944, 106429504, 106561472, 106691392, +106822592, 106954304, 107085376, 107216576, 107346368, 107478464, +107609792, 107739712, 107872192, 108003136, 108131392, 108265408, +108396224, 108527168, 108657344, 108789568, 108920384, 109049792, +109182272, 109312576, 109444928, 109572928, 109706944, 109837888, +109969088, 110099648, 110230976, 110362432, 110492992, 110624704, +110755264, 110886208, 111017408, 111148864, 111279296, 111410752, +111541952, 111673024, 111803456, 111933632, 112066496, 112196416, +112328512, 112457792, 112590784, 112715968, 112852672, 112983616, +113114944, 113244224, 113376448, 113505472, 113639104, 113770304, +113901376, 114031552, 114163264, 114294592, 114425536, 114556864, +114687424, 114818624, 114948544, 115080512, 115212224, 115343296, +115473472, 115605184, 115736128, 115867072, 115997248, 116128576, +116260288, 116391488, 116522944, 116652992, 116784704, 116915648, +117046208, 117178304, 117308608, 117440192, 117569728, 117701824, +117833024, 117964096, 118094656, 118225984, 118357312, 118489024, +118617536, 118749632, 118882112, 119012416, 119144384, 119275328, +119406016, 119537344, 119668672, 119798464, 119928896, 120061376, +120192832, 120321728, 120454336, 120584512, 120716608, 120848192, +120979136, 121109056, 121241408, 121372352, 121502912, 121634752, +121764416, 121895744, 122027072, 122157632, 122289088, 122421184, +122550592, 122682944, 122813888, 122945344, 123075776, 123207488, +123338048, 123468736, 123600704, 123731264, 123861952, 123993664, +124124608, 124256192, 124386368, 124518208, 124649024, 124778048, +124911296, 125041088, 125173696, 125303744, 125432896, 125566912, +125696576, 125829056, 125958592, 126090304, 126221248, 126352832, +126483776, 126615232, 126746432, 126876608, 127008704, 127139392, +127270336, 127401152, 127532224, 127663552, 127794752, 127925696, +128055232, 128188096, 128319424, 128449856, 128581312, 128712256, +128843584, 128973632, 129103808, 129236288, 129365696, 129498944, +129629888, 129760832, 129892288, 130023104, 130154048, 130283968, +130416448, 130547008, 130678336, 130807616, 130939456, 131071552, +131202112, 131331776, 131464384, 131594048, 131727296, 131858368, +131987392, 132120256, 132250816, 132382528, 132513728, 132644672, +132774976, 132905792, 133038016, 133168832, 133299392, 133429312, +133562048, 133692992, 133823296, 133954624, 134086336, 134217152, +134348608, 134479808, 134607296, 134741056, 134872384, 135002944, +135134144, 135265472, 135396544, 135527872, 135659072, 135787712, +135921472, 136052416, 136182848, 136313792, 136444864, 136576448, +136707904, 136837952, 136970048, 137099584, 137232064, 137363392, +137494208, 137625536, 137755712, 137887424, 138018368, 138149824, +138280256, 138411584, 138539584, 138672832, 138804928, 138936128, +139066688, 139196864, 139328704, 139460032, 139590208, 139721024, +139852864, 139984576, 140115776, 140245696, 140376512, 140508352, +140640064, 140769856, 140902336, 141032768, 141162688, 141294016, +141426496, 141556544, 141687488, 141819584, 141949888, 142080448, +142212544, 142342336, 142474432, 142606144, 142736192, 142868288, +142997824, 143129408, 143258944, 143392448, 143523136, 143653696, +143785024, 143916992, 144045632, 144177856, 144309184, 144440768, +144570688, 144701888, 144832448, 144965056, 145096384, 145227584, +145358656, 145489856, 145620928, 145751488, 145883072, 146011456, +146144704, 146275264, 146407232, 146538176, 146668736, 146800448, +146931392, 147062336, 147193664, 147324224, 147455936, 147586624, +147717056, 147848768, 147979456, 148110784, 148242368, 148373312, +148503232, 148635584, 148766144, 148897088, 149028416, 149159488, +149290688, 149420224, 149551552, 149683136, 149814976, 149943616, +150076352, 150208064, 150338624, 150470464, 150600256, 150732224, +150862784, 150993088, 151125952, 151254976, 151388096, 151519168, +151649728, 151778752, 151911104, 152042944, 152174144, 152304704, +152435648, 152567488, 152698816, 152828992, 152960576, 153091648, +153222976, 153353792, 153484096, 153616192, 153747008, 153878336, +154008256, 154139968, 154270912, 154402624, 154533824, 154663616, +154795712, 154926272, 155057984, 155188928, 155319872, 155450816, +155580608, 155712064, 155843392, 155971136, 156106688, 156237376, +156367424, 156499264, 156630976, 156761536, 156892352, 157024064, +157155008, 157284416, 157415872, 157545536, 157677248, 157810496, +157938112, 158071744, 158203328, 158334656, 158464832, 158596288, +158727616, 158858048, 158988992, 159121216, 159252416, 159381568, +159513152, 159645632, 159776192, 159906496, 160038464, 160169536, +160300352, 160430656, 160563008, 160693952, 160822208, 160956352, +161086784, 161217344, 161349184, 161480512, 161611456, 161742272, +161873216, 162002752, 162135872, 162266432, 162397888, 162529216, +162660032, 162790976, 162922048, 163052096, 163184576, 163314752, +163446592, 163577408, 163707968, 163839296, 163969984, 164100928, +164233024, 164364224, 164494912, 164625856, 164756672, 164887616, +165019072, 165150016, 165280064, 165412672, 165543104, 165674944, +165805888, 165936832, 166067648, 166198336, 166330048, 166461248, +166591552, 166722496, 166854208, 166985408, 167116736, 167246656, +167378368, 167508416, 167641024, 167771584, 167903168, 168034112, +168164032, 168295744, 168427456, 168557632, 168688448, 168819136, +168951616, 169082176, 169213504, 169344832, 169475648, 169605952, +169738048, 169866304, 169999552, 170131264, 170262464, 170393536, +170524352, 170655424, 170782016, 170917696, 171048896, 171179072, +171310784, 171439936, 171573184, 171702976, 171835072, 171966272, +172097216, 172228288, 172359232, 172489664, 172621376, 172747712, +172883264, 173014208, 173144512, 173275072, 173407424, 173539136, +173669696, 173800768, 173931712, 174063424, 174193472, 174325696, +174455744, 174586816, 174718912, 174849728, 174977728, 175109696, +175242688, 175374272, 175504832, 175636288, 175765696, 175898432, +176028992, 176159936, 176291264, 176422592, 176552512, 176684864, +176815424, 176946496, 177076544, 177209152, 177340096, 177470528, +177600704, 177731648, 177864256, 177994816, 178126528, 178257472, +178387648, 178518464, 178650176, 178781888, 178912064, 179044288, +179174848, 179305024, 179436736, 179568448, 179698496, 179830208, +179960512, 180092608, 180223808, 180354752, 180485696, 180617152, +180748096, 180877504, 181009984, 181139264, 181272512, 181402688, +181532608, 181663168, 181795136, 181926592, 182057536, 182190016, +182320192, 182451904, 182582336, 182713792, 182843072, 182976064, +183107264, 183237056, 183368384, 183494848, 183631424, 183762752, +183893824, 184024768, 184154816, 184286656, 184417984, 184548928, +184680128, 184810816, 184941248, 185072704, 185203904, 185335616, +185465408, 185596352, 185727296, 185859904, 185989696, 186121664, +186252992, 186383552, 186514112, 186645952, 186777152, 186907328, +187037504, 187170112, 187301824, 187429184, 187562048, 187693504, +187825472, 187957184, 188087104, 188218304, 188349376, 188481344, +188609728, 188743616, 188874304, 189005248, 189136448, 189265088, +189396544, 189528128, 189660992, 189791936, 189923264, 190054208, +190182848, 190315072, 190447424, 190577984, 190709312, 190840768, +190971328, 191102656, 191233472, 191364032, 191495872, 191626816, +191758016, 191888192, 192020288, 192148928, 192282176, 192413504, +192542528, 192674752, 192805952, 192937792, 193068608, 193198912, +193330496, 193462208, 193592384, 193723456, 193854272, 193985984, +194116672, 194247232, 194379712, 194508352, 194641856, 194772544, +194900672, 195035072, 195166016, 195296704, 195428032, 195558592, +195690304, 195818176, 195952576, 196083392, 196214336, 196345792, +196476736, 196607552, 196739008, 196869952, 197000768, 197130688, +197262784, 197394368, 197523904, 197656384, 197787584, 197916608, +198049472, 198180544, 198310208, 198442432, 198573632, 198705088, +198834368, 198967232, 199097792, 199228352, 199360192, 199491392, +199621696, 199751744, 199883968, 200014016, 200146624, 200276672, +200408128, 200540096, 200671168, 200801984, 200933312, 201062464, +201194944, 201326144, 201457472, 201588544, 201719744, 201850816, +201981632, 202111552, 202244032, 202374464, 202505152, 202636352, +202767808, 202898368, 203030336, 203159872, 203292608, 203423296, +203553472, 203685824, 203816896, 203947712, 204078272, 204208192, +204341056, 204472256, 204603328, 204733888, 204864448, 204996544, +205125568, 205258304, 205388864, 205517632, 205650112, 205782208, +205913536, 206044736, 206176192, 206307008, 206434496, 206569024, +206700224, 206831168, 206961856, 207093056, 207223616, 207355328, +207486784, 207616832, 207749056, 207879104, 208010048, 208141888, +208273216, 208404032, 208534336, 208666048, 208796864, 208927424, +209059264, 209189824, 209321792, 209451584, 209582656, 209715136, +209845568, 209976896, 210106432, 210239296, 210370112, 210501568, +210630976, 210763712, 210894272, 211024832, 211156672, 211287616, +211418176, 211549376, 211679296, 211812032, 211942592, 212074432, +212204864, 212334016, 212467648, 212597824, 212727616, 212860352, +212991424, 213120832, 213253952, 213385024, 213515584, 213645632, +213777728, 213909184, 214040128, 214170688, 214302656, 214433728, +214564544, 214695232, 214826048, 214956992, 215089088, 215219776, +215350592, 215482304, 215613248, 215743552, 215874752, 216005312, +216137024, 216267328, 216399296, 216530752, 216661696, 216790592, +216923968, 217054528, 217183168, 217316672, 217448128, 217579072, +217709504, 217838912, 217972672, 218102848, 218233024, 218364736, +218496832, 218627776, 218759104, 218888896, 219021248, 219151936, +219281728, 219413056, 219545024, 219675968, 219807296, 219938624, +220069312, 220200128, 220331456, 220461632, 220592704, 220725184, +220855744, 220987072, 221117888, 221249216, 221378368, 221510336, +221642048, 221772736, 221904832, 222031808, 222166976, 222297536, +222428992, 222559936, 222690368, 222820672, 222953152, 223083968, +223213376, 223345984, 223476928, 223608512, 223738688, 223869376, +224001472, 224132672, 224262848, 224394944, 224524864, 224657344, +224788288, 224919488, 225050432, 225181504, 225312704, 225443776, +225574592, 225704768, 225834176, 225966784, 226097216, 226229824, +226360384, 226491712, 226623424, 226754368, 226885312, 227015104, +227147456, 227278528, 227409472, 227539904, 227669696, 227802944, +227932352, 228065216, 228196288, 228326464, 228457792, 228588736, +228720064, 228850112, 228981056, 229113152, 229243328, 229375936, +229505344, 229636928, 229769152, 229894976, 230030272, 230162368, +230292416, 230424512, 230553152, 230684864, 230816704, 230948416, +231079616, 231210944, 231342016, 231472448, 231603776, 231733952, +231866176, 231996736, 232127296, 232259392, 232388672, 232521664, +232652608, 232782272, 232914496, 233043904, 233175616, 233306816, +233438528, 233569984, 233699776, 233830592, 233962688, 234092224, +234221888, 234353984, 234485312, 234618304, 234749888, 234880832, +235011776, 235142464, 235274048, 235403456, 235535936, 235667392, +235797568, 235928768, 236057152, 236190272, 236322752, 236453312, +236583616, 236715712, 236846528, 236976448, 237108544, 237239104, +237371072, 237501632, 237630784, 237764416, 237895232, 238026688, +238157632, 238286912, 238419392, 238548032, 238681024, 238812608, +238941632, 239075008, 239206336, 239335232, 239466944, 239599168, +239730496, 239861312, 239992384, 240122816, 240254656, 240385856, +240516928, 240647872, 240779072, 240909632, 241040704, 241171904, +241302848, 241433408, 241565248, 241696192, 241825984, 241958848, +242088256, 242220224, 242352064, 242481856, 242611648, 242744896, +242876224, 243005632, 243138496, 243268672, 243400384, 243531712, +243662656, 243793856, 243924544, 244054592, 244187072, 244316608, +244448704, 244580032, 244710976, 244841536, 244972864, 245104448, +245233984, 245365312, 245497792, 245628736, 245759936, 245889856, +246021056, 246152512, 246284224, 246415168, 246545344, 246675904, +246808384, 246939584, 247070144, 247199552, 247331648, 247463872, +247593536, 247726016, 247857088, 247987648, 248116928, 248249536, +248380736, 248512064, 248643008, 248773312, 248901056, 249036608, +249167552, 249298624, 249429184, 249560512, 249692096, 249822784, +249954112, 250085312, 250215488, 250345792, 250478528, 250608704, +250739264, 250870976, 251002816, 251133632, 251263552, 251395136, +251523904, 251657792, 251789248, 251919424, 252051392, 252182464, +252313408, 252444224, 252575552, 252706624, 252836032, 252968512, +253099712, 253227584, 253361728, 253493056, 253623488, 253754432, +253885504, 254017216, 254148032, 254279488, 254410432, 254541376, +254672576, 254803264, 254933824, 255065792, 255196736, 255326528, +255458752, 255589952, 255721408, 255851072, 255983296, 256114624, +256244416, 256374208, 256507712, 256636096, 256768832, 256900544, +257031616, 257162176, 257294272, 257424448, 257555776, 257686976, +257818432, 257949632, 258079552, 258211136, 258342464, 258473408, +258603712, 258734656, 258867008, 258996544, 259127744, 259260224, +259391296, 259522112, 259651904, 259784384, 259915328, 260045888, +260175424, 260308544, 260438336, 260570944, 260700992, 260832448, +260963776, 261092672, 261226304, 261356864, 261487936, 261619648, +261750592, 261879872, 262011968, 262143424, 262274752, 262404416, +262537024, 262667968, 262799296, 262928704, 263061184, 263191744, +263322944, 263454656, 263585216, 263716672, 263847872, 263978944, +264108608, 264241088, 264371648, 264501184, 264632768, 264764096, +264895936, 265024576, 265158464, 265287488, 265418432, 265550528, +265681216, 265813312, 265943488, 266075968, 266206144, 266337728, +266468032, 266600384, 266731072, 266862272, 266993344, 267124288, +267255616, 267386432, 267516992, 267648704, 267777728, 267910592, +268040512, 268172096, 268302784, 268435264, 268566208, 268696256, +268828096, 268959296, 269090368, 269221312, 269352256, 269482688, +269614784, 269745856, 269876416, 270007616, 270139328, 270270272, +270401216, 270531904, 270663616, 270791744, 270924736, 271056832, +271186112, 271317184, 271449536, 271580992, 271711936, 271843136, +271973056, 272105408, 272236352, 272367296, 272498368, 272629568, +272759488, 272891456, 273022784, 273153856, 273284672, 273415616, +273547072, 273677632, 273808448, 273937088, 274071488, 274200896, +274332992, 274463296, 274595392, 274726208, 274857536, 274988992, +275118656, 275250496, 275382208, 275513024, 275643968, 275775296, +275906368, 276037184, 276167872, 276297664, 276429376, 276560576, +276692672, 276822976, 276955072, 277085632, 277216832, 277347008, +277478848, 277609664, 277740992, 277868608, 278002624, 278134336, +278265536, 278395328, 278526784, 278657728, 278789824, 279052096, +279182912, 279313088, 279443776, 279576256, 279706048, 279838528, +279969728, 280099648, 280230976, 280361408, 280493632, 280622528, +280755392, 280887104, 281018176, 281147968, 281278912, 281411392, +281542592, 281673152, 281803712, 281935552, 282066496, 282197312, +282329024, 282458816, 282590272, 282720832, 282853184, 282983744, +283115072, 283246144, 283377344, 283508416, 283639744, 283770304, +283901504, 284032576, 284163136, 284294848, 284426176, 284556992, +284687296, 284819264, 284950208, 285081536] ``` diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md index b7edea0d218..edbaeff9b34 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md @@ -8,7 +8,7 @@ lang: de -Proof-of-work ist nicht länger Ethereums Konsensmechanismus. Dies bedeutet, dass das Minen abgeschaltet wurde. Ethereum wird stattdessen durch Validatoren gesichert, die ETH einsetzen. Sie können schon heute mit dem Staking von ETH beginnen. Lese mehr dazu unter den Merge, Proof-of-Stake, und Staking. Diese Seite dient ausschließlich dem geschichtlichen Interesse. +Proof-of-Work ist nicht mehr der zugrunde liegende Konsensmechanismus von Ethereum, was bedeutet, dass das Mining ausgeschaltet wurde. Stattdessen wird Ethereum von Validatoren gesichert, die ETH staken. Sie können schon heute mit dem Staking von ETH beginnen. Lese mehr dazu unter den Merge, Proof-of-Stake, und Staking. Diese Seite dient ausschließlich dem geschichtlichen Interesse. @@ -17,26 +17,26 @@ Ethereum-Mining nutzte einen Algorithmus namens Ethash. Die Grundidee des Algori ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir, dass Sie zunächst etwas über den [Proof-of-Work-Konsens](/developers/docs/consensus-mechanisms/pow) und [das Mining](/developers/docs/consensus-mechanisms/pow/mining) lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über den [Proof-of-Work-Konsens](/developers/docs/consensus-mechanisms/pow) und das [Mining](/developers/docs/consensus-mechanisms/pow/mining) zu informieren. -## Dagger-Hashimoto {#dagger-hashimoto} +## Dagger Hashimoto {#dagger-hashimoto} Dagger Hashimoto war ein Wegbereiter-Forschungsalgorithmus für das Ethereum-Mining, der von Ethash abgelöst wurde. Er war eine Verschmelzung zweier anderer Algorithmen: Dagger und Hashimoto. Er war stets nur eine Forschungsimplementierung und wurde mit Veröffentlichung des Ethereum-Mainnets von Ethash abgelöst. -[Dagger](http://www.hashcash.org/papers/dagger.html) beinhaltet unter anderem die Generierung eines [Directed Acyclic Graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph), von dem zufällige Teile zu einem Hash-Wert zusammengefügt werden. Der Grundgedanke beruht darauf, dass jede Nonce nur einen kleinen Abschnitt eines großen Gesamt-Datenbaums benötigt. Den Unterbaum für jede Nonce neu zu berechnen, würde Mining unmöglich machen – weshalb der Baum gespeichert werden muss –, doch für die Verifizierung einer einzigen Nonce ist dieser Vorgang in Ordnung. Dagger wurde als Alternative zu bestehenden Algorithmen wie Scrypt entwickelt, die speicherhart, aber schwer zu verifizieren sind, wenn ihre Speicherhärte auf tatsächlich sichere Ebenen ansteigt. Dagger hatte jedoch Schwachstellen durch Hardwarebeschleunigung in Shared-Memory-Umgebungen und wurde daher durch andere Methoden in der Forschung ersetzt. +[Dagger](http://www.hashcash.org/papers/dagger.html) beinhaltet die Erzeugung eines [gerichteten azyklischen Graphen](https://en.wikipedia.org/wiki/Directed_acyclic_graph), dessen zufällige Ausschnitte zusammengehasht werden. Der Grundgedanke beruht darauf, dass jede Nonce nur einen kleinen Abschnitt eines großen Gesamt-Datenbaums benötigt. Den Unterbaum für jede Nonce neu zu berechnen, würde Mining unmöglich machen – weshalb der Baum gespeichert werden muss –, doch für die Verifizierung einer einzigen Nonce ist dieser Vorgang in Ordnung. Dagger wurde als Alternative zu bestehenden Algorithmen wie Scrypt entwickelt, die speicherhart, aber schwer zu verifizieren sind, wenn ihre Speicherhärte auf tatsächlich sichere Ebenen ansteigt. Dagger hatte jedoch Schwachstellen durch Hardwarebeschleunigung in Shared-Memory-Umgebungen und wurde daher durch andere Methoden in der Forschung ersetzt. -[Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) ist ein Algorithmus, der durch I/O-Limitierung ASIC-resistent ist (d. h., Speicherzugriffe sind der limitierende Faktor während des Miningprozesses). Die Theorie dahinter besagt, dass RAM leichter verfügbar ist als Rechenleistung; durch milliardenschwere Forschung wurde bereits untersucht, inwieweit sich RAM für verschiedene Nutzungsszenarien optimieren lässt, die häufig annähernd zufällige Zugriffsmuster nutzen (daher „Random Access Memory“). Daraus folgt, dass bestehende RAM-Lösungen wahrscheinlich annähernd optimal für die Bewertung des Algorithmus sind. Hashimoto nutzt die Blockchain als Datenquelle, was sowohl den Punkt (1) als auch (3) weiter oben erfüllt. +[Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) ist ein Algorithmus, der durch seine I/O-Limitierung ASIC-resistent ist (d. h. Speicherlesevorgänge sind der limitierende Faktor im Mining-Prozess). Die Theorie dahinter besagt, dass RAM leichter verfügbar ist als Rechenleistung; durch milliardenschwere Forschung wurde bereits untersucht, inwieweit sich RAM für verschiedene Nutzungsszenarien optimieren lässt, die häufig annähernd zufällige Zugriffsmuster nutzen (daher „Random Access Memory“). Daraus folgt, dass bestehende RAM-Lösungen wahrscheinlich annähernd optimal für die Bewertung des Algorithmus sind. Hashimoto nutzt die Blockchain als Datenquelle, was sowohl den Punkt (1) als auch (3) weiter oben erfüllt. -Dagger-Hashimoto verwendete abgeänderte Versionen der Algorithmen von Dagger und Hashimoto. Der Unterschied zwischen Dagger-Hashimoto und Hashimoto besteht darin, dass Dagger-Hashimoto anstatt der Blockchain einen spezifischen Datensatz nutzt, der entsprechend den Blockdaten alle n Blöcke eine Aktualisierung durchführt. Der Datensatz wird durch den Dagger-Algorithmus generiert, was die effiziente Berechnung einer Untergruppe für jede Nonce für den Verifizierungsalgorithmus des Light-Clients ermöglicht. Der Unterschied zwischen Dagger-Hashimoto und Dagger besteht darin, dass – anders als im originalen Dagger – der Datensatz, der für die Anfrage an den Block genutzt wird, semi-permanent ist und nur gelegentlich aktualisiert wird (beispielsweise einmal pro Woche). Das bedeutet, dass der Anteil des Aufwands für die Generierung des Datensatzes annähernd null ist, weshalb Sergio Lerners Argumente in Bezug auf Geschwindigkeitszuwächse durch Shared-Memory vernachlässigbar sind. +Dagger-Hashimoto verwendete abgeänderte Versionen der Algorithmen von Dagger und Hashimoto. Der Unterschied zwischen Dagger-Hashimoto und Hashimoto besteht darin, dass Dagger-Hashimoto anstatt der Blockchain einen spezifischen Datensatz nutzt, der entsprechend den Blockdaten alle n Blöcke eine Aktualisierung durchführt. Der Datensatz wird durch den Dagger-Algorithmus generiert, was die effiziente Berechnung einer Untergruppe für jede Nonce für den Verifizierungsalgorithmus des Light-Clients ermöglicht. Der Unterschied zwischen Dagger-Hashimoto und Dagger besteht darin, dass, anders als beim ursprünglichen Dagger, der zur Abfrage des Blocks verwendete Datensatz semi-permanent ist und nur in gelegentlichen Abständen (z. B. einmal pro Woche) aktualisiert wird. Das bedeutet, dass der Anteil des Aufwands für die Generierung des Datensatzes annähernd null ist, weshalb Sergio Lerners Argumente in Bezug auf Geschwindigkeitszuwächse durch Shared-Memory vernachlässigbar sind. -Erfahren Sie mehr über [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto). +Mehr über [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto). ## Ethash {#ethash} -Ethash war der Mining-Algorithmus, der tatsächlich auf dem echten Ethereum-Mainnet unter der inzwischen veralteten Proof-of-Work-Architektur verwendet wurde. Ethash war im Grunde ein neuer Name, der einer bestimmten Version von Dagger-Hashimoto gegeben wurde, nachdem der Algorithmus signifikant aktualisiert worden war, aber noch immer die grundlegenden Prinzipien seines Vorgängers befolgte. Das Ethereum-Mainnet hat immer ausschließlich Ethash verwendet – Dagger-Hashimoto war eine Forschungs- und Entwicklungsversion des Mining-Algorithmus, die noch vor dem Mining auf dem Ethereum-Mainnet ersetzt wurde. +Ethash war der Mining-Algorithmus, der tatsächlich auf dem echten Ethereum-Mainnet unter der inzwischen veralteten Proof-of-Work-Architektur verwendet wurde. Ethash war im Grunde ein neuer Name, der einer bestimmten Version von Dagger-Hashimoto gegeben wurde, nachdem der Algorithmus signifikant aktualisiert worden war, aber noch immer die grundlegenden Prinzipien seines Vorgängers befolgte. Das Ethereum-Mainnet hat ausschließlich Ethash verwendet – Dagger Hashimoto war eine F&E-Version des Mining-Algorithmus, die abgelöst wurde, bevor das Mining im Ethereum-Mainnet startete. -[Mehr über Ethash](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash). +Mehr über [Ethash](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash). -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -_Kennen Sie eine Community Ressource, die Ihnen geholfen hat? Bearbeite diese Seite und füge sie hinzu!_ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/dapps/index.md b/public/content/translations/de/developers/docs/dapps/index.md index 934f383496c..90697938693 100644 --- a/public/content/translations/de/developers/docs/dapps/index.md +++ b/public/content/translations/de/developers/docs/dapps/index.md @@ -1,27 +1,27 @@ --- -title: Einführung in Dapps +title: Technische Grundlagen von DApps description: lang: de --- -Eine dezentralisierte Anwendung (dapp) ist eine Anwendung, die auf einem dezentralisierten Netzwerk aufgebaut ist. Dies kombiniert einen [Smart Contract](/developers/docs/smart-contracts/) und eine Frontend-Benutzeroberfläche. Beachte, dass Smart Contracts in Ethereum zugänglich und transparent sind – wie offene APIs –, also kann deine Dapp sogar einen Smart Contract enthalten, den eine andere Person geschrieben hat. +Eine dezentralisierte Anwendung (Dapp) ist eine Anwendung, die auf einem dezentralen Netzwerk aufbaut und einen [Smart Contract](/developers/docs/smart-contracts/) mit einer Frontend-Benutzeroberfläche kombiniert. Beachte, dass Smart Contracts in Ethereum zugänglich und transparent sind – wie offene APIs –, also kann deine Dapp sogar einen Smart Contract enthalten, den eine andere Person geschrieben hat. ## Voraussetzungen {#prerequisites} -Bevor du mehr über Dapps lernst, solltest du die [Blockchain-Basics](/developers/docs/intro-to-ethereum/) kennen und dir durchlesen, was das Ethereum-Netzwerk ist und wie es dezentralisiert wird. +Bevor du mehr über Dapps lernst, solltest du dich mit den [Grundlagen der Blockchain](/developers/docs/intro-to-ethereum/) vertraut machen und mehr über das Ethereum-Netzwerk und seine Dezentralisierung erfahren. ## Definition einer Dapp {#definition-of-a-dapp} Eine Dapp hat ihren Backend-Code auf einem dezentralisierten Peer-to-Peer-Netzwerk laufen. Vergleiche das mit einer App, bei der der Backend-Code auf dezentralisierten Servern läuft. -Eine Dapp kann Frontend-Code und eine Benutzeroberfläche in jeder beliebigen Sprache haben (genau wie eine App), die Aufrufe in ihrem Backend tätigen können. Darüber hinaus kann das Frontend auf dezentralisiertem Speicher wie [IPFS](https://ipfs.io/) gehostet werden. +Eine Dapp kann Frontend-Code und eine Benutzeroberfläche in jeder beliebigen Sprache haben (genau wie eine App), die Aufrufe in ihrem Backend tätigen können. Darüber hinaus kann das Frontend auf dezentralem Speicher wie [IPFS](https://ipfs.io/) gehostet werden. -- **Dezentralisiert** – Dapps arbeiten auf Ethereum, einer offenen, öffentlichen und dezentralen Plattform, auf der keine Person oder Gruppe die Kontrolle hat. +- **Dezentralisiert** – Dapps laufen auf Ethereum, einer offenen, öffentlichen, dezentralen Plattform, bei der keine einzelne Person oder Gruppe die Kontrolle hat. - **Deterministisch** – Dapps führen dieselbe Funktion aus, unabhängig von der Umgebung, in der sie ausgeführt werden. -- **Turing-Vollständigkeit** – Dapps können jede Aktion ausführen, wenn die erforderlichen Ressourcen vorhanden sind. -- **Isoliert** – Dapps werden in einer virtuellen Umgebung ausgeführt, die als Ethereum Virtual Machine bekannt ist, so dass ein Fehler im Smart Contract die normale Funktion des Blockchain-Netzwerks nicht beeinträchtigt. +- **Turing-vollständig** – Dapps können jede Aktion ausführen, sofern die erforderlichen Ressourcen vorhanden sind. +- **Isoliert** – Dapps werden in einer virtuellen Umgebung namens Ethereum Virtual Machine ausgeführt. Wenn der Smart Contract also einen Fehler aufweist, wird die normale Funktion des Blockchain-Netzwerks dadurch nicht beeinträchtigt. -### Smart Contracts {#on-smart-contracts} +### Über Smart Contracts {#on-smart-contracts} Um Dapps einzuführen, müssen wir auch Smart Contracts vorstellen – das Backend einer Dapp. Einen detaillierten Überblick findest du in unserem Abschnitt über [Smart Contracts](/developers/docs/smart-contracts/). @@ -29,64 +29,64 @@ Ein Smart Contract ist ein Code, der auf der Ethereum-Blockchain existiert und g ## Vorteile der Dapp-Entwicklung {#benefits-of-dapp-development} -- **Zero downtime** - Sobald der Smart Contract auf der Blockchain implementiert ist, kann das gesamte Netzwerk jederzeit Kunden bedienen, die mit dem Vertrag interagieren wollen. Böswillige Akteure können daher keine "Denial-of-Service"-Angriffe starten, die auf einzelne Dapps abzielen. -- **Privatsphäre** – Du musst keine echte Identität zur Verfügung stellen, um eine Dapp bereitzustellen oder mit einer zu interagieren. -- **Resistenz gegen Zensur** - keine einzige Entität im Netzwerk kann Benutzer daran hindern, Transaktionen zu übertragen, Dapps bereitzustellen oder Daten der Blockchain auszulesen. -- **Komplette Datenintegrität** – Daten, die auf der Blockchain gespeichert sind, sind unveränderbar und unbestreitbar, dank kryptographischer Primitivität. Böswillige Akteure können keine Transaktionen oder andere Daten, die bereits öffentlich gemacht wurden, fälschen. -- **Vertrauenslose Berechnung/überprüfbares Verhalten** – Smart Contracts können analysiert werden und garantieren, dass sie auf vorhersehbare Weise ausgeführt werden, ohne dass dafür das Vertrauen in eine zentrale Autorität vorausgesetzt wird. Das ist bei traditionellen Modellen nicht der Fall. Wenn wir zum Beispiel Online-Banking-Systeme nutzen, müssen wir darauf vertrauen, dass die Finanzinstitute unsere Finanzdaten nicht missbrauchen, keine Aufzeichnungen manipulieren und uns nicht hacken. +- **Keine Ausfallzeiten** – Sobald der Smart Contract in der Blockchain bereitgestellt ist, kann das Netzwerk als Ganzes immer Clients bedienen, die mit dem Vertrag interagieren möchten. Böswillige Akteure können daher keine "Denial-of-Service"-Angriffe starten, die auf einzelne Dapps abzielen. +- **Datenschutz** – Du musst keine echte Identität angeben, um eine Dapp bereitzustellen oder mit ihr zu interagieren. +- **Zensurresistenz** – Keine einzelne Entität im Netzwerk kann Nutzer daran hindern, Transaktionen zu übermitteln, Dapps bereitzustellen oder Daten aus der Blockchain zu lesen. +- **Vollständige Datenintegrität** – Auf der Blockchain gespeicherte Daten sind dank kryptografischer Primitive unveränderlich und unbestreitbar. Böswillige Akteure können keine Transaktionen oder andere Daten, die bereits öffentlich gemacht wurden, fälschen. +- **Vertrauenslose Berechnung/verifizierbares Verhalten** – Smart Contracts können analysiert werden und werden garantiert auf vorhersehbare Weise ausgeführt, ohne dass man einer zentralen Instanz vertrauen muss. Das ist bei traditionellen Modellen nicht der Fall. Wenn wir zum Beispiel Online-Banking-Systeme nutzen, müssen wir darauf vertrauen, dass die Finanzinstitute unsere Finanzdaten nicht missbrauchen, keine Aufzeichnungen manipulieren und uns nicht hacken. ## Nachteile der Dapp-Entwicklung {#drawbacks-of-dapp-development} -- **Wartung** – Dapps können schwieriger zu warten sein, weil der Code und die Daten, die auf der Blockchain veröffentlicht werden, schwerer zu ändern sind. Für Entwickler ist es schwierig ihre dApps (oder die zugrunde liegenden Daten, die von einer dApp gespeichert werden) zu aktualisieren, sobald sie bereitgestellt wurden, selbst wenn in einer alten Version Fehler oder Sicherheitsrisiken festgestellt werden. -- **Performance-Overhead** – Es gibt einen enormen Performance-Overhead und die Skalierung ist sehr schwierig. Um den Grad an Sicherheit, Integrität, Transparenz und Zuverlässigkeit zu erreichen, den Ethereum anstrebt, führt jeder Node jede Transaktion aus und speichert sie. Hinzu kommt, dass der Proof-of-Stake-Konsens ebenfalls Zeit benötigt. -- **Netzüberlastung** – Wenn eine Dapp zu viele Rechenressourcen verbraucht, gerät das gesamte Netzwerk ins Stocken. Derzeit kann das Netzwerk nur etwa 10 bis 15 Transaktionen pro Sekunde verarbeiten; wenn Transaktionen schneller eingehen, kann der Pool an unbestätigten Transaktionen schnell anschwellen. -- **Benutzererfahrung** – Es könnte schwieriger sein, eine benutzerfreundliche Erfahrung zu entwickeln, weil es für den durchschnittlichen Endbenutzer zu schwer sein könnte, die notwendigen Tools für eine wirklich sichere Interaktion mit der Blockchain einzurichten. -- **Zentralisierung** – Benutzer- und entwicklerfreundliche Lösungen, die auf der Basisschicht von Ethereum aufgebaut sind, könnten am Ende ohnehin wie zentralisierte Dienste aussehen. Solche Dienste können zum Beispiel Schlüssel oder andere sensible Informationen serverseitig speichern, ein Frontend über einen zentralen Server bedienen oder wichtige Geschäftslogik auf einem zentralen Server ausführen, bevor sie in die Blockchain geschrieben werden. Durch die Zentralisierung werden viele (wenn nicht alle) Vorteile der Blockchain gegenüber dem traditionellen Modell aufgehoben. +- **Wartung** – Dapps können schwieriger zu warten sein, da der auf der Blockchain veröffentlichte Code und die Daten schwerer zu ändern sind. Für Entwickler ist es schwierig ihre dApps (oder die zugrunde liegenden Daten, die von einer dApp gespeichert werden) zu aktualisieren, sobald sie bereitgestellt wurden, selbst wenn in einer alten Version Fehler oder Sicherheitsrisiken festgestellt werden. +- **Leistungs-Overhead** – Es gibt einen enormen Leistungs-Overhead und die Skalierung ist sehr schwierig. Um den Grad an Sicherheit, Integrität, Transparenz und Zuverlässigkeit zu erreichen, den Ethereum anstrebt, führt jeder Node jede Transaktion aus und speichert sie. Hinzu kommt, dass der Proof-of-Stake-Konsens ebenfalls Zeit benötigt. +- **Netzwerküberlastung** – Wenn eine Dapp zu viele Rechenressourcen verbraucht, wird das gesamte Netzwerk überlastet. Derzeit kann das Netzwerk nur etwa 10 bis 15 Transaktionen pro Sekunde verarbeiten; wenn Transaktionen schneller eingehen, kann der Pool an unbestätigten Transaktionen schnell anschwellen. +- **Benutzererlebnis** – Es kann schwieriger sein, benutzerfreundliche Erlebnisse zu schaffen, da der durchschnittliche Endbenutzer es möglicherweise als zu schwierig empfindet, den für eine wirklich sichere Interaktion mit der Blockchain erforderlichen Tool-Stack einzurichten. +- **Zentralisierung** – Benutzer- und entwicklerfreundliche Lösungen, die auf der Basisschicht von Ethereum aufbauen, sehen am Ende möglicherweise trotzdem wie zentralisierte Dienste aus. Solche Dienste können zum Beispiel Schlüssel oder andere sensible Informationen serverseitig speichern, ein Frontend über einen zentralen Server bedienen oder wichtige Geschäftslogik auf einem zentralen Server ausführen, bevor sie in die Blockchain geschrieben werden. Durch die Zentralisierung werden viele (wenn nicht alle) Vorteile der Blockchain gegenüber dem traditionellen Modell aufgehoben. -## Eher ein visueller Lerner? {#visual-learner} +## Eher der visuelle Lernende? {#visual-learner} -## Tools zum Erstellen von dApps {#dapp-tools} +## Tools zur Erstellung von Dapps {#dapp-tools} -**Scaffold-ETH _- Experimentiere schnell mit Solidity, indem du ein Frontend verwendest, das sich an deinen Smart Contract anpasst._** +**Scaffold-ETH _– Experimentiere schnell mit Solidity über ein Frontend, das sich an deinen Smart Contract anpasst._** - [GitHub](https://github.com/scaffold-eth/scaffold-eth-2) - [Beispiel-Dapp](https://punkwallet.io/) -**Eth App erstellen _– Erstelle Ethereum-gestützte Apps mit einem Befehl._** +**Create Eth App _– Erstelle Ethereum-basierte Apps mit einem einzigen Befehl._** - [GitHub](https://github.com/paulrberg/create-eth-app) -**One Click Dapp _– FOSS-Tool zur Erstellung von Dapp-Frontends aus einer [ABI](/glossary/#abi)._** +**One Click Dapp _– FOSS-Tool zur Generierung von Dapp-Frontends aus einem [ABI](/glossary/#abi)._** - [oneclickdapp.com](https://oneclickdapp.com) - [GitHub](https://github.com/oneclickdapp/oneclickdapp-v1) -**Etherflow _– FOSS-Tool für Ethereum-Entwickler, um ihre Nodes zu testen und RPC-Aufrufe vom Browser aus zu komponieren und zu debuggen._** +**Etherflow _– FOSS-Tool für Ethereum-Entwickler zum Testen ihrer Nodes und zum Erstellen und Debuggen von RPC-Aufrufen aus dem Browser heraus._** - [etherflow.quiknode.io](https://etherflow.quiknode.io/) - [GitHub](https://github.com/abunsen/etherflow) -**thirdweb _- SDKs in jeder Sprache, Smart Contracts, Tools und Infrastruktur für die Web3-Entwicklung._** +**thirdweb _– SDKs in jeder Sprache, Smart Contracts, Tools und Infrastruktur für die Web3-Entwicklung._** -- [Website](https://thirdweb.com/) +- [Homepage](https://thirdweb.com/) - [Dokumentation](https://portal.thirdweb.com/) - [GitHub](https://github.com/thirdweb-dev/) -**Crossmint _– Eine Web3-Entwicklungsplattform auf Unternehmensniveau, die das Bereitstellen von Smart Contracts sowie Kreditkarten- und Cross-Chain-Zahlungen ermöglicht und APIs zu Erstellung, Verteilung, Verkauf, Speicherung und Bearbeitung von NFTs nutzt._** +**Crossmint _– Web3-Entwicklungsplattform auf Unternehmensniveau, um Smart Contracts bereitzustellen, Kreditkarten- und kettenübergreifende Zahlungen zu ermöglichen und APIs zum Erstellen, Verteilen, Verkaufen, Speichern und Bearbeiten von NFTs zu verwenden._** - [crossmint.com](https://www.crossmint.com) - [Dokumentation](https://docs.crossmint.com) - [Discord](https://discord.com/invite/crossmint) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Entdecken Sie dApps](/apps) -- [Die Architektur einer Web 3.0-Anwendung](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) – _Preethi Kasireddy_ -- [Ein Leitfaden für dezentrale Anwendungen aus dem Jahr 2021](https://limechain.tech/blog/what-are-dapps-the-2021-guide/) – _LimeChain_ -- [Was sind dezentrale Apps?](https://www.gemini.com/cryptopedia/decentralized-applications-defi-dapps) – _Gemini_ -- [Beliebte Dapps](https://www.alchemy.com/dapps) – _Alchemy_ +- [Dapps entdecken](/apps) +- [Die Architektur einer Web 3.0-Anwendung](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ +- [Ein Leitfaden für dezentralisierte Anwendungen aus dem Jahr 2021](https://limechain.tech/blog/what-are-dapps-the-2021-guide/) - _LimeChain_ +- [Was sind dezentralisierte Apps?](https://www.gemini.com/cryptopedia/decentralized-applications-defi-dapps) - _Gemini_ +- [Beliebte Dapps](https://www.alchemy.com/dapps) - _Alchemy_ _Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/data-and-analytics/block-explorers/index.md b/public/content/translations/de/developers/docs/data-and-analytics/block-explorers/index.md index 1ee0c1dfd60..a3c1c947e08 100644 --- a/public/content/translations/de/developers/docs/data-and-analytics/block-explorers/index.md +++ b/public/content/translations/de/developers/docs/data-and-analytics/block-explorers/index.md @@ -1,11 +1,11 @@ --- -title: Block-Explorer +title: Block Explorer description: Eine Einführung in Block-Explorer, Ihr Portal in die Welt der Blockchain-Daten – dort können Sie Informationen über Transaktionen, Konten, Verträge und mehr abfragen lang: de sidebarDepth: 3 --- -Block-Explorer sind das Portal zu den Daten von Ethereum. Sie können sie nutzen, um Echtzeitdaten zu Blöcken, Transaktionen, Validatoren, Konten und anderen On-Chain-Aktivitäten einzusehen. +Block-Explorer sind das Portal zu den Daten von Ethereum. Sie können sie verwenden, um Echtzeitdaten zu Blöcken, Transaktionen, Validatoren, Konten und anderen On-Chain-Aktivitäten einzusehen. ## Voraussetzungen {#prerequisites} @@ -13,19 +13,17 @@ Sie sollten das Basiskonzept von Ethereum verstehen, damit Sie die Daten, die Si ## Dienste {#services} -- [Etherscan](https://etherscan.io/) -_Auch in Chinesisch, Koreanisch, Russisch und Japanisch verfügbar_ +- [Etherscan](https://etherscan.io/) – _Auch in Chinesisch, Koreanisch, Russisch und Japanisch verfügbar_ - [3xpl](https://3xpl.com/ethereum) - [Beaconcha.in](https://beaconcha.in/) -- [Blockchair](https://blockchair.com/ethereum) -_Auch in Spanisch, Französisch, Italienisch, Niederländisch, Portugiesisch, Russisch, Chinesisch und Farsi verfügbar_ +- [Blockchair](https://blockchair.com/ethereum) – _Auch in Spanisch, Französisch, Italienisch, Niederländisch, Portugiesisch, Russisch, Chinesisch und Farsi verfügbar_ - [Blockscout](https://eth.blockscout.com/) - [Chainlens](https://www.chainlens.com/) -- [DexGuru Block Explorer](https://ethereum.dex.guru/) +- [DexGuru Block-Explorer](https://ethereum.dex.guru/) - [Etherchain](https://www.etherchain.org/) -- [Ethernow](https://www.ethernow.xyz/) -- [Ethplorer](https://ethplorer.io/) -_Auch in Chinesisch, Spanisch, Französisch, Türkisch, Russisch, Koreanisch und Vietnamesisch verfügbar_ +- [Ethplorer](https://ethplorer.io/) – _Auch in Chinesisch, Spanisch, Französisch, Türkisch, Russisch, Koreanisch und Vietnamesisch verfügbar_ - [EthVM](https://www.ethvm.com/) - [OKLink](https://www.oklink.com/eth) -- [Rantom](https://rantom.app/) - [Ethseer](https://ethseer.io) ## Open-Source-Werkzeuge {#open-source-tools} @@ -55,7 +53,7 @@ Neue Blöcke werden alle 12 Sekunden zu Ethereum hinzugefügt (es sei denn, ein - Gaslimit - Die Gaslimits, die von den Transaktionen im Block gesetzt wurden - Grundgebühr pro Gas - Der Mindestmultiplikator, der erforderlich ist, damit eine Transaktion in einen Block aufgenommen werden kann - Verbrannte Gebühren - Wie viel ETH in einem Block verbrannt wird -- Extradaten - alle zusätzlichen Daten, die der Ersteller im Block eingefügt hat +- Extradaten – alle zusätzlichen Daten, die der Ersteller im Block eingefügt hat **Erweiterte Daten** @@ -63,7 +61,7 @@ Neue Blöcke werden alle 12 Sekunden zu Ethereum hinzugefügt (es sei denn, ein - Parent Hash - Der Hash des Blocks, der vor dem aktuellen Block kam - StateRoot - Der Wurzelhash des Merkle-Baums, der den gesamten Zustand des Systems speichert -### Ressourcen {#gas} +### Gas {#gas} Block-Explorer geben nicht nur Informationen zum Ressourcenverbrauch in Transkationen und Blöcken an, manche zeigen auch Informationen zu den aktuell im Netzwerk gültigen Ressourcenpreisen an. Das hilft Ihnen dabei, die Nutzung des Netzwerks zu verstehen, sichere Transaktionen auszuführen und nicht mehr Ressourcen zu beanspruchen als notwendig. Suchen Sie nach APIs, die Ihnen helfen können, diese Informationen in die Produktschnittstelle zu integrieren. Ressourcenspezifische Datenabdeckungen: @@ -95,7 +93,7 @@ Block-Explorer werden häufig eingesetzt, um den Status der Transaktionen abzuru - Gaslimit - Die maximale Anzahl von Gaseinheiten, die diese Transaktion verbrauchen kann - Verbrauchtes Gas - Die tatsächliche Menge an Gaseinheiten, die die Transaktion verbraucht hat - Gaspreis - Der festgelegte Preis pro Gaseinheit -- Nonce - Die Transaktionsnummer für die Absenderadresse`"from"` (denken Sie daran, dass diese bei 0 beginnt, so dass eine Nonce von `100` die 101ste Transaktion wäre, die von diesem Konto übermittelt wurde) +- Nonce – Die Transaktionsnummer für die `from`-Adresse (beachten Sie, dass diese bei 0 beginnt, sodass eine Nonce von `100` tatsächlich die 101. von diesem Konto übermittelte Transaktion wäre) - Eingabedaten - Alle zusätzlichen Informationen, die für die Transaktion erforderlich sind ### Konten {#accounts} @@ -110,18 +108,18 @@ Es gibt viele Daten, auf die Sie über ein Konto zugreifen können. Daher wird h - Token - Dem Konto zugeordnete Token und ihr Wert - Transaktionshistorie - Eine Liste aller Transaktionen, bei denen dieses Konto entweder der Absender oder der Empfänger war -**Intelligente Verträge** +**Smart Contracts** Smart-Contract-Konten verfügen über die gleichen Daten wie ein Benutzerkonto, doch einige Block-Explorer zeigen zusätzlich auch einige Codeinformationen an. Beispiele: - Vertragsersteller - Die Adresse, die den Vertrag im Mainnet bereitgestellt hat - Erstellungstransaktion - Die Transaktion, die die Bereitstellung im Mainnet beinhaltete - Quellcode - Der Solidity- oder Vyper-Code des Smart Contracts -- Vertrags-ABI - Die "Application Binary Interface" - die Aufrufe, die der Vertrag tätigt, und die empfangenen Daten +- Vertrags-ABI - Die „Application Binary Interface“ - die Aufrufe, die der Vertrag tätigt, und die empfangenen Daten - Vertragserstellungscode - Der kompilierte Bytecode des Smart Contracts – wird erstellt, wenn Sie einen in Solidity oder Vyper usw. geschriebenen Smart Contract kompilieren - Vertragsereignisse - Eine Historie der im Smart Contract aufgerufenen Methoden – im Grunde eine Möglichkeit zu sehen, wie der Vertrag verwendet wird und wie oft -### Token {#tokens} +### Tokens {#tokens} Token sind eine Art von Vertrag und enthalten ähnliche Daten wie ein Smart Contract. Doch dadurch, dass sie einen Wert haben und gehandelt werden können, weisen sie zusätzliche Datenpunkte auf: @@ -145,7 +143,7 @@ Einige Blockdaten geben Aufschluss über den Zustand von Ethereum im Allgemeinen - Gesamtes ETH-Angebot - Anzahl der im Umlauf befindlichen ETH - neue ETH werden bei der Erstellung jedes Blocks in Form von Block-Prämien geschaffen - Marktkapitalisierung - Berechnung des Preises\*Angebot -## Daten der Konsensebene {#consensus-layer-data} +## Daten der Konsensus-Ebene {#consensus-layer-data} ### Epoche {#epoch} @@ -174,7 +172,7 @@ Slots sind Möglichkeiten für die Blockerstellung. Folgende Daten sind zu Slots - Blockwurzel - Die Hash-Tree-Wurzel des Beacon-Blocks - Parent Root - Der Hash-Wert des vorhergehenden Blocks - Statuswurzel - Die Hash-Tree-Wurzel des BeaconState -- Signature +- Unterschrift - Randao Reveal - Graffiti - Ein Block-Proposer kann seinem Block-Vorschlag eine 32 Byte lange Nachricht beifügen - Ausführungsdaten @@ -212,9 +210,9 @@ Validatoren sind dafür verantwortlich, Blöcke vorzuschlagen und sie innerhalb - Attestierungen - Die Attestierungen, die der Validator vorgelegt hat - Einzahlungen - Die Absenderadresse, der Transaktionshash, die Blocknummer, der Zeitstempel, der Betrag und der Status der vom Validator getätigten Staking-Einzahlungen -### Beglaubigungen {#attestations} +### Attestierungen {#attestations} -Attestierungen sind "Ja"-Stimmen für die Aufnahme von Blöcken in die Chain. Ihre Daten beziehen sich auf eine Aufzeichnung der Attestierung und der bestätigenden Validatoren. +Attestierungen sind „Ja“-Stimmen für die Aufnahme von Blöcken in die Chain. Ihre Daten beziehen sich auf eine Aufzeichnung der Attestierung und der bestätigenden Validatoren. - Slot - Der Slot, in dem die Attestierung stattgefunden hat - Komitee-Index - Der Index des Komitees für den gegebenen Slot @@ -223,7 +221,7 @@ Attestierungen sind "Ja"-Stimmen für die Aufnahme von Blöcken in die Chain. Ih - Wurzel des Beacon-Blocks - Zeigt auf den Block, für den die Validatoren attestieren - Quelle - Zeigt auf die letzte geprüfte Epoche - Target - Zeigt auf die letzte Epochengrenze -- Signature +- Unterschrift ### Netzwerk {#network-1} @@ -236,22 +234,18 @@ Die Daten der obersten Ebene der Konsensebene umfassen Folgendes: - Staked ETH - Höhe der im Netzwerk gestakten ETH - Durchschnittliches Guthaben - Durchschnittliches ETH-Guthaben der Validatoren -## Block Explorer {#block-explorers} +## Block-Explorer {#block-explorers} -- [Etherscan](https://etherscan.io/) - ein Block-Explorer, mit dem Sie Daten für Ethereum Mainnet abrufen können -- [Etherscan Sepolia](https://sepolia.etherscan.io/) - ein Block-Explorer, mit dem Sie Daten für das Sepolia Testnet abrufen können -- [Etherscan Hoodi](https://hoodi.etherscan.io/) - ein Block-Explorer, mit dem Sie Daten für das Hoodi Testnet abrufen können +- [Etherscan](https://etherscan.io/) – ein Block-Explorer, den Sie verwenden können, um Daten für das Ethereum Mainnet und Testnet abzurufen - [3xpl](https://3xpl.com/ethereum) – ein werbefreier Open-Source-Ethereum-Explorer, der den Download seiner Datensätze erlaubt -- [Beaconcha.in](https://beaconcha.in/) - ein Open-Source-Block-Explorer für Ethereum Mainnet -- [Blockchair](https://blockchair.com/ethereum) – Der privateste Ethereum-Explorer. Auch zum Sortieren und Filtern von (Mempool-) Daten -- [Etherchain](https://www.etherchain.org/) - Ein Block-Explorer für das Ethereum Mainnet -- [Ethplorer](https://ethplorer.io/) - ein Block-Explorer mit Fokus auf Token für das Ethereum Mainnet -- [Rantom](https://rantom.app/) - Ein benutzerfreundlicher Open-Source-DeFi- und NFT-Transaktions-Viewer für detaillierte Einblicke -- [Ethernow](https://www.ethernow.xyz/) – ein Echtzeit-Transaktions-Explorer, der es ermöglicht, die Pre-Chain-Ebene des Ethereum-Mainnets einzusehen +- [Beaconcha.in](https://beaconcha.in/) – ein Open-Source-Block-Explorer für das Ethereum Mainnet und Testnet +- [Blockchair](https://blockchair.com/ethereum) – der privateste Ethereum-Explorer. Auch zum Sortieren und Filtern von (Mempool-) Daten +- [Etherchain](https://www.etherchain.org/) – ein Block-Explorer für das Ethereum Mainnet +- [Ethplorer](https://ethplorer.io/) – ein Block-Explorer mit Fokus auf Tokens für das Ethereum Mainnet und das Kovan-Testnet -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} diff --git a/public/content/translations/de/developers/docs/data-and-analytics/index.md b/public/content/translations/de/developers/docs/data-and-analytics/index.md index 90348c1a85e..fb8c57f8d9d 100644 --- a/public/content/translations/de/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/de/developers/docs/data-and-analytics/index.md @@ -1,55 +1,73 @@ --- title: Daten und Analysen -description: So bekommen Sie Analysen und Daten in der Chain für die Nutzung in Ihren dApps +description: Wie man On-Chain-Analysen und Daten für die Nutzung in deinen dApps erhält lang: de --- ## Einführung {#Introduction} -Da die Nutzung des Netzwerks weiter zunimmt, steigt damit die Menge an wertvollen Informationen in den On-Chain-Daten. Da das Datenvolumen rapide zunimmt, kann die Berechnung und Aggregation dieser Informationen zur Erstellung von Berichten oder zur Steuerung einer dApp ein Zeit- und arbeitsintensives Unterfangen werden. +Da die Nutzung des Netzwerks weiter wächst, wird sich eine zunehmende Menge wertvoller Informationen in den On-Chain-Daten befinden. Da das Datenvolumen rapide zunimmt, kann die Berechnung und Aggregation dieser Informationen zur Erstellung von Berichten oder zur Steuerung einer dApp ein Zeit- und arbeitsintensives Unterfangen werden. Wenn Sie dabei auf vorhandene Datenanbieter setzen, können Sie die Entwicklung beschleunigen, genauere Ergebnisse liefern und den laufenden Wartungsaufwand reduzieren. Das bietet Ihnen die Möglichkeit, dass Sie ein Team nur mit den wesentlichen Funktionen betrauen, das Sie mit Ihrem Projekt bieten möchten. ## Voraussetzungen {#prerequisites} -Sie sollten das Grundkonzept des [Block -Explorers](/developers/docs/data-and-analytics/block-explorers/) kennen, um dessen Einsatz im Kontext der Datenanalyse besser zu verstehen. Zusätzlich sollten Sie sich mit dem Konzept eines [Index](/glossary/#index) vertraut machen, um besser verstehen zu können, welche Vorteile sie für ein Systemdesign bedeuten. +Sie sollten das Grundkonzept von [Block-Explorern](/developers/docs/data-and-analytics/block-explorers/) verstehen, um deren Verwendung im Kontext der Datenanalyse besser zu verstehen. Machen Sie sich außerdem mit dem Konzept eines [Index](/glossary/#index) vertraut, um die Vorteile zu verstehen, die dieser für ein Systemdesign mit sich bringt. -In puncto architektonische Grundlagen sollten Sie mit den Begriffen [API](https://www.wikipedia.org/wiki/API) und [REST](https://www.wikipedia.org/wiki/Representational_state_transfer) vertraut sein, auch in der Theorie. +Im Hinblick auf die Grundlagen der Architektur ist es wichtig, zumindest in der Theorie zu verstehen, was eine [API](https://www.wikipedia.org/wiki/API) und [REST](https://www.wikipedia.org/wiki/Representational_state_transfer) sind. -## Block Explorer {#block-explorers} +## Block-Explorer {#block-explorers} -Viele [Block-Explorer](/developers/docs/data-and-analytics/block-explorers/) bieten [RESTful](https://www.wikipedia.org/wiki/Representational_state_transfer)-[API](https://www.wikipedia.org/wiki/API)-Gateways, die Entwicklern Einblick in Echtzeitdaten zu Blöcken, Transaktionen, Validatoren, Konten und anderen On-Chain-Aktivitäten ermöglichen. +Viele [Block-Explorer](/developers/docs/data-and-analytics/block-explorers/) bieten [RESTful](https://www.wikipedia.org/wiki/Representational_state_transfer) [API](https://www.wikipedia.org/wiki/API)-Gateways, die Entwicklern Einblicke in Echtzeitdaten zu Blöcken, Transaktionen, Validatoren, Konten und anderen On-Chain-Aktivitäten gewähren. -Entwickler können diese Daten dann verarbeiten und umwandeln, um ihren Nutzern einzigartige Einblicke und Interaktionen mit der [Blockchain](/glossary/#blockchain) zu ermöglichen. So liefert [Etherscan](https://etherscan.io) beispielsweise Ausführungs- und Konsensdaten für jeden 12s-Slot. +Entwickler können diese Daten dann verarbeiten und umwandeln, um ihren Benutzern einzigartige Einblicke und Interaktionen mit der [Blockchain](/glossary/#blockchain) zu ermöglichen. Zum Beispiel stellen [Etherscan](https://etherscan.io) und [Blockscout](https://eth.blockscout.com) Ausführungs- und Konsensdaten für jeden 12-Sekunden-Slot bereit. ## The Graph {#the-graph} -Das [Graph Network](https://thegraph.com/) ist ein dezentrales Indexierungsprotokoll zur Organisation von Blockchain-Daten. Anstatt für die Aggregation von On-Chain-Daten Datenspeicher, ob zentral oder außerhalb der Chain, zu erstellen und zu verwalten, können Entwickler mit The Graph serverlose Anwendungen erstellen, die vollständig auf einer öffentlichen Infrastruktur laufen. +[The Graph](https://thegraph.com/) ist ein Indexierungsprotokoll, das eine einfache Möglichkeit bietet, Blockchain-Daten über offene APIs, sogenannte Subgraphen, abzufragen. -Mit [GraphQL](https://graphql.org/) können Entwickler jede der kuratierten offenen APIs, die sogenannten Sub-Graphen, abfragen, um die notwendigen Informationen zu erhalten, die sie für ihre dApp benötigen. Durch die Abfrage dieser indizierten Sub-Graphen erhalten Berichte und Anwendungen nicht nur Leistungs- und Skalierbarkeitsvorteile, sondern auch die integrierte Genauigkeit, die durch den Netzwerkkonsens bereitgestellt wird. Sobald dem Netzwerk neue Verbesserungen und/oder Sub-Graphen hinzugefügt werden, können Ihre Projekte schnell iterieren, um von diesen Verbesserungen zu profitieren. +Mit The Graph können Entwickler folgende Vorteile nutzen: -## Client-Diversität +- Dezentrale Indizierung: Ermöglicht die Indizierung von Blockchain-Daten durch mehrere + indizierter, wodurch einzelne Fehlerquellen vermieden werden. +- Grafik-Abfragen: Bietet eine leistungsstarke Grafik-Schnittstelle für die Abfrage indizierter Daten, wodurch das Abrufen von Daten extrem einfach wird. +- Anpassung: Definieren Sie Ihre eigene Logik für die Transformation und Speicherung von Blockchain-Daten und verwenden Sie Subgraphen wieder, die von anderen Entwicklern im The Graph Network veröffentlicht wurden. -Die [Client-Vielfalt](/developers/docs/nodes-and-clients/client-diversity/) ist wichtig für die allgemeine Sicherheit des Ethereum-Netzwerks, da sie die Widerstandsfähigkeit gegen Fehler und Schwachstellen gewährleistet. Es gibt nun mehrere Dashboards zur Client-Vielfalt, darunter [clientdiversity.org](https://clientdiversity.org/), [rated.network](https://www.rated.network), [supermajority.info](https://supermajority.info//) und [Ethernodes](https://ethernodes.org/). +Folgen Sie dieser [Schnellstartanleitung](https://thegraph.com/docs/en/quick-start/), um innerhalb von 5 Minuten einen Subgraphen zu erstellen, bereitzustellen und abzufragen. + +## Client-Diversität {#client-diversity} + +[Client-Diversität](/developers/docs/nodes-and-clients/client-diversity/) ist wichtig für die allgemeine Gesundheit des Ethereum-Netzwerks, da sie Widerstandsfähigkeit gegen Bugs und Exploits bietet. Es gibt mittlerweile mehrere Dashboards zur Client-Diversität, darunter [clientdiversity.org](https://clientdiversity.org/), [rated.network](https://www.rated.network), [supermajority.info](https://supermajority.info//) und [Ethernodes](https://ethernodes.org/). ## Dune Analytics {#dune-analytics} -[Dune Analytics](https://dune.com/) verarbeitet Blockchain-Daten in relationalen Datenbanktabellen (DuneSQL) vor, ermöglicht Benutzern die Abfrage von Blockchain-Daten mit SQL und die Erstellung von Dashboards auf der Grundlage der Abfrageergebnisse. Die On-Chain-Daten sind in 4 Rohtabellen organisiert: `Blöcke`, `Transaktionen`, (Event) `Logs` und (Call) `Traces`. Beliebte Verträge und Protokolle liegen entschlüsselt vor und jedes hat seinen eigenen Satz von Event- und Call-Tabellen. Diese Event- und Call-Tabellen werden weiterverarbeitet und in Abstraktionstabellen nach der Art der Protokolle organisiert, z. B. Dex, Lending, Stablecoins usw. +[Dune Analytics](https://dune.com/) verarbeitet Blockchain-Daten vor und wandelt sie in relationale Datenbanktabellen (DuneSQL) um, was es Benutzern ermöglicht, Blockchain-Daten mit SQL abzufragen und auf Abfrageergebnissen basierende Dashboards zu erstellen. On-Chain-Daten sind in 4 Rohdatentabellen organisiert: `blocks`, `transactions`, (Ereignis-) `logs` und (Aufruf-) `traces`. Beliebte Verträge und Protokolle liegen entschlüsselt vor und jedes hat seinen eigenen Satz von Event- und Call-Tabellen. Diese Event- und Call-Tabellen werden weiterverarbeitet und in Abstraktionstabellen nach der Art der Protokolle organisiert, z. B. Dex, Lending, Stablecoins usw. + +## SQD {#sqd} -## SubQuery Network {#subquery-network} +[SQD](https://sqd.dev/) ist eine dezentrale, hyperskalierbare Datenplattform, die für den effizienten, genehmigungsfreien Zugriff auf große Datenmengen optimiert ist. Derzeit werden historische In-Chai-Daten bereitgestellt, darunter Ereignisprotokolle, Transaktionsbelege, Traces und Statusunterschiede pro Transaktion. SQD bietet ein leistungsstarkes Toolkit zum Erstellen benutzerdefinierter Pipelines für die Datenextraktion und -verarbeitung, mit denen eine Indizierungsgeschwindigkeit von bis zu 150.000 Blöcken pro Sekunde erreicht werden kann. + +Besuchen Sie für den Einstieg die [Dokumentation](https://docs.sqd.dev/) oder sehen Sie sich [EVM-Beispiele](https://github.com/subsquid-labs/squid-evm-examples) dafür an, was Sie mit SQD erstellen können. + +## SubQuery-Netzwerk {#subquery-network} [SubQuery](https://subquery.network/) ist ein führender Datenindexierer, der Entwicklern schnelle, zuverlässige, dezentrale und maßgeschneiderte APIs für ihre web3-Projekte bietet. SubQuery befähigt Entwickler aus über 165 Ökosystemen (einschließlich Ethereum) mit reichhaltigen indizierten Daten, um intuitive und immersive Erlebnisse für ihre Benutzer zu schaffen. Das SubQuery Network versorgt Ihre unaufhaltsamen Apps mit einem widerstandsfähigen und dezentralen Infrastrukturnetzwerk. Nutzen Sie das Blockchain-Entwickler-Toolkit von SubQuery, um die Web3-Anwendungen der Zukunft zu bauen, ohne dabei Zeit mit dem Aufbau eines benutzerdefinierten Backends für die Datenverarbeitung verbringen zu müssen. -Um loszulegen, sehen Sie sich die [Ethereum-Schnellstartanleitung](https://academy.subquery.network/quickstart/quickstart_chains/ethereum-gravatar.html) an, um in wenigen Minuten Daten der Ethereum-Blockchain in einer lokalen Docker-Umgebung zu indizieren und vor der Live-Schaltung auf dem [verwalteten Dienst von SubQuery](https://managedservice.subquery.network/) oder dem [dezentralen Netzwerk von SubQuery](https://app.subquery.network/dashboard) zu testen. +Besuchen Sie zunächst die [Ethereum-Schnellstartanleitung](https://academy.subquery.network/quickstart/quickstart_chains/ethereum-gravatar.html), um in wenigen Minuten mit der Indizierung von Ethereum-Blockchain-Daten in einer lokalen Docker-Umgebung zu Testzwecken zu beginnen, bevor Sie live auf den [Managed Service von SubQuery](https://managedservice.subquery.network/) oder in das [dezentrale Netzwerk von SubQuery](https://app.subquery.network/dashboard) wechseln. + +## EVM-Abfragesprache {#evm-query-language} -## Etherenow – Mempool-Datenprogramm {#ethernow} -[Blocknative](https://www.blocknative.com/) bietet einen offenen Zugang zu seinem historischen [Mempool-Datenarchiv](https://www.ethernow.xyz/mempool-data-archive) für Ethereum. Dies ermöglicht Forschern und Projekten im Gemeinwohl, die Pre-Chain-Ebene des Ethereum-Mainnets zu erkunden. Der Datensatz wird aktiv gepflegt und stellt das umfassendste historische Protokoll von Mempool-Transaktionsereignissen innerhalb des Ethereum-Ökosystems dar. Erfahren Sie mehr bei [Ethernow](https://www.ethernow.xyz/). +Die EVM-Abfragesprache (EQL) ist eine SQL-ähnliche Sprache, die entwickelt wurde, um EVM-Blockchains (Ethereum Virtual Machine) abzufragen. Das ultimative Ziel von EQL ist es, komplexe relationale Abfragen für die ersten Klassen der EVM-Blockchain (Blöcke, Konten und Transaktionen) zu unterstützen, während Entwicklern und Forschern eine benutzerfreundliche Syntax für den täglichen Gebrauch zur Verfügung gestellt wird. Mit EQL können Entwickler Blockchain-Daten mit einer vertrauten, SQL-ähnlichen Syntax abrufen und so den Bedarf an komplexem Boilerplate-Code eliminieren. EQL unterstützt standardmäßige Blockchain-Datenanfragen (z. B. das Abrufen des Nonces und Kontostands eines Ethereum-Kontos oder das Abrufen der aktuellen Blockgröße und des Zeitstempels) und erweitert kontinuierlich die Unterstützung für komplexere Anfragen und Funktionen. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Graph Network-Übersicht](https://thegraph.com/docs/en/about/) -- [Graph-Abfrageplatz](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) -- [API-Code-Beispiele auf EtherScan](https://etherscan.io/apis#contracts) -- [Beaconcha.in Beacon Chain Explorer](https://beaconcha.in) -- [Dune Basics](https://docs.dune.com/#dune-basics) -- [Ethereum-Schnellstartanleitung – SubQuery](https://academy.subquery.network/indexer/quickstart/quickstart_chains/ethereum-gravatar.html) +- [Exploring Crypto Data I: Data Flow Architectures](https://web.archive.org/web/20250125012042/https://research.2077.xyz/exploring-crypto-data-1-data-flow-architectures) +- [Überblick über das Graph-Netzwerk](https://thegraph.com/docs/en/about/) +- [Graph Query Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) +- [API-Codebeispiele auf EtherScan](https://etherscan.io/apis#contracts) +- [API-Dokumentation auf Blockscout](https://docs.blockscout.com/devs/apis) +- [Beaconcha.in Beacon-Chain-Explorer](https://beaconcha.in) +- [Dune-Grundlagen](https://docs.dune.com/#dune-basics) +- [SubQuery Ethereum-Schnellstartanleitung](https://academy.subquery.network/indexer/quickstart/quickstart_chains/ethereum-gravatar.html) +- [Überblick über das SQD-Netzwerk](https://docs.sqd.dev/) +- [EVM-Abfragesprache](https://eql.sh/blog/alpha-release-notes) diff --git a/public/content/translations/de/developers/docs/data-availability/blockchain-data-storage-strategies/index.md b/public/content/translations/de/developers/docs/data-availability/blockchain-data-storage-strategies/index.md new file mode 100644 index 00000000000..8e36ef2ec27 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-availability/blockchain-data-storage-strategies/index.md @@ -0,0 +1,118 @@ +--- +title: Blockchain-Datenspeicherungsstrategien +description: Es gibt verschiedene Möglichkeiten, Daten mithilfe der Blockchain zu speichern. Dieser Artikel wird die verschiedenen Strategien, ihre Kosten und Kompromisse sowie die Anforderungen für eine sichere Nutzung vergleichen. +lang: de +--- + +Es gibt mehrere Möglichkeiten, Informationen entweder direkt auf der Blockchain oder auf eine durch die Blockchain gesicherte Weise zu speichern: + +- EIP-4844 Blobs +- Aufrufdaten +- Offchain mit L1-Mechanismen +- Vertragscode ("Contract code") +- Ereignisse +- EVM Speicher + +Die Wahl der zu verwendenden Methode basiert auf mehreren Kriterien: + +- Die Quelle der Informationen. Informationen in Calldata können nicht direkt von der Blockchain selbst stammen. +- Das Ziel der Information. Calldata sind nur in der Transaktion verfügbar, die sie enthalten. Ereignisse sind onchain überhaupt nicht zugänglich. +- Wie viel Aufwand ist akzeptabel? Computer, die einen vollwertigen Node betreiben, können mehr Verarbeitung leisten als ein Light-Client in einer Anwendung, die in einem Browser läuft. +- Ist es notwendig, den einfachen Zugriff auf die Informationen von jedem Node zu ermöglichen? +- Die Sicherheitsanforderungen. + +## Die Sicherheitsanforderungen {#security-requirements} + +Im Allgemeinen besteht die Informationssicherheit aus drei Attributen: + +- _Vertraulichkeit_, unbefugte Entitäten dürfen die Informationen nicht lesen. Dies ist in vielen Fällen wichtig, aber hier nicht. _Es gibt keine Geheimnisse in der Blockchain_. Blockchains funktionieren, weil jeder die Zustandsübergänge überprüfen kann. Es ist daher unmöglich, sie zur direkten Speicherung von Geheimnissen zu verwenden. Es gibt Möglichkeiten, vertrauliche Informationen auf der Blockchain zu speichern, aber alle beruhen auf einer Off-Chain-Komponente, um zumindest einen Schlüssel zu speichern. + +- _Integrität_, die Information ist korrekt, sie kann nicht von unbefugten Entitäten oder auf unbefugte Weise verändert werden (z. B. durch Übertragung von [ERC-20-Tokens](https://eips.ethereum.org/EIPS/eip-20#events) ohne ein `Transfer`-Event). Auf der Blockchain überprüft jeder Node jede Zustandsänderung, was die Integrität sicherstellt. + +- _Verfügbarkeit_, die Informationen stehen jeder autorisierten Entität zur Verfügung. Auf der Blockchain wird dies in der Regel dadurch erreicht, dass die Informationen auf jedem [Full Node](https://ethereum.org/developers/docs/nodes-and-clients#full-node) verfügbar sind. + +Die verschiedenen hier vorgestellten Lösungen haben alle eine ausgezeichnete Integrität, da Hashes auf L1 gepostet werden. Sie haben jedoch unterschiedliche Verfügbarkeitsgarantien. + +## Voraussetzungen {#prerequisites} + +Sie sollten ein gutes Verständnis der [Blockchain-Grundlagen](/developers/docs/intro-to-ethereum/) haben. Diese Seite setzt auch voraus, dass der Leser mit [Blöcken](/developers/docs/blocks/), [Transaktionen](/developers/docs/transactions/) und anderen relevanten Themen vertraut ist. + +## EIP-4844-Blobs {#eip-4844-blobs} + +Beginnend mit dem [Dencun Hard Fork](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/beacon-chain.md) enthält die Ethereum-Blockchain [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), das Ethereum um Daten-Blobs mit einer begrenzten Lebensdauer (anfänglich etwa [18 Tage](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/p2p-interface.md#configuration)) erweitert. Der Preis für diese Blobs wird getrennt vom [Ausführungsgas](/developers/docs/gas) festgelegt, obwohl ein ähnlicher Mechanismus verwendet wird. Sie sind eine günstige Möglichkeit, temporäre Daten zu posten. + +Der Hauptanwendungsfall für EIP-4844-Blobs ist die Veröffentlichung von Transaktionen durch Rollups. [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups) müssen die Transaktionen auf ihren Blockchains veröffentlichen. Diese Transaktionen müssen während der [Challenge Period](https://docs.optimism.io/connect/resources/glossary#challenge-period) für jeden verfügbar sein, damit [Validatoren](https://docs.optimism.io/connect/resources/glossary#validator) den Fehler beheben können, wenn der [Sequencer](https://docs.optimism.io/connect/resources/glossary#sequencer) des Rollups einen falschen State Root postet. + +Sobald die Challenge Period jedoch abgelaufen ist und der State Root finalisiert wurde, besteht der verbleibende Zweck der Kenntnis dieser Transaktionen darin, den aktuellen Zustand der Chain zu replizieren. Dieser Zustand ist auch von Chain-Nodes verfügbar, mit weitaus weniger erforderlicher Verarbeitung. Transaktionsinformationen sollten also weiterhin an einigen Stellen, wie z. B. in [Block-Explorern](/developers/docs/data-and-analytics/block-explorers), aufbewahrt werden, aber es ist nicht nötig, für das Maß an Zensurresistenz zu bezahlen, das Ethereum bietet. + +[Zero-Knowledge-Rollups](/developers/docs/scaling/zk-rollups/#data-availability) posten ebenfalls ihre Transaktionsdaten, um anderen Nodes zu ermöglichen, den bestehenden Zustand zu replizieren und Validitätsbeweise zu verifizieren, aber auch das ist eine kurzfristige Anforderung. + +Zum Zeitpunkt des Schreibens kostet das Posten auf EIP-4844 ein Wei (10-18 ETH) pro Byte, was im Vergleich zu [den 21.000 Ausführungsgas, die jede Transaktion, einschließlich einer, die Blobs postet, kostet](https://eth.blockscout.com/tx/0xf6cfaf0431c73dd1d96369a5e6707d64f463ccf477a4131265397f1d81466929?tab=index), vernachlässigbar ist. Den aktuellen EIP-4844-Preis können Sie auf [blobscan.com](https://blobscan.com/blocks) einsehen. + +Hier sind die Adressen, um die von einigen bekannten Rollups geposteten Blobs zu sehen. + +| Rollup | Mailbox-Adresse | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- | +| [Optimism](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://blobscan.com/address/0xFF00000000000000000000000000000000000010) | +| [Arbitrum](https://arbitrum.io/) | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://blobscan.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) | +| [Base](https://base.org/) | [`0xFF00000000000000000000000000000000008453`](https://blobscan.com/address/0xFF00000000000000000000000000000000008453) | + +## Calldata {#calldata} + +Calldata bezieht sich auf die Bytes, die als Teil der Transaktion gesendet werden. Sie werden als Teil der dauerhaften Aufzeichnung der Blockchain in dem Block gespeichert, der diese Transaktion enthält. + +Dies ist die günstigste Methode, um Daten dauerhaft in der Blockchain abzulegen. Die Kosten pro Byte betragen entweder 4 Ausführungsgas (wenn das Byte null ist) oder 16 Gas (jeder andere Wert). Wenn die Daten komprimiert sind, was übliche Praxis ist, dann ist jeder Byte-Wert gleich wahrscheinlich, sodass die durchschnittlichen Kosten ungefähr 15,95 Gas pro Byte betragen. + +Zum Zeitpunkt des Schreibens liegen die Preise bei 12 Gwei/Gas und 2300 $/ETH, was bedeutet, dass die Kosten etwa 45 Cent pro Kilobyte betragen. Da dies vor EIP-4844 die günstigste Methode war, ist dies die Methode, die Rollups zur Speicherung von Transaktionsinformationen verwendeten, die für [Fault Challenges](https://docs.optimism.io/stack/protocol/overview#fault-proofs) verfügbar sein müssen, aber nicht direkt onchain zugänglich sein müssen. + +Hier sind die Adressen, um die von einigen bekannten Rollups geposteten Transaktionen zu sehen. + +| Rollup | Mailbox-Adresse | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | +| [Optimism](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000000010) | +| [Arbitrum](https://arbitrum.io/) | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://eth.blockscout.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) | +| [Base](https://base.org/) | [`0xFF00000000000000000000000000000000008453`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000008453) | + +## Off-Chain mit L1-Mechanismen {#offchain-with-l1-mechs} + +Abhängig von Ihren Sicherheitsabwägungen kann es akzeptabel sein, die Informationen an anderer Stelle zu platzieren und einen Mechanismus zu verwenden, der sicherstellt, dass die Daten bei Bedarf verfügbar sind. Damit dies funktioniert, gibt es zwei Anforderungen: + +1. Posten Sie einen [Hash](https://en.wikipedia.org/wiki/Cryptographic_hash_function) der Daten auf der Blockchain, der als _Input Commitment_ bezeichnet wird. Dies kann ein einzelnes 32-Byte-Wort sein, also ist es nicht teuer. Solange das Input Commitment verfügbar ist, ist die Integrität gewährleistet, da es nicht machbar ist, andere Daten zu finden, die zum gleichen Wert hashen würden. Wenn also falsche Daten bereitgestellt werden, kann dies erkannt werden. + +2. Sorgen Sie für einen Mechanismus, der die Verfügbarkeit sicherstellt. Zum Beispiel kann in [Redstone](https://redstone.xyz/docs/what-is-redstone) jeder Node eine Availability Challenge einreichen. Wenn der Sequencer nicht bis zur Frist onchain antwortet, wird das Input Commitment verworfen, sodass die Information als niemals gepostet gilt. + +Dies ist für einen Optimistic Rollup akzeptabel, da wir uns bereits darauf verlassen, dass es mindestens einen ehrlichen Verifizierer für den State Root gibt. Ein solcher ehrlicher Verifizierer wird auch sicherstellen, dass er die Daten zur Verarbeitung von Blöcken hat, und eine Availability Challenge ausstellen, wenn die Informationen nicht off-chain verfügbar sind. Diese Art von Optimistic Rollup wird [Plasma](/developers/docs/scaling/plasma/) genannt. + +## Vertragscode {#contract-code} + +Informationen, die nur einmal geschrieben werden müssen, niemals überschrieben werden und onchain verfügbar sein müssen, können als Vertragscode gespeichert werden. Das bedeutet, dass wir einen "Smart Contract" mit den Daten erstellen und dann [`EXTCODECOPY`](https://www.evm.codes/#3c?fork=shanghai) verwenden, um die Informationen zu lesen. Der Vorteil ist, dass das Kopieren von Code relativ günstig ist. + +Abgesehen von den Kosten für die Speichererweiterung kostet `EXTCODECOPY` 2600 Gas für den ersten Zugriff auf einen Vertrag (wenn er „kalt“ ist) und 100 Gas für nachfolgende Kopien aus demselben Vertrag plus 3 Gas pro 32-Byte-Wort. Im Vergleich zu Calldata, die 15,95 pro Byte kosten, ist dies ab etwa 200 Bytes günstiger. Basierend auf [der Formel für Speichererweiterungskosten](https://www.evm.codes/about#memoryexpansion), sind die Speichererweiterungskosten geringer als die Kosten für das Hinzufügen von Calldata, solange Sie nicht mehr als 4 MB Speicher benötigen. + +Natürlich sind das nur die Kosten, um die Daten zu _lesen_. Die Erstellung des Vertrags kostet ungefähr 32.000 Gas + 200 Gas/Byte. Diese Methode ist nur dann wirtschaftlich, wenn dieselben Informationen in verschiedenen Transaktionen viele Male gelesen werden müssen. + +Vertragscode kann unsinnig sein, solange er nicht mit `0xEF` beginnt. Verträge, die mit `0xEF` beginnen, werden als [Ethereum Object Format](https://notes.ethereum.org/@ipsilon/evm-object-format-overview) interpretiert, das viel strengere Anforderungen hat. + +## Ereignisse {#events} + +[Ereignisse](https://docs.alchemy.com/docs/solidity-events) werden von Smart Contracts ausgegeben und von Off-Chain-Software gelesen. +Ihr Vorteil ist, dass Off-Chain-Code auf Ereignisse lauschen kann. Die Kosten betragen [Gas](https://www.evm.codes/#a0?fork=cancun), 375 plus 8 Gas pro Byte an Daten. Bei 12 Gwei/Gas und 2300 $/ETH entspricht dies einem Cent plus 22 Cent pro Kilobyte. + +## Speicher {#storage} + +Smart Contracts haben Zugriff auf [persistenten Speicher](https://docs.alchemy.com/docs/smart-contract-storage-layout#what-is-storage-memory). Er ist jedoch sehr teuer. Das Schreiben eines 32-Byte-Wortes in einen zuvor leeren Speicher-Slot kann [22.100 Gas kosten](https://www.evm.codes/#55?fork=cancun). Bei 12 Gwei/Gas und 2300 $/ETH sind das etwa 61 Cent pro Schreibvorgang oder 19,5 $ pro Kilobyte. + +Dies ist die teuerste Form von Speicher in Ethereum. + +## Zusammenfassung {#summary} + +Diese Tabelle fasst die verschiedenen Optionen, ihre Vor- und Nachteile zusammen. + +| Speichertyp | Datenquelle | Verfügbarkeitsgarantie | Onchain-Verfügbarkeit | Zusätzliche Einschränkungen | +| --------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| EIP-4844 Blobs | Off-Chain | Ethereum-Garantie für [~18 Tage](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/p2p-interface.md#configuration) | Nur Hash ist verfügbar | | +| Aufrufdaten | Off-Chain | Ethereum-Garantie für immer (Teil der Blockchain) | Nur verfügbar, wenn in einen Vertrag geschrieben, und bei dieser Transaktion | | +| Offchain mit L1-Mechanismen | Off-Chain | "One honest verifier"-Garantie während der Challenge Period | Nur Hash | Garantiert durch den Challenge-Mechanismus, nur während der Challenge Period | +| Vertragscode | Onchain oder Off-Chain | Ethereum-Garantie für immer (Teil der Blockchain) | Ja | An eine "zufällige" Adresse geschrieben, darf nicht mit `0xEF` beginnen | +| Ereignisse | Onchain | Ethereum-Garantie für immer (Teil der Blockchain) | Nein | | +| Speicherort | Onchain | Ethereum-Garantie für immer (Teil der Blockchain und des gegenwärtigen Zustands, bis er überschrieben wird) | Ja | | diff --git a/public/content/translations/de/developers/docs/data-availability/index.md b/public/content/translations/de/developers/docs/data-availability/index.md new file mode 100644 index 00000000000..ca7d4cb701e --- /dev/null +++ b/public/content/translations/de/developers/docs/data-availability/index.md @@ -0,0 +1,84 @@ +--- +title: Datenverfügbarkeit +description: Ein Überblick über Probleme und Lösungen im Zusammenhang mit der Datenverfügbarkeit bei Ethereum +lang: de +--- + +"Don't trust, verify" ist eine gängige Maxime in Ethereum. Die Idee dahinter ist, dass Ihr Knoten unabhängig überprüfen kann, ob die Informationen, die er erhält, korrekt sind, indem er alle Transaktionen in den Blöcken, die er von Peers erhält, ausführt. Das stellt sicher, dass die vorgeschlagenen Änderungen genau mit denen übereinstimmen, die der Knoten unabhängig berechnet hat. Das bedeutet, dass die Knoten nicht darauf vertrauen müssen, dass die Absender des Blocks ehrlich sind. Dies ist nicht möglich, wenn Daten fehlen. + +**Datenverfügbarkeit** bezieht sich auf das Vertrauen, das ein Benutzer haben kann, dass die zur Verifizierung eines Blocks erforderlichen Daten wirklich für alle Netzwerkteilnehmer verfügbar sind. Für Full Nodes auf Ethereum Layer 1 ist dies relativ einfach; der Full Node lädt eine Kopie aller Daten in jedem Block herunter – die Daten _müssen_ verfügbar sein, damit das Herunterladen möglich ist. Ein Block mit fehlenden Daten wird verworfen, anstatt der Blockchain hinzugefügt zu werden. Dies ist „Offchain Datenverfügbarkeit“ und ein Merkmal monolithischer Blockchains. Full Nodes können nicht dazu verleitet werden, ungültige Transaktionen zu akzeptieren, da sie jede Transaktion für sich selbst herunterladen und ausführen. Bei modularen Blockchains, Layer-2-Rollups und Light-Clients ist die Datenverfügbarkeits-Landschaft jedoch komplexer und erfordert ausgefeiltere Überprüfungsverfahren. + +## Voraussetzungen {#prerequisites} + +Sie sollten ein gutes Verständnis der [Blockchain-Grundlagen](/developers/docs/intro-to-ethereum/) haben, insbesondere der [Konsensmechanismen](/developers/docs/consensus-mechanisms/). Auf dieser Seite wird außerdem davon ausgegangen, dass die Leserschaft mit [Blöcken](/developers/docs/blocks/), [Transaktionen](/developers/docs/transactions/), [Nodes](/developers/docs/nodes-and-clients/), [Skalierungslösungen](/developers/docs/scaling/) und anderen relevanten Themen vertraut ist. + +## Das Problem der Datenverfügbarkeit {#the-data-availability-problem} + +Das Problem der Datenverfügbarkeit besteht darin, dass dem gesamten Netzwerk nachgewiesen werden muss, dass die zusammengefasste Form einiger Transaktionsdaten, die der Blockchain hinzugefügt werden, tatsächlich einen Satz gültiger Transaktionen darstellt, ohne dass dabei alle Knoten alle Daten herunterladen müssen. Die vollständigen Transaktionsdaten sind für die unabhängige Überprüfung von Blöcken erforderlich. Die Anforderung, dass alle Knoten alle Transaktionsdaten herunterladen müssen, stellt jedoch ein Hindernis für die Skalierung dar. Lösungen für das Problem der Datenverfügbarkeit zielen darauf ab, ausreichende Sicherheiten dafür zu bieten, dass den Netzwerkteilnehmern, die die Daten nicht selbst herunterladen und speichern, die vollständigen Transaktionsdaten zur Überprüfung zur Verfügung gestellt wurden. + +[Light Nodes](/developers/docs/nodes-and-clients/light-clients) und [Layer-2-Rollups](/developers/docs/scaling) sind wichtige Beispiele für Netzwerkteilnehmer, die starke Garantien zur Datenverfügbarkeit benötigen, aber Transaktionsdaten nicht selbst herunterladen und verarbeiten können. Ein nicht durchgeführter Vorgang zum Herunterladen von Transaktionsdaten ist das, was Light Nodes leichtgewichtig macht und Rollups als echte Lösung für Skalierungsprobleme erscheinen lässt. + +Die Datenverfügbarkeit ist auch ein kritisches Anliegen für zukünftige ["zustandslose"](/roadmap/statelessness) Ethereum-Clients, die keine Zustandsdaten herunterladen und speichern müssen, um Blöcke zu verifizieren. Die zustandslosen Clients müssen sich dennoch sicher sein, dass die Daten _irgendwo_ verfügbar sind und korrekt verarbeitet wurden. + +## Lösungen für die Datenverfügbarkeit {#data-availability-solutions} + +### Datenverfügbarkeits-Sampling (DAS) {#data-availability-sampling} + +Das Data Availability Sampling (DAS) ist eine Überprüfungsmethode des Netzwerkes für die Datenverfügbarkeit, ohne dass die Arbeitsbelastung für jeden Knoten übermäßig hoch ist. Jeder Knoten (einschließlich der Knoten, die nicht für das Staking benannt wurden) ermöglicht das zufällige Herunterladen eines Teils des Datensatzes. Das erfolgreiche Herunterladen der Beispiele bestätigt mit hoher Sicherheit, dass alle Daten verfügbar sind. Dies beruht auf Erasure Coding (Fehlerkorrekturverfahren), das einen gegebenen Datensatz um redundante Informationen erweitert (dies geschieht, indem eine als _Polynom_ bekannte Funktion über die Daten angepasst und dieses Polynom an zusätzlichen Punkten ausgewertet wird). Dadurch können die ursprünglichen Daten bei Bedarf auf einem Datensatz, wo mehrere Kopien erfasst werden, erneut abgedeckt werden. Eine Konsequenz dieser Datenerstellung ist, dass, wenn _irgendwelche_ der ursprünglichen Daten nicht verfügbar sind, die _Hälfte_ der erweiterten Daten fehlen wird! Die Menge der von jedem Node heruntergeladenen Datenstichproben kann so angepasst werden, dass es _extrem_ wahrscheinlich ist, dass mindestens eines der von jedem Client abgetasteten Datenfragmente fehlt, _falls_ weniger als die Hälfte der Daten wirklich verfügbar ist. + +DAS wird verwendet, um sicherzustellen, dass Rollup-Betreiber ihre Transaktionsdaten verfügbar machen, nachdem [Full Danksharding](/roadmap/danksharding/#what-is-danksharding) implementiert wurde. Unter Verwendung der redundanten Daten aus der obigen Tabelle als Beweis für die Existenz der Daten werden die zu beprobenden Transaktionsdaten von den Ethereum-Knoten zufällig ausgewählt, die Batch-Ladungen von Datengruppen einrichten. Diese Technik kann auch verwendet werden, um Blockproduzenten die Möglichkeit zu geben, ihre Daten zur Verfügung zu stellen, um <> zu schützen. In ähnlicher Weise wäre bei der [Trennung von Blockvorschlagendem und -ersteller (PBS)](/roadmap/pbs) nur der Blockersteller verpflichtet, einen ganzen Block zu verarbeiten – andere Validatoren würden die Verifizierung mittels Datenverfügbarkeits-Sampling durchführen. + +### Datenverfügbarkeitskomitees {#data-availability-committees} + +Datenschutzausschüsse (DACs), sind Ausschüsse, die sich aus Interessengruppen zusammensetzen, sie betonen die Notwendigkeit, Informationen über die Verfügbarkeit von Daten bereitzustellen und zu gewährleisten. DACs können anstelle von [oder in Kombination mit](https://hackmd.io/@vbuterin/sharding_proposal#Why-not-use-just-committees-and-not-DAS) DAS verwendet werden. Die von den Ausschüssen gebotenen Sicherheitsgarantien hängen von ihrer Umsetzung ab. Ethereum verwendet zufällig ausgewählte Stichproben von Unterklassen von Prüfern, die die Verfügbarkeit von zum Beispiel <> zusichern. + +DACs werden auch von einigen Validiums eingesetzt. Der DAC ist ein vertrauenswürdiger Satz von Knoten, der Datenkopien offline speichert. Die Umsetzung der DAC-Richtlinie wird für die Bereitstellung von Daten im Streitfall verlangt. Mitglieder des DAC veröffentlichen außerdem Offchain Bescheinigungen, um zu beweisen, dass die besagten Daten tatsächlich verfügbar sind. Einige Validiums ersetzen die DACs durch ein Proof-of-Stake (PoS)-Validierungssystem. Hier kann jeder zum Validator werden und Daten außerhalb der Kette speichern. Dennoch basieren die Anforderungen an die Datenübertragung auf einer "Vereinbarung", die in einem digitalen Protokoll hinterlegt ist. Im Falle einer böswilligen Absicht, wie zum Beispiel im Falle eines Datenlecks des Validators, könnte diese Vereinbarung gekündigt werden. Aufgrund ihrer Rolle, die ehrliches Verhalten fördert, verfügen Datenschutzausschüsse, die auf der Proof-of-Stake Methode basieren, über einen erheblich sichereren Speicherplatz als DACs. + +## Datenverfügbarkeit und Light Nodes {#data-availability-and-light-nodes} + +[Light Nodes](/developers/docs/nodes-and-clients/light-clients) müssen die Korrektheit der Block-Header, die sie empfangen, validieren, ohne die Blockdaten herunterzuladen. Diese Leichtigkeit hat ihren Preis: die Unfähigkeit, die Köpfe des Blocks (block headers) unabhängig zu überprüfen, indem neue Transaktionen lokal durchgeführt werden, wie es die Vollknoten derzeit tun. + +Ethereum Light Nodes vertrauen auf zufällige Sätze von 512 Validatoren, die einem _Synchronisierungskomitee_ zugewiesen wurden. Das Sync-Komitee, das als programmierte Investition (DCA) fungiert, weist die <> darauf hin, dass sie durch die Verwendung eines kryptografischen Algorithmus die im Header enthaltenen Daten validieren können. Der Beratungsausschuss führt tägliche Auffrischungen durch. Jeder Block-Header informiert Light Nodes darüber, von welchen Validatoren die Unterzeichnung des _nächsten_ Blocks zu erwarten ist, sodass sie nicht dazu verleitet werden können, einer bösartigen Gruppe zu vertrauen, die vorgibt, das echte Synchronisierungskomitee zu sein. + +Was passiert jedoch, wenn es einem Angreifer irgendwie _doch_ gelingt, einen bösartigen Block-Header an Light Clients weiterzugeben und sie davon zu überzeugen, dass er von einem ehrlichen Synchronisierungskomitee unterzeichnet wurde? In diesem Fall könnte der Angreifer Transaktionen hinzufügen, die nicht gültig gemacht wurden, was den <> dazu veranlassen würde, ihnen blind zu vertrauen und sie zu validieren, da sie nicht in der Lage sind, die im Block Header aufgezeichneten Statusänderungen unabhängig zu überprüfen. Der <> kann Beweismittel anlegen, um sich vor Betrug zu schützen. + +Wie werden diese Anfragen zur automatischen Reproduktion der Transaktion in der Praxis weitergegeben? Ein vollständiger Knoten stellt fest, dass im Netzwerk über einen ungültigen Zustandsübergang getratscht wird, und beschließt daher, sofort kleine Datendateien zu generieren, in denen der Beweis enthalten ist, dass der fragliche Zustandsübergang nicht Teil einer Reihe von eingereichten Transaktionen sein kann, und diese Daten an seine Peers weiterzuleiten. Die <> können hingehen und die Ergebnisse der letzten Anfrage zur automatischen Reproduktion der Transaktion (fraud proofs) abrufen, um bösartige Header zu erkennen. Dadurch wird sichergestellt, dass es sich bei den Akteuren, die an der Wartung der Kette beteiligt sind, um ehrliche Akteure handelt, wie es bei vollständigen Knoten der Fall ist. + +Diese basieren auf vollständigen Knoten, die Zugriff auf die vollständigen Daten der Blöcke haben. Ein Angreifer, der einen bösartigen Block-Header übermittelt und es nicht schafft, die Transaktionsdaten verfügbar zu machen, wäre dann in der Lage, die Erstellung einer Anfrage zur automatischen Reproduktion der Transaktion durch die vollständigen Knoten zu verhindern. Die vollständigen Knoten könnten zwar eine Warnung vor einem fehlerhaften Block signalisieren, sie könnten ihre Warnung jedoch nicht mit Beweisen untermauern, da die Daten zur Generierung des Beweises nicht zur Verfügung gestellt wurden! + +DAS: Die Lösung für das Problem der Datenverfügbarkeit. Die <> greifen auf vollständige Daten zurück, die aktualisiert wurden, um sehr kleine Blobs mit zufälligen Daten herunterladen zu können, die als Muster verwendet werden, um die Verfügbarkeit aller vollständigen Daten zu gewährleisten. Die tatsächliche Wahrscheinlichkeit, nach dem Herunterladen von N zufälligen Chunks fälschlicherweise von einer vollständigen Datenverfügbarkeit auszugehen, kann berechnet werden ([bei 100 Chunks liegt die Wahrscheinlichkeit bei 10^-30](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html), d. h. sie ist unglaublich gering). + +Doch selbst unter diesem Szenario könnten Angriffe, die nur wenige Bytes zurückhalten, durchaus von den Kunden unbemerkt bleiben, die ihrerseits Abfragen mit zufälligen Daten stellen könnten. Löschen Coding behebt dieses Problem, indem es kleine fehlende Datenteile rekonstruiert, die zur Überprüfung vorgeschlagener Statusänderungen verwendet werden können. Mithilfe der rekonstruierten Daten könnte dann ein Betrugsnachweis erstellt werden, der verhindert, dass Light Nodes fehlerhafte Header akzeptieren. + +**Hinweis:** DAS und Betrugsbeweise wurden für Proof-of-Stake-Ethereum-Light-Clients noch nicht implementiert, stehen aber auf der Roadmap und werden höchstwahrscheinlich die Form von ZK-SNARK-basierten Beweisen annehmen. Die heutigen Light-Clients verlassen sich auf eine Form von DAC: Sie überprüfen die Identitäten des Synchronisierungskomitees und vertrauen dann den signierten Blockheadern, die sie erhalten. + +## Datenverfügbarkeit und Layer-2-Rollups {#data-availability-and-layer-2-rollups} + +[Layer-2-Skalierungslösungen](/layer-2/) wie [Rollups](/glossary/#rollups) reduzieren die Transaktionskosten und erhöhen den Durchsatz von Ethereum durch die Verarbeitung von Transaktionen außerhalb der Chain. Rollup Transaktionen werden komprimiert und stapelweise auf Ethereum gepostet. Batches stellen Tausende einzelner Offchain Transaktionen in einer einzigen Transaktion auf Ethereum dar. Dies reduziert die Überlastung der Basisschicht und senkt die Gebühren für die Benutzer. + +Nur wenn eine vorgeschlagene Zustandsänderung unabhängig verifiziert und als korrektes Ergebnis aller einzelnen Off-Chain-Transaktionen bestätigt werden kann, kann man den auf Ethereum geposteten „Sammeltransaktionen“ vertrauen. Falls die Rollup-Betreiber die Transaktionsdaten für diese Überprüfung nicht bereitstellen, besteht das Risiko, dass sie fehlerhafte Daten an Ethereum senden. + +[Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/) veröffentlichen komprimierte Transaktionsdaten auf Ethereum und warten eine gewisse Zeit (in der Regel 7 Tage), damit unabhängige Prüfer die Daten kontrollieren können. Sollte jemand ein Problem identifizieren, kann ein Betrugsnachweis (Fraud Proof) erstellt werden, um den Rollup anzufechten. Dies würde dazu führen, dass die Kette zurückgesetzt wird und der ungültige Block ausgelassen wird. Dies ist nur möglich, wenn Daten verfügbar sind. Derzeit gibt es zwei Möglichkeiten, wie optimistische Rollups Transaktionsdaten an L1 senden. Einige Rollups stellen Daten dauerhaft als `CALLDATA` zur Verfügung, die permanent auf der Chain gespeichert sind. Mit der Implementierung von EIP-4844 veröffentlichen einige Rollups ihre Transaktionsdaten stattdessen im günstigeren Klecks Speicher. Dies ist keine dauerhafte Speicherung. Bevor die Daten vom Ethereum-Layer-1 gelöscht werden, müssen unabhängige Verifizierer innerhalb von etwa 18 Tagen die Blobs prüfen und ihre Anfechtungen vorbringen. Die vom Ethereum-Protokoll garantierte Datenverfügbarkeit ist auf dieses kurze, feste Zeitfenster beschränkt. Anschließend sind andere Akteure im Ethereum-Ökosystem dafür verantwortlich. Jeder Node kann die Datenverfügbarkeit mithilfe von DAS überprüfen, d. h. durch Herunterladen kleiner, zufälliger Stichproben der Blob-Daten. + +[Zero-Knowledge (ZK)-Rollups](/developers/docs/scaling/zk-rollups) müssen keine Transaktionsdaten veröffentlichen, da [Zero-Knowledge-Gültigkeitsnachweise](/glossary/#zk-proof) die Korrektheit von Zustandsübergängen garantieren. Die Datenverfügbarkeit bleibt jedoch weiterhin ein Problem, denn ohne Zugriff auf die State-Daten eines ZK-Rollups kann man dessen Funktionalität nicht gewährleisten oder damit interagieren. Hält ein Betreiber Details über den State des Rollups zurück, können Nutzer beispielsweise ihre Guthaben nicht einsehen. Zudem können sie keine State-Updates mithilfe von Informationen aus einem neu hinzugefügten Block durchführen. + +## Datenverfügbarkeit vs. Datenabrufbarkeit {#data-availability-vs-data-retrievability} + +Datenverfügbarkeit ist nicht dasselbe wie Datenabrufbarkeit. Datenverfügbarkeit bedeutet, dass Full Nodes in der Lage waren, auf alle Transaktionen eines bestimmten Blocks zuzugreifen und diese zu überprüfen. Dies ist jedoch nicht mit einer ewigen Verfügbarkeit der Daten gleichzusetzen. + +Datenabrufbarkeit ist die Fähigkeit von Nodes, _historische Informationen_ von der Blockchain abzurufen. Für die Verifizierung neuer Blöcke werden diese historischen Daten nicht benötigt. Sie sind jedoch erforderlich, um Full Nodes ab dem Genesis-Block zu synchronisieren oder um spezifische historische Anfragen zu bedienen. + +Für das Ethereum-Kernprotokoll steht nicht die Datenabrufbarkeit im Vordergrund, sondern primär die Datenverfügbarkeit. Die Datenabrufbarkeit kann von einer kleinen Population von Archiv-Nodes, die von Dritten betrieben werden, bereitgestellt oder über das Netzwerk mithilfe dezentraler Dateispeicher wie dem [Portal Network](https://www.ethportal.net/) verteilt werden. + +## Weiterführende Lektüre {#further-reading} + +- [WTF is Data Availability?](https://medium.com/blockchain-capital-blog/wtf-is-data-availability-80c2c95ded0f) +- [What Is Data Availability?](https://coinmarketcap.com/academy/article/what-is-data-availability) +- [A primer on data availability checks](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html) +- [An explanation of the sharding + DAS proposal](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) +- [A note on data availability and erasure coding](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding#can-an-attacker-not-circumvent-this-scheme-by-releasing-a-full-unavailable-block-but-then-only-releasing-individual-bits-of-data-as-clients-query-for-them) +- [Data availability committees.](https://medium.com/starkware/data-availability-e5564c416424) +- [Proof-of-stake data availability committees.](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) +- [Solutions to the data retrievability problem](https://notes.ethereum.org/@vbuterin/data_sharding_roadmap#Who-would-store-historical-data-under-sharding) +- [Data Availability Or: How Rollups Learned To Stop Worrying And Love Ethereum](https://web.archive.org/web/20250515194659/https://web.archive.org/web/20241108192208/https://research.2077.xyz/data-availability-or-how-rollups-learned-to-stop-worrying-and-love-ethereum) +- [EIP-7623: Increasing Calldata Cost](https://web.archive.org/web/20250515194659/https://research.2077.xyz/eip-7623-increase-calldata-cost) diff --git a/public/content/translations/de/developers/docs/data-structures-and-encoding/index.md b/public/content/translations/de/developers/docs/data-structures-and-encoding/index.md new file mode 100644 index 00000000000..bec0f01ae3f --- /dev/null +++ b/public/content/translations/de/developers/docs/data-structures-and-encoding/index.md @@ -0,0 +1,32 @@ +--- +title: Datenstrukturen und Kodierung +description: Eine Übersicht über die grundlegenden Ethereum-Datenstrukturen. +lang: de +sidebarDepth: 2 +--- + +Ethereum erstellt, speichert und überträgt große Datenmengen. Diese Daten müssen auf standardisierte und speichereffiziente Weise formatiert werden, damit jeder auf relativ bescheidener handelsüblicher Hardware [einen Node ausführen](/run-a-node/) kann. Um dies zu erreichen, werden auf dem Ethereum Stack mehrere spezifische Datenstrukturen verwendet. + +## Voraussetzungen {#prerequisites} + +Sie sollten die Grundlagen von Ethereum und [Client-Software](/developers/docs/nodes-and-clients/) verstehen. Es wird empfohlen, mit der Netzwerkschicht und [dem Ethereum-Whitepaper](/whitepaper/) vertraut zu sein. + +## Datenstrukturen {#data-structures} + +### Patricia Merkle Tries {#patricia-merkle-tries} + +Patricia Merkle Versucht sind Strukturen, die Schlüssel-Wert-Paare in einen deterministischen und kryptografisch authentifizierten Trie kodieren. Diese werden in der gesamten Ausführungsschicht von Ethereum umfassend verwendet. + +[Mehr über Patricia Merkle Tries](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) + +### Recursive Length Prefix {#recursive-length-prefix} + +Recursive Length Prefix (RLP) ist eine Serialisierungs methode, die in der gesamten Ausführungsschicht von Ethereum häufig verwendet wird. + +[Mehr über RLP](/developers/docs/data-structures-and-encoding/rlp) + +### Simple Serialize {#simple-serialize} + +Simple Serialise (SSZ) ist aufgrund seiner Kompatibilität mit der Merklelizierung das dominierende Serialisierungsformat auf der Konsensebene von Ethereum. + +[Mehr über SSZ](/developers/docs/data-structures-and-encoding/ssz) diff --git a/public/content/translations/de/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md b/public/content/translations/de/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md new file mode 100644 index 00000000000..1525651bd56 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md @@ -0,0 +1,266 @@ +--- +title: Merkle Patricia Trie +description: Einführung in Merkle Patricia Trie. +lang: de +sidebarDepth: 2 +--- + +Der Zustand von Ethereum (die Gesamtheit aller Konten, Guthaben und Smart Contracts) wird in eine spezielle Version der Datenstruktur kodiert, die in der Informatik allgemein als Hash-Baum bekannt ist. Diese Datenstruktur ist für viele Anwendungen in der Kryptografie nützlich, da sie eine überprüfbare Beziehung zwischen allen einzelnen Daten im Baum herstellt, was zu einem einzigen **Wurzel**-Wert führt, der verwendet werden kann, um Aussagen über die Daten zu beweisen. + +Die Datenstruktur von Ethereum ist ein „modifizierter Merkle-Patricia-Trie“. Der Name rührt daher, dass sie einige Merkmale von PATRICIA (Practical Algorithm To Retrieve Information Coded in Alphanumeric) übernimmt und für einen effizienten Datenabruf (re**trie**val) von Elementen konzipiert ist, die den Ethereum-Zustand ausmachen. + +Ein Merkle-Patricia-Trie ist deterministisch und kryptografisch verifizierbar: Die einzige Möglichkeit, eine Zustandswurzel zu erzeugen, besteht darin, sie aus jedem einzelnen Teil des Zustands zu berechnen. Zwei identische Zustände lassen sich leicht nachweisen, indem man den Root-Hash und die Hashes, die zu ihm geführt haben, vergleicht (_ein Merkle-Beweis_). Umgekehrt gibt es keine Möglichkeit, zwei verschiedene Zustände mit demselben Root-Hash zu erstellen, jeder Versuch, einen Zustand mit anderen Werten zu ändern, führt zu einem anderen Stamm-Hash. Theoretisch bietet diese Struktur den „heiligen Gral“ der `O(log(n))`-Effizienz für Einfügungen, Suchvorgänge und Löschungen. + +In naher Zukunft plant Ethereum die Migration zu einer [Verkle-Tree](/roadmap/verkle-trees)-Struktur, die viele neue Möglichkeiten für zukünftige Protokollverbesserungen eröffnen wird. + +## Voraussetzungen {#prerequisites} + +Um diese Seite besser zu verstehen, sind Grundkenntnisse über [Hashes](https://en.wikipedia.org/wiki/Hash_function), [Merkle-Bäume](https://en.wikipedia.org/wiki/Merkle_tree), [Tries](https://en.wikipedia.org/wiki/Trie) und [Serialisierung](https://en.wikipedia.org/wiki/Serialization) hilfreich. Dieser Artikel beginnt mit einer Beschreibung eines einfachen [Radix-Baums](https://en.wikipedia.org/wiki/Radix_tree) und führt dann schrittweise die für die optimierte Datenstruktur von Ethereum notwendigen Änderungen ein. + +## Einfache Radix-Tries {#basic-radix-tries} + +Bei einem Basic Radix Trie sieht jede Node wie folgt aus: + +``` + [i_0, i_1 ... i_n, value] +``` + +Wobei `i_0 ...` i_n`die Symbole des Alphabets (oft binär oder hexadezimal) darstellen,`value`der Endwert am Knoten ist und die Werte in den`i_0, i_1 ...` i_n`-Slots entweder `NULL` oder Zeiger auf (in unserem Fall, Hashes von) andere Knoten sind. Dies bildet einen einfachen `(Key, Value)`-Speicher. + +Stell dir vor, du möchtest eine Radix-Trie-Datenstruktur nutzen, um die Reihenfolge eines Sets von Key-Value-Paarten dauerhaft zu speichern. Um den Wert zu finden, der dem Key `dog` im Trie zugeordnet ist, wandeln Sie zuerst `dog` in Buchstaben des Alphabets um (was `64 6f 67` ergibt) und steigen dann diesem Pfad folgend den Trie hinab, bis Sie den Wert finden. Das heißt, Sie beginnen mit der Suche nach dem Stamm-Hash in einer flachen Schlüssel-/Wert-Datenbank, um den Stammknoten des trie zu finden. Es wird als Array von Schlüsseln dargestellt, die auf andere Knoten verweisen. Sie würden den Wert am Index `6` als Key verwenden und ihn in der flachen Key/Value-DB nachschlagen, um den Knoten eine Ebene tiefer zu erhalten. Dann wählen Sie Index `4`, um den nächsten Wert nachzuschlagen, dann Index `6` und so weiter, bis Sie, nachdem Sie dem Pfad gefolgt sind: `root -> 6 -> 4 -> 6 -> 15 -> 6 -> 7`, den Wert des Knotens nachschlagen und das Ergebnis zurückgeben. + +Es besteht ein Unterschied zwischen der Suche im „Trie“ und der zugrunde liegenden flachen Schlüssel /Wert-„DB“. Beide definieren Schlüssel /Wertanordnungen, aber die zugrunde liegende Datenbank kann eine herkömmliche einstufige Suche nach einem Schlüssel durchführen. Das Nachschlagen eines Schlüssels im Trie erfordert mehrere zugrunde liegende DB Suchvorgänge, um zum oben beschriebenen Endwert zu gelangen. Bezeichnen wir Letzteres als `path`, um Mehrdeutigkeiten zu vermeiden. + +Die Aktualisierungs- und Löschvorgänge für radix tries können wie folgt definiert werden: + +```python + def update(node_hash, path, value): + curnode = db.get(node_hash) if node_hash else [NULL] * 17 + newnode = curnode.copy() + if path == "": + newnode[-1] = value + else: + newindex = update(curnode[path[0]], path[1:], value) + newnode[path[0]] = newindex + db.put(hash(newnode), newnode) + return hash(newnode) + + def delete(node_hash, path): + if node_hash is NULL: + return NULL + else: + curnode = db.get(node_hash) + newnode = curnode.copy() + if path == "": + newnode[-1] = NULL + else: + newindex = delete(curnode[path[0]], path[1:]) + newnode[path[0]] = newindex + + if all(x is NULL for x in newnode): + return NULL + else: + db.put(hash(newnode), newnode) + return hash(newnode) +``` + +Ein "Merkle" Radix taum wird durch die Verknüpfung von Knoten mithilfe deterministisch generierter kryptografischer Hash Verdaut erstellt. Diese Inhaltsadressierung (in der Key/Value-DB `key == keccak256(rlp(value))`) bietet eine kryptografische Integritätsgarantie der gespeicherten Daten. Wenn der Stamm Hash eines bestimmten Tries öffentlich bekannt ist, kann jeder mit Zugriff auf die zugrunde liegenden Blattdaten einen Beweis dafür erstellen, dass der Trie einen bestimmten Wert an einem bestimmten Pfad enthält, indem er die Hashes jedes Knotens bereitstellt, der einen bestimmten Wert mit der Baumwurzel verbindet. + +Es ist für einen Angreifer unmöglich, einen Beweis für ein `(path, value)`-Paar zu erbringen, das nicht existiert, da der Root-Hash letztendlich auf allen darunter liegenden Hashes basiert. Jede zugrunde liegende Änderung würde den Root Hash ändern. Sie können sich den Hash als komprimierte Darstellung struktureller Informationen über die Daten vorstellen, die durch den pre-Image Schutz der Hashing Funktion gesichert sind. + +Wir bezeichnen eine atomare Einheit eines Radix-Baums (z. B. ein einzelnes Hex-Zeichen oder eine 4-Bit-Binärzahl) als "Nibble". Beim Durchlaufen eines Pfads, jeweils ein Nibble nach dem anderen, wie oben beschrieben, können Knoten auf maximal 16 untergeordnete Elemente verweisen, aber ein `value`-Element enthalten. Wir stellen sie daher als Array der Länge 17 dar. Wir nennen diese 17-element Arrays "Zweig Knoten“. + +## Merkle-Patricia-Trie {#merkle-patricia-trees} + +Radix tries haben eine große Einschränkung: Sie sind ineffizient. Wenn Sie eine `(path, value)`-Bindung speichern möchten, bei der der Pfad wie in Ethereum 64 Zeichen lang ist (die Anzahl der Nibbles in `bytes32`), benötigen wir über ein Kilobyte zusätzlichen Speicherplatz, um eine Ebene pro Zeichen zu speichern, und jede Suche oder Löschung wird die vollen 64 Schritte benötigen. Der im Folgenden vorgestellte Patricia Trie löst dieses Problem. + +### Optimierung {#optimization} + +Ein Knoten in einem Merkle Patricia Trie ist einer der folgenden: + +1. `NULL` (dargestellt als leere Zeichenfolge) +2. `branch` Ein 17-elementiger Knoten `[ v0 ...` v15, vt ]\` +3. `leaf` Ein 2-elementiger Knoten `[ encodedPath, value ]` +4. `extension` Ein 2-elementiger Knoten `[ encodedPath, key ]` + +Bei 64 Zeichenpfaden ist es unvermeidlich, dass Sie nach dem Durchlaufen der ersten paar Schichten des trie einen Knoten erreichen, an dem zumindest für einen Teil des Weges kein abweichender Pfad vorhanden ist. Um die Erstellung von bis zu 15 dünn besetzten `NULL`-Knoten entlang des Pfads zu vermeiden, kürzen wir den Abstieg ab, indem wir einen `extension`-Knoten der Form `[ encodedPath, key ]` einrichten, wobei `encodedPath` den "Teilpfad" zum Überspringen enthält (unter Verwendung einer unten beschriebenen kompakten Kodierung) und der `key` für die nächste DB-Suche dient. + +Bei einem `leaf`-Knoten, der durch ein Flag im ersten Nibble des `encodedPath` markiert werden kann, kodiert der Pfad alle Pfadfragmente des vorherigen Knotens, und wir können den `value` direkt nachschlagen. + +Die obige Optimierung führt jedoch zu Mehrdeutigkeiten. + +Wenn Pfade in Nibbles durchlaufen werden, kann es sein, dass eine ungerade Anzahl von Nibbles zu durchlaufen ist, aber da alle Daten im `bytes`-Format gespeichert sind. Es ist nicht möglich, beispielsweise zwischen dem Nibble `1` und den Nibbles `01` zu unterscheiden (beide müssen als `<01>` gespeichert werden). Um eine ungerade Länge anzugeben, wird dem Teilpfad ein Flagge vorangestellt. + +### Spezifikation: Kompakte Kodierung einer Hex-Sequenz mit optionalem Terminator {#specification} + +Die Kennzeichnung von sowohl _ungerader vs. gerader verbleibender Teilpfadlänge_ als auch _leaf- vs. extension-Knoten_ befindet sich, wie oben beschrieben, im ersten Nibble des Teilpfads eines jeden 2-elementigen Knotens. Sie führen zu Folgendem: + +| Hex Zeichen | Bits | Knotentyp teilweise | Pfadlänge | +| ----------- | ---- | ----------------------------------- | --------- | +| 0 | 0000 | Verlängerung | sogar | +| 1 | 0001 | Verlängerung | seltsam | +| 2 | 0010 | beendend (Blatt) | sogar | +| 3 | 0011 | beendend (Blatt) | seltsam | + +Bei einer geraden verbleibenden Pfadlänge (`0` oder `2`) folgt immer ein weiteres `0`-"Padding"-Nibble. + +```python + def compact_encode(hexarray): + term = 1 if hexarray[-1] == 16 else 0 + if term: + hexarray = hexarray[:-1] + oddlen = len(hexarray) % 2 + flags = 2 * term + oddlen + if oddlen: + hexarray = [flags] + hexarray + else: + hexarray = [flags] + [0] + hexarray + # hexarray hat jetzt eine gerade Länge, dessen erstes Nibble die Flags sind. + o = "" + for i in range(0, len(hexarray), 2): + o += chr(16 * hexarray[i] + hexarray[i + 1]) + return o +``` + +Beispiele: + +```python + > [1, 2, 3, 4, 5, ...] + '11 23 45' + > [0, 1, 2, 3, 4, 5, ...] + '00 01 23 45' + > [0, f, 1, c, b, 8, 10] + '20 0f 1c b8' + > [f, 1, c, b, 8, 10] + '3f 1c b8' +``` + +Hier ist der erweiterte Code zum Abrufen eines Knotens im Merkle Patricia Trie: + +```python + def get_helper(node_hash, path): + if path == []: + return node_hash + if node_hash == "": + return "" + curnode = rlp.decode(node_hash if len(node_hash) < 32 else db.get(node_hash)) + if len(curnode) == 2: + (k2, v2) = curnode + k2 = compact_decode(k2) + if k2 == path[: len(k2)]: + return get(v2, path[len(k2) :]) + else: + return "" + elif len(curnode) == 17: + return get_helper(curnode[path[0]], path[1:]) + + def get(node_hash, path): + path2 = [] + for i in range(len(path)): + path2.push(int(ord(path[i]) / 16)) + path2.push(ord(path[i]) % 16) + path2.push(16) + return get_helper(node_hash, path2) +``` + +### Beispiel-Trie {#example-trie} + +Nehmen wir an, wir wollen einen Trie, der vier Pfad/Wert-Paare enthält: `('do', 'verb')`, `('dog', 'puppy')`, `('doge', 'coins')`, `('horse', 'stallion')`. + +Zuerst konvertieren wir sowohl Pfade als auch Werte in `bytes`. Unten werden die tatsächlichen Byte-Darstellungen für _Pfade_ mit `<>` gekennzeichnet, obwohl die _Werte_ zum leichteren Verständnis immer noch als Strings, gekennzeichnet durch `''`, dargestellt werden (auch sie wären eigentlich `bytes`): + +``` + <64 6f> : 'verb' + <64 6f 67> : 'puppy' + <64 6f 67 65> : 'coins' + <68 6f 72 73 65> : 'stallion' +``` + +Nun bauen wir einen solchen Trie mit den folgenden Key-Value-Paaren in der zugrundeliegenden Datenbank auf: + +``` + rootHash: [ <16>, hashA ] + hashA: [ <>, <>, <>, <>, hashB, <>, <>, <>, [ <20 6f 72 73 65>, 'stallion' ], <>, <>, <>, <>, <>, <>, <>, <> ] + hashB: [ <00 6f>, hashC ] + hashC: [ <>, <>, <>, <>, <>, <>, hashD, <>, <>, <>, <>, <>, <>, <>, <>, <>, 'verb' ] + hashD: [ <17>, [ <>, <>, <>, <>, <>, <>, [ <35>, 'coins' ], <>, <>, <>, <>, <>, <>, <>, <>, <>, 'puppy' ] ] +``` + +Wenn ein Knoten innerhalb eines anderen Knotens referenziert wird, wird `keccak256(rlp.encode(node))` eingefügt, falls `len(rlp.encode(node)) >= 32`, ansonsten `node`, wobei `rlp.encode` die [RLP](/developers/docs/data-structures-and-encoding/rlp)-Kodierungsfunktion ist. + +Beachten Sie, dass beim Aktualisieren eines Tries das Key/Value-Paar `(keccak256(x), x)` in einer persistenten Lookup-Tabelle gespeichert werden muss, _wenn_ der neu erstellte Knoten eine Länge >= 32 hat. Allerdings entfällt die Speicherpflicht, falls der Node kürzer ist. Der Grund dafür ist, dass die Funktion f(x) = x umkehrbar ist. + +## Tries in Ethereum {#tries-in-ethereum} + +Sämtliche Merkle-Tries im Execution Layer von Ethereum sind als Merkle-Patricia-Trie implementiert. + +Der Block Header beinhaltet 3 Roots, von denen jede aus einem dieser 3 Tries stammt. + +1. State-Root +2. Transactions-Root +3. Receipts-Root + +### Zustands-Trie {#state-trie} + +Es existiert nur ein globaler State-Trie, dessen Aktualisierung jedes Mal erfolgt, wenn ein Client einen Block verarbeitet. Darin ist ein `path` immer: `keccak256(ethereumAddress)` und ein `value` immer: `rlp(ethereumAccount)`. Genauer gesagt ist ein Ethereum-`account` ein 4-elementiges Array: `[nonce,balance,storageRoot,codeHash]`. An dieser Stelle ist es erwähnenswert, dass dieser `storageRoot` die Wurzel eines weiteren Patricia-Tries ist: + +### Speicher-Trie {#storage-trie} + +Im Speicher-Trie befinden sich _alle_ Vertragsdaten. Für jedes Konto gibt es einen separaten Speicherbereich. Um Werte an bestimmten Speicherpositionen an einer bestimmten Adresse abzurufen, werden die Speicheradresse, die ganzzahlige Position der gespeicherten Daten im Speicher und die Block-ID benötigt. Diese können dann als Argumente an die in der JSON-RPC-API definierte Funktion `eth_getStorageAt` übergeben werden, z. B. um die Daten im Speicherslot 0 für die Adresse `0x295a70b2de5e3953354a6a8344e616ed314d7251` abzurufen: + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545 + +{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"} + +``` + +Das Abrufen anderer Elemente im Speicher ist etwas komplizierter, da zuerst die Position im Speicher Trie berechnet werden muss. Die Position wird als `keccak256`-Hash der Adresse und der Speicherposition berechnet, wobei beide links mit Nullen auf eine Länge von 32 Bytes aufgefüllt werden. Die Position für die Daten im Speicherslot 1 für die Adresse `0x391694e7e0b0cce554cb130d723a9d27458f9298` lautet zum Beispiel: + +```python +keccak256(decodeHex("000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001")) +``` + +In einer Geth Konsole kann dies wie folgt berechnet werden: + +``` +> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001" +undefined +> web3.sha3(key, {"encoding": "hex"}) +"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9" +``` + +Der `path` ist daher `keccak256(<6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9>)`. Damit können nun wie bisher die Daten aus dem Speicher abgerufen werden: + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545 + +{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"} +``` + +Hinweis: Der `storageRoot` für ein Ethereum-Konto ist standardmäßig leer, wenn es sich nicht um ein Vertragskonto handelt. + +### Transaktions-Trie {#transaction-trie} + +Für jeden Block gibt es einen separaten Transaktions-Trie, der wiederum `(key, value)`-Paare speichert. Ein Pfad ist hier: `rlp(transactionIndex)`. Dies stellt den Key dar, der einem Wert entspricht, der bestimmt wird durch: + +```python +if legacyTx: + value = rlp(tx) +else: + value = TxType | encode(tx) +``` + +Weitere Informationen dazu finden Sie in der [EIP 2718](https://eips.ethereum.org/EIPS/eip-2718)-Dokumentation. + +### Beleg-Trie {#receipts-trie} + +Jeder Block hat seinen eigenen Belegversuch. Ein `path` ist hier: `rlp(transactionIndex)`. `transactionIndex` ist sein Index innerhalb des Blocks, in dem es enthalten war. Der Beleg Trie wird nie aktualisiert. Ähnlich wie beim Transaktionsverzeichnis gibt es aktuelle und alte Belege. Um eine bestimmte Quittung im Quittungs Trie abzufragen, werden der Index der Transaktion in ihrem Block, die Quittungsnutzlast und der Transaktionstyp benötigt. Der zurückgegebene Beleg kann vom Typ `Receipt` sein, der als Verkettung von `TransactionType` und `ReceiptPayload` definiert ist, oder er kann vom Typ `LegacyReceipt` sein, der als `rlp([status, cumulativeGasUsed, logsBloom, logs])` definiert ist. + +Weitere Informationen dazu finden Sie in der [EIP 2718](https://eips.ethereum.org/EIPS/eip-2718)-Dokumentation. + +## Weiterführende Lektüre {#further-reading} + +- [Modifizierter Merkle-Patricia-Trie — Wie Ethereum einen Zustand speichert](https://medium.com/codechain/modified-merkle-patricia-trie-how-ethereum-saves-a-state-e6d7555078dd) +- [Merkling in Ethereum](https://blog.ethereum.org/2015/11/15/merkling-in-ethereum/) +- [Den Ethereum-Trie verstehen](https://easythereentropy.wordpress.com/2014/06/04/understanding-the-ethereum-trie/) diff --git a/public/content/translations/de/developers/docs/data-structures-and-encoding/rlp/index.md b/public/content/translations/de/developers/docs/data-structures-and-encoding/rlp/index.md new file mode 100644 index 00000000000..cc95b6bef56 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-structures-and-encoding/rlp/index.md @@ -0,0 +1,163 @@ +--- +title: RLP Serialisierung (Recursive Length Prefix) +description: Eine Definition der RLP-Kodierung in der Ausführungsschicht von Ethereum. +lang: de +sidebarDepth: 2 +--- + +Die Serialisierung mit rekursivem Längenpräfix (RLP) wird in den Ausführungsclients von Ethereum häufig verwendet. RLP standardisiert die Datenübertragung zwischen Knoten in einem platzsparenden Format. Der Zweck von RLP besteht darin, beliebig verschachtelte Arrays binärer Daten zu kodieren, und RLP ist die primäre Kodierungsmethode, die zum Serialisieren von Objekten in der Ausführungsschicht von Ethereum verwendet wird. Der Hauptzweck von RLP ist die Kodierung von Strukturen; mit Ausnahme von positiven Ganzzahlen delegiert RLP die Kodierung bestimmter Datentypen (z. B. Zeichenfolgen, Gleitkommazahlen) an Protokolle höherer Ordnung. Positive Ganzzahlen müssen im Big Endian Binärformat ohne führende Nullen dargestellt werden (wodurch der Ganzzahlwert Null dem leeren Byte-Array entspricht). Deserialisierte positive Ganzzahlen mit führenden Nullen müssen von jedem höherstufigen Protokoll, das RLP verwendet, als ungültig behandelt werden. + +Weitere Informationen im [Ethereum Yellow Paper (Anhang B)](https://ethereum.github.io/yellowpaper/paper.pdf#page=19). + +Um RLP zum Kodieren eines Wörterbuchs zu verwenden, werden folgende zwei kanonische Formen vorgeschlagen: + +- Verwenden Sie `[[k1,v1],[k2,v2]...]` mit Schlüsseln in lexikografischer Reihenfolge +- Verwenden Sie die höherstufige Patricia Tree Kodierung wie Ethereum + +## Definition {#definition} + +Die RLPB Kodierungsfunktion nimmt ein Element auf. Ein Artikel wird wie folgt definiert: + +- eine Zeichenfolge (d. h. ein Byte-Array) ist ein Element +- eine Liste von Elementen ist ein Element +- eine positive ganze Zahl ist ein Element + +Zu den folgenden Elementen zählen beispielsweise alle: + +- eine leere Zeichenfolge; +- die Zeichenfolge, die das Wort „Katze“ enthält; +- eine Liste mit einer beliebigen Anzahl von Zeichenfolgen; +- und komplexere Datenstrukturen wie `["Katze", ["Welpe", "Kuh"], "Pferd", [[]], "Schwein", [""], "Schaf"]`. +- die Zahl `100` + +Beachten Sie, dass im Kontext der restlichen Seite „Zeichenfolge“ „eine bestimmte Anzahl von Bytes binärer Daten“ bedeutet. Es werden keine speziellen Kodierungen verwendet und es wird kein Wissen über den Inhalt der Zeichenfolgen vorausgesetzt (außer wie von der Regel gegen nicht-minimale positive Ganzzahlen gefordert). + +Die RLP-Kodierung ist wie folgt definiert: + +- Bei einer positiven Ganzzahl wird diese in das kürzeste Byte-Array konvertiert, dessen groß endian Interpretation die Ganzzahl ist, und dann gemäß den folgenden Regeln als Zeichenfolge codiert. +- Für ein einzelnes Byte, dessen Wert im Bereich `[0x00, 0x7f]` (dezimal `[0, 127]`) liegt, ist dieses Byte seine eigene RLP-Kodierung. +- Andernfalls, wenn eine Zeichenfolge 0-55 Bytes lang ist, besteht die RLP-Kodierung aus einem einzelnen Byte mit dem Wert **0x80** (Dez. 128) plus der Länge der Zeichenfolge, gefolgt von der Zeichenfolge. Der Bereich des ersten Bytes ist somit `[0x80, 0xb7]` (Dez. `[128, 183]`). +- Wenn eine Zeichenfolge mehr als 55 Bytes lang ist, besteht die RLP-Kodierung aus einem einzelnen Byte mit dem Wert **0xb7** (Dez. 183) plus der Länge der Länge der Zeichenfolge in Bytes in Binärform, gefolgt von der Länge der Zeichenfolge, gefolgt von der Zeichenfolge. Beispielsweise würde eine 1024 Byte lange Zeichenfolge als `\xb9\x04\x00` (Dez. `185, 4, 0`) gefolgt von der Zeichenfolge kodiert. Dabei ist `0xb9` (183 + 2 = 185) das erste Byte, gefolgt von den 2 Bytes `0x0400` (Dez. 1024), die die Länge des eigentlichen Strings angeben. Der Bereich des ersten Bytes ist somit `[0xb8, 0xbf]` (Dez. `[184, 191]`). +- Wenn eine Zeichenfolge 2^64 Bytes oder länger ist, wird sie möglicherweise nicht codiert. +- Wenn die Gesamtnutzlast einer Liste (d. h. die kombinierte Länge all ihrer RLP-kodierten Elemente) 0-55 Bytes lang ist, besteht die RLP-Kodierung aus einem einzelnen Byte mit dem Wert **0xc0** plus der Länge der Nutzlast, gefolgt von der Verkettung der RLP-Kodierungen der Elemente. Der Bereich des ersten Bytes ist somit `[0xc0, 0xf7]` (Dez. `[192, 247]`). +- Wenn die Gesamtnutzlast einer Liste mehr als 55 Bytes lang ist, besteht die RLP-Kodierung aus einem einzelnen Byte mit dem Wert **0xf7** plus der Länge der Länge der Nutzlast in Bytes in Binärform, gefolgt von der Länge der Nutzlast, gefolgt von der Verkettung der RLP-Kodierungen der Elemente. Der Bereich des ersten Bytes ist somit `[0xf8, 0xff]` (Dez. `[248, 255]`). + +Im Code lautet dies: + +```python +def rlp_encode(input): + if isinstance(input,str): + if len(input) == 1 and ord(input) < 0x80: + return input + return encode_length(len(input), 0x80) + input + elif isinstance(input, list): + output = '' + for item in input: + output += rlp_encode(item) + return encode_length(len(output), 0xc0) + output + +def encode_length(L, offset): + if L < 56: + return chr(L + offset) + elif L < 256**8: + BL = to_binary(L) + return chr(len(BL) + offset + 55) + BL + raise Exception("Eingabe zu lang") + +def to_binary(x): + if x == 0: + return '' + return to_binary(int(x / 256)) + chr(x % 256) +``` + +## Beispiele {#examples} + +- die Zeichenfolge "Hund = [ 0x83, 'd', 'o', 'g' ] +- die Liste [ "cat", "dog" ] = `[ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]` +- die leere Zeichenfolge ('null') = `[ 0x80 ]` +- die leere Liste = `[ 0xc0 ]` +- die Ganzzahl 0 = `[ 0x80 ]` +- das Byte `\\x00` = `[ 0x00 ]` +- das Byte `\\x0f` = `[ 0x0f ]` +- die Bytes `\\x04\\x00` = `[ 0x82, 0x04, 0x00 ]` +- die [mengentheoretische Darstellung](http://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers) von drei, `[ [], [[]], [ [], [[]] ] ] = [ 0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc1, 0xc0 ]` +- die Zeichenfolge "Lorem ipsum dolor sit amet, consectetur adipisicing elit" = `[ 0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ...` `, 'e', 'l', 'i', 't' ]` + +## RLP-Dekodierung {#rlp-decoding} + +Gemäß den Regeln und dem Verfahren der RLP Kodierung wird der Eingang der RLP Dekodierung als ein Array binärer Daten betrachtet. Der RLP Decodierung Verfahren läuft wie folgt ab: + +1. entsprechend dem ersten Byte (d. h. Präfix) der Eingabedaten und Dekodierung des Datentyps, der Länge der tatsächlichen Daten und des Offsets; + +2. Dekodieren Sie die Daten entsprechend dem Typ und Offset der Daten und beachten Sie dabei die minimale Codierung Regel für positive Ganzzahlen; + +3. Fahren Sie mit der Dekodierung des restlichen Inputs fort; + +Fahren Sie mit der Dekodierung des restlichen Inputs fort: + +1. die Daten sind eine Zeichenfolge, wenn der Bereich des ersten Bytes (d. h. Präfix) [0x00, 0x7f] ist, und die Zeichenfolge genau das erste Byte selbst ist; + +2. die Daten sind eine Zeichenfolge, wenn der Bereich des ersten Bytes [0x80, 0xb7] ist und auf das erste Byte die Zeichenfolge folgt, deren Länge gleich dem ersten Byte minus 0x80 ist; + +3. die Daten sind eine Zeichenfolge, wenn der Bereich des ersten Bytes [0xb8, 0xbf] ist und die Länge der Zeichenfolge, deren Länge in Bytes gleich dem ersten Byte minus 0xb7 ist, auf das erste Byte folgt und die Zeichenfolge der Länge der Zeichenfolge folgt; + +4. die Daten sind eine Liste, wenn der Bereich des ersten Bytes [0xc0, 0xf7] ist und auf das erste Byte die Verkettung der RLP-Kodierungen aller Elemente der Liste folgt, deren Gesamtnutzlast gleich dem ersten Byte minus 0xc0 ist; + +5. die Daten sind eine Liste, wenn der Bereich des ersten Bytes [0xf8, 0xff] ist und die Gesamtnutzlast der Liste, deren Länge gleich dem ersten Byte minus 0xf7 ist, auf das erste Byte folgt und die Verkettung der RLP-Kodierungen aller Elemente der Liste der Gesamtnutzlast der Liste folgt; + +Im Code lautet dies: + +```python +def rlp_decode(input): + if len(input) == 0: + return + output = '' + (offset, dataLen, type) = decode_length(input) + if type is str: + output = instantiate_str(substr(input, offset, dataLen)) + elif type is list: + output = instantiate_list(substr(input, offset, dataLen)) + output += rlp_decode(substr(input, offset + dataLen)) + return output + +def decode_length(input): + length = len(input) + if length == 0: + raise Exception("Eingabe ist null") + prefix = ord(input[0]) + if prefix <= 0x7f: + return (0, 1, str) + elif prefix <= 0xb7 and length > prefix - 0x80: + strLen = prefix - 0x80 + return (1, strLen, str) + elif prefix <= 0xbf and length > prefix - 0xb7 and length > prefix - 0xb7 + to_integer(substr(input, 1, prefix - 0xb7)): + lenOfStrLen = prefix - 0xb7 + strLen = to_integer(substr(input, 1, lenOfStrLen)) + return (1 + lenOfStrLen, strLen, str) + elif prefix <= 0xf7 and length > prefix - 0xc0: + listLen = prefix - 0xc0; + return (1, listLen, list) + elif prefix <= 0xff and length > prefix - 0xf7 and length > prefix - 0xf7 + to_integer(substr(input, 1, prefix - 0xf7)): + lenOfListLen = prefix - 0xf7 + listLen = to_integer(substr(input, 1, lenOfListLen)) + return (1 + lenOfListLen, listLen, list) + raise Exception("Eingabe entspricht nicht dem RLP-Kodierungsformat") + +def to_integer(b): + length = len(b) + if length == 0: + raise Exception("Eingabe ist null") + elif length == 1: + return ord(b[0]) + return ord(substr(b, -1)) + to_integer(substr(b, 0, -1)) * 256 +``` + +## Weiterführende Lektüre {#further-reading} + +- [RLP in Ethereum](https://medium.com/coinmonks/data-structure-in-ethereum-episode-1-recursive-length-prefix-rlp-encoding-decoding-d1016832f919) +- [Ethereum unter der Haube: RLP](https://medium.com/coinmonks/ethereum-under-the-hood-part-3-rlp-decoding-df236dc13e58) +- [Coglio, A. (2020). Ethereums rekursives Längenpräfix in ACL2. arXiv preprint arXiv:2009.13769.](https://arxiv.org/abs/2009.13769) + +## Verwandte Themen {#related-topics} + +- [Patricia-Merkle-Trie](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) diff --git a/public/content/translations/de/developers/docs/data-structures-and-encoding/ssz/index.md b/public/content/translations/de/developers/docs/data-structures-and-encoding/ssz/index.md new file mode 100644 index 00000000000..96ca799aab9 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-structures-and-encoding/ssz/index.md @@ -0,0 +1,150 @@ +--- +title: Einfache Serialisierung +description: Erklärung des SSZ Formats von Ethereum. +lang: de +sidebarDepth: 2 +--- + +**Simple Serialize (SSZ)** ist die Serialisierungsmethode, die auf der Beacon Chain verwendet wird. Es ersetzt die auf der Ausführungsebene verwendete RLP Serialisierung überall auf der Konsensebene mit Ausnahme des Peer-Discovery Protokolls. Weitere Informationen zur RLP-Serialisierung findest du unter [Recursive-Length Prefix (RLP)](/developers/docs/data-structures-and-encoding/rlp/). SSZ ist so konzipiert, dass es deterministisch ist und sich auch effizient Merkleize lässt. Man kann sich SSZ als aus zwei Komponenten bestehend vorstellen: einem Serialisierungs Schema und einem Merkleisierungs Schema, das für die effiziente Arbeit mit der serialisierten Datenstruktur konzipiert ist. + +## Wie funktioniert SSZ? {#how-does-ssz-work} + +### Serialisierung {#serialization} + +SSZ ist ein Serialisierungs Schema, das nicht selbstbeschreibend ist, sondern auf einem Schema basiert, das im Voraus bekannt sein muss. Das Ziel der SSZ Serialisierung besteht darin, Objekte beliebiger Komplexität als Bytefolgen darzustellen. Für „Basistypen“ ist dies ein sehr einfacher Vorgang. Das Element wird einfach in hexadezimale Bytes umgewandelt. Zu den Grundtypen gehören: + +- Vorzeichenlose Ganzzahlen +- Boolesche Werte + +Bei komplexen „zusammengesetzten“ Typen ist die Serialisierung komplizierter, da der zusammengesetzte Typ mehrere Elemente enthält, die unterschiedliche Typen oder unterschiedliche Größen oder beides haben können. Wenn diese Objekte alle eine feste Länge haben (d. h. die Größe der Elemente ist unabhängig von ihren tatsächlichen Werten immer konstant), ist die Serialisierung einfach eine Konvertierung jedes Elements im zusammengesetzten Typ in der entsprechenden Reihenfolge in Little-Endian-Bytestrings. Diese Byte Strings werden zusammengefügt. Das serialisierte Objekt verfügt über die Byte Listendarstellung der Elemente mit fester Länge in derselben Reihenfolge, in der sie im deserialisierten Objekt erscheinen. + +Bei Typen mit variabler Länge werden die tatsächlichen Daten durch einen „Offset“-Wert an der Position dieses Elements im serialisierten Objekt ersetzt. Die eigentlichen Daten werden am Ende des serialisierten Objekts zu einem Haufen hinzugefügt. Der Offsetwert ist der Index für den Beginn der eigentlichen Daten im Haufen und fungiert als Zeiger auf die relevanten Bytes. + +Das folgende Beispiel veranschaulicht, wie der Ausgleich für einen Container mit Elementen fester und variabler Länge funktioniert: + +```Rust + + struct Dummy { + + number1: u64, + number2: u64, + vector: Vec, + number3: u64 + } + + dummy = Dummy{ + + number1: 37, + number2: 55, + vector: vec![1,2,3,4], + number3: 22, + } + + serialized = ssz.serialize(dummy) + +``` + +`serialized` hätte die folgende Struktur (hier nur auf 4 Bit aufgefüllt, in Wirklichkeit auf 32 Bit, wobei die `int`-Darstellung zur Verdeutlichung beibehalten wird): + +``` +[37, 0, 0, 0, 55, 0, 0, 0, 16, 0, 0, 0, 22, 0, 0, 0, 1, 2, 3, 4] +------------ ----------- ----------- ----------- ---------- + | | | | | + number1 number2 Offset für number3 Wert für + vector vector + +``` + +Zur besseren Übersichtlichkeit auf mehrere Zeilen aufgeteilt: + +``` +[ + 37, 0, 0, 0, # Little-Endian-Kodierung von `number1`. + 55, 0, 0, 0, # Little-Endian-Kodierung von `number2`. + 16, 0, 0, 0, # Der „Offset“, der anzeigt, wo der Wert von `vector` beginnt (Little-Endian 16). + 22, 0, 0, 0, # Little-Endian-Kodierung von `number3`. + 1, 2, 3, 4, # Die tatsächlichen Werte in `vector`. +] +``` + +Dies ist immer noch eine Vereinfachung – die Ganzzahlen und Nullen in den obigen Schemata würden tatsächlich als Byte listen gespeichert, etwa so: + +``` +[ + 10100101000000000000000000000000 # Little-Endian-Kodierung von `number1` + 10110111000000000000000000000000 # Little-Endian-Kodierung von `number2`. + 10010000000000000000000000000000 # Der „Offset“, der anzeigt, wo der Wert von `vector` beginnt (Little-Endian 16). + 10010110000000000000000000000000 # Little-Endian-Kodierung von `number3`. + 10000001100000101000001110000100 # Der tatsächliche Wert des `bytes`-Feldes. +] +``` + +Daher werden die tatsächlichen Werte für Typen mit variabler Länge in einem Haufen am Ende des serialisierten Objekts gespeichert, wobei ihre Offsets an den richtigen Positionen in der geordneten Liste der Felder gespeichert werden. + +Es gibt auch einige Sonderfälle, die eine besondere Behandlung erfordern, wie z. B. der Typ `BitList`, bei dem während der Serialisierung eine Längenbegrenzung hinzugefügt und während der Deserialisierung entfernt werden muss. Alle Details findest du in der [SSZ-Spezifikation](https://github.com/ethereum/consensus-specs/blob/dev/ssz/simple-serialize.md). + +### Deserialisierung {#deserialization} + +Zum Deseria lisieren dieses Objekts ist das Schema erforderlich. Das Schema definiert das genaue Layout der serialisierten Daten, sodass jedes spezifische Element aus einem Byte Klecks in ein aussagekräftiges Objekt deserialisiert werden kann, wobei die Elemente den richtigen Typ, Wert, die richtige Größe und Position haben. Das Schema teilt dem Deserialisierer mit, welche Werte tatsächliche Werte und welche Offsets sind. Alle Feldnamen verschwinden, wenn ein Objekt serialisiert wird, werden aber bei der Deserialisierung gemäß dem Schema neu instanziiert. + +Eine interaktive Erklärung dazu findest du auf [ssz.dev](https://www.ssz.dev/overview). + +## Merkleisierung {#merkleization} + +Dieses SSZ Serialisierte Objekt kann dann merkleisiert werden, d. h. in eine Merkle Baum Darstellung derselben Daten umgewandelt werden. Zunächst wird die Anzahl der 32-Byte-Blöcke im serialisierten Objekt ermittelt. Dies sind die „Blätter“ des Baumes. Die Gesamtzahl der Blätter muss eine Zweierpotenz sein, damit das Zusammenführen der Blätter schließlich eine einzelne Hash-Baum-Wurzel ergibt. Wenn dies nicht von Natur aus der Fall ist, werden zusätzliche Blätter mit 32 Bytes Nullen hinzugefügt. Schematisch. + +``` + Hash-Baumwurzel + / \ + / \ + / \ + / \ + Hash der Blätter Hash der Blätter + 1 und 2 3 und 4 + / \ / \ + / \ / \ + / \ / \ + Blatt1 Blatt2 Blatt3 Blatt4 +``` + +Es gibt auch Fälle, in denen die Blätter des Baumes nicht von Natur aus gleichmäßig verteilt sind, wie im obigen Beispiel. Beispielsweise könnte Blatt 4 ein Container mit mehreren Elementen sein, die dem Merkle Baum zusätzliche „Tiefe“ hinzufügen müssen, wodurch ein ungleichmäßiger Baum entsteht. + +Anstatt diese Baumelemente als Blatt X, Knoten X usw. zu bezeichnen, können wir ihnen verallgemeinerte Indizes zuweisen, beginnend mit Wurzel = 1 und von links nach rechts entlang jeder Ebene zählend. Dies ist der oben Erläuterte verallgemeinerte Index. Jedes Element in der serialisierten Liste hat einen verallgemeinerten Index gleich `2**depth + idx`, wobei idx seine nullindizierte Position im serialisierten Objekt und die Tiefe die Anzahl der Ebenen im Merkle-Baum ist, die als Logarithmus zur Basis zwei der Anzahl der Elemente (Blätter) bestimmt werden kann. + +## Verallgemeinerte Indizes {#generalized-indices} + +Ein verallgemeinerter Index ist eine Ganzzahl, die einen Node in einem binären Merkle-Baum darstellt, wobei jeder Node einen verallgemeinerten Index von `2 ** depth + index in row` hat. + +``` + 1 --depth = 0 2**0 + 0 = 1 + 2 3 --depth = 1 2**1 + 0 = 2, 2**1+1 = 3 + 4 5 6 7 --depth = 2 2**2 + 0 = 4, 2**2 + 1 = 5... + +``` + +Diese Darstellung ergibt einen Knotenindex für jedes Datenelement im Merkle Baum. + +## Multiproofs {#multiproofs} + +Durch die Bereitstellung der Liste verallgemeinerter Indizes, die ein bestimmtes Element darstellen, können wir es anhand der Hash-Baum-Wurzel überprüfen. Diese Wurzel ist unsere akzeptierte Version der Realität. Alle uns zur Verfügung gestellten Daten können anhand dieser Realität überprüft werden, indem sie an der richtigen Stelle im Merkle Baum eingefügt werden (bestimmt durch seinen verallgemeinerten Index) und beobachtet wird, dass die Wurzel konstant bleibt. In der Spezifikation findest du [hier](https://github.com/ethereum/consensus-specs/blob/dev/ssz/merkle-proofs.md#merkle-multiproofs) Funktionen, die zeigen, wie die minimale Menge an Nodes berechnet wird, die benötigt wird, um den Inhalt einer bestimmten Menge verallgemeinerter Indizes zu verifizieren. + +Um beispielsweise Daten im Index 9 im folgenden Baum zu überprüfen, benötigen wir den Hash der Daten an den Indizes 8, 9, 5, 3, 1. +Der Hash von (8,9) sollte dem Hash (4) entsprechen, der mit 5 gehasht wird, um 2 zu erzeugen, das mit 3 gehasht wird, um die Baumwurzel 1 zu erzeugen. Wenn für 9 falsche Daten angegeben würden, würde sich die Wurzel ändern – wir würden dies erkennen und den Zweig nicht überprüfen. + +``` +* = Daten, die zur Erzeugung des Proofs erforderlich sind + + 1* + 2 3* + 4 5* 6 7 +8* 9* 10 11 12 13 14 15 + +``` + +## Weiterführende Lektüre {#further-reading} + +- [Ethereum upgraden: SSZ](https://eth2book.info/altair/part2/building_blocks/ssz) +- [Ethereum upgraden: Merkleisierung](https://eth2book.info/altair/part2/building_blocks/merkleization) +- [SSZ-Implementierungen](https://github.com/ethereum/consensus-specs/issues/2138) +- [SSZ-Rechner](https://simpleserialize.com/) +- [SSZ.dev](https://www.ssz.dev/) diff --git a/public/content/translations/de/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md b/public/content/translations/de/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md new file mode 100644 index 00000000000..20665ad9a32 --- /dev/null +++ b/public/content/translations/de/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md @@ -0,0 +1,195 @@ +--- +title: Speicherdefinition von Web3-Geheimnis +description: Formale Definition für die geheime Speicherung von Web3 +lang: de +sidebarDepth: 2 +--- + +Damit Ihre App auf Ethereum funktioniert, können Sie das von der Bibliothek web3.js bereitgestellte Web3 Objekt verwenden. Unter der Haube kommuniziert es über RPC Aufrufe mit einem lokalen Knoten. [web3](https://github.com/ethereum/web3.js/) funktioniert mit jedem Ethereum-Node, der eine RPC-Schicht bereitstellt. + +`web3` enthält das `eth`-Objekt – web3.eth. + +```js +var fs = require("fs") +var recognizer = require("ethereum-keyfile-recognizer") + +fs.readFile("keyfile.json", (err, data) => { + var json = JSON.parse(data) + var result = recognizer(json) +}) + +/** result + * [ 'web3', 3 ] web3 (v3) Schlüsseldatei + * [ 'ethersale', undefined ] Ethersale-Schlüsseldatei + * null ungültige Schlüsseldatei + */ +``` + +Dieses Dokument beschreibt **Version 3** der Web3 Secret Storage Definition. + +## Definition {#definition} + +Die eigentliche Kodierung und Dekodierung der Datei bleibt im Vergleich zu Version 1 weitgehend unverändert, außer dass der Kryptoalgorithmus nicht mehr auf AES-128-CBC festgelegt ist (AES-128-CTR ist jetzt die Mindestanforderung). Die meisten Bedeutungen/der Algorithmus sind ähnlich wie in Version 1, mit Ausnahme von `mac`, das als SHA3 (Keccak-256) der Verkettung der zweiten 16 Bytes von links des abgeleiteten Schlüssels zusammen mit dem vollständigen `ciphertext` angegeben wird. + +Geheime Schlüsseldateien werden direkt in `~/.web3/keystore` (für Unix-ähnliche Systeme) und `~/AppData/Web3/keystore` (für Windows) gespeichert. Sie können beliebig benannt werden, aber eine gute Konvention ist `.json`, wobei `` die 128-Bit-UUID ist, die dem geheimen Schlüssel zugewiesen wird (ein datenschutzwahrender Proxy für die Adresse des geheimen Schlüssels). + +Diese Dateien sind passwortgeschützt. Um den geheimen Schlüssel einer `.json`-Datei abzuleiten, wird zuerst der Verschlüsselungsschlüssel der Datei abgeleitet; dies geschieht, indem das Passwort der Datei durch eine Schlüsselableitungsfunktion geleitet wird, wie sie vom `kdf`-Schlüssel beschrieben wird. KDF-abhängige statische und dynamische Parameter für die KDF-Funktion werden im `kdfparams`-Schlüssel beschrieben. + +Für alle minimal konformen Implementierungen ist die Unterstützung von PBKDF2 obligatorisch, mit folgender Kennzeichnung: + +- `kdf`: `pbkdf2` + +Für PBKDF2 setzen sich die kdfparams wie folgt zusammen: + +- `prf`: Muss `hmac-sha256` sein (kann in Zukunft erweitert werden); +- `c`: Anzahl der Iterationen; +- `salt`: Salt, das an PBKDF übergeben wird; +- `dklen`: Länge für den abgeleiteten Schlüssel. Muss >= 32 sein. + +Nachdem der Schlüssel der Datei abgeleitet wurde, muss er durch die Ableitung des MAC verifiziert werden. Der MAC sollte als SHA3 (Keccak-256)-Hash des Byte-Arrays berechnet werden, das durch die Verkettung der Bytes 16-31 des abgeleiteten Schlüssels mit dem Inhalt des `ciphertext`-Schlüssels gebildet wird, d. h.: + +```js +KECCAK(DK[16..31] ++ ) +``` + +(wobei `++` der Verkettungsoperator ist) + +Dieser Wert sollte mit dem Inhalt des `mac`-Schlüssels verglichen werden; wenn sie sich unterscheiden, sollte ein alternatives Passwort angefordert (oder der Vorgang abgebrochen) werden. + +Nachdem der Schlüssel der Datei verifiziert wurde, kann der Chiffretext (der `ciphertext`-Schlüssel in der Datei) mit dem symmetrischen Verschlüsselungsalgorithmus entschlüsselt werden, der durch den `cipher`-Schlüssel spezifiziert und durch den `cipherparams`-Schlüssel parametrisiert wird. Bei einer Nichtübereinstimmung der Schlüsselgrößen (abgeleiteter Schlüssel vs. Algorithmus-Schlüssel) werden die letzten Bytes des mit Nullen aufgefüllten, abgeleiteten Schlüssels als Schlüssel für den Algorithmus genutzt. + +ede Implementierung, die die Mindestanforderungen erfüllt, muss den AES-128-CTR-Algorithmus unterstützen, welcher folgendermaßen gekennzeichnet ist: + +- `cipher: aes-128-ctr` + +Dieser Verschlüsselungsalgorithmus verwendet die folgenden Parameter, welche als Schlüssel innerhalb des cipherparams-Objekts übergeben werden: + +- `iv`: 128-Bit-Initialisierungsvektor für die Chiffre. + +Als Schlüssel für die Chiffre werden die 16 Bytes ganz links des abgeleiteten Schlüssels verwendet, d. h. `DK[0..15]`. + +Für die Erstellung und Verschlüsselung eines geheimen Schlüssels gelten diese Anweisungen im Grunde in umgekehrter Reihenfolge. Stellen Sie sicher, dass `uuid`, `salt` und `iv` tatsächlich zufällig sind. + +Zusätzlich zum `version`-Feld, das als „harter“ Identifikator für die Version dienen sollte, können Implementierungen auch `minorversion` verwenden, um kleinere, abwärtskompatible Änderungen am Format zu verfolgen. + +## Testvektoren {#test-vectors} + +Details: + +- `Adresse`: `008aeeda4d805471df9b2a5b0f38a0c3bcba786b` +- `ICAP`: `XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67` +- `UUID`: `3198bc9c-6672-5ab3-d9954942343ae5b6` +- `Passwort`: `testpassword` +- `Geheimnis`: `7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d` + +### PBKDF2-SHA-256 {#PBKDF2-SHA-256} + +Testvektor mit `AES-128-CTR` und `PBKDF2-SHA-256`: + +Dateiinhalt von `~/.web3/keystore/3198bc9c-6672-5ab3-d9954942343ae5b6.json`: + +```json +{ + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "6087dab2f9fdbbfaddc31a909735c1e6" + }, + "ciphertext": "5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46", + "kdf": "pbkdf2", + "kdfparams": { + "c": 262144, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd" + }, + "mac": "517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2" + }, + "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6", + "version": 3 +} +``` + +**Zwischenergebnisse**: + +`Abgeleiteter Schlüssel`: `f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551` +`MAC-Body`: `e31891a3a773950e6d0fea48a71885515318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46` +`MAC`: `517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2` +`Chiffrierschlüssel`: `f06d69cdc7da0faffb1008270bca38f5` + +### Scrypt {#scrypt} + +Testvektor für AES-128-CTR und Scrypt: + +```json +{ + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "740770fce12ce862af21264dab25f1da" + }, + "ciphertext": "dd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2", + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "n": 262144, + "p": 1, + "r": 8, + "salt": "25710c2ccd7c610b24d068af83b959b7a0e5f40641f0c82daeb1345766191034" + }, + "mac": "337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c" + }, + "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6", + "version": 3 +} +``` + +**Zwischenergebnisse**: + +`Abgeleiteter Schlüssel`: `7446f59ecc301d2d79bc3302650d8a5cedc185ccbb4bf3ca1ebd2c163eaa6c2d` +`MAC-Body`: `edc185ccbb4bf3ca1ebd2c163eaa6c2ddd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2` +`MAC`: `337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c` +`Chiffrierschlüssel`: `7446f59ecc301d2d79bc3302650d8a5c` + +## Änderungen gegenüber Version 1 {#alterations-from-v2} + +Diese Version behebt mehrere Inkonsistenzen mit der [hier](https://github.com/ethereum/homestead-guide/blob/master/old-docs-for-reference/go-ethereum-wiki.rst/Passphrase-protected-key-store-spec.rst) veröffentlichten Version 1. In Kürze: + +- Die uneinheitliche und willkürliche Groß- und Kleinschreibung ist problematisch (mal Kleinschreibung wie bei scrypt, mal gemischte Schreibweise wie bei Kdf oder Großbuchstaben wie bei MAC). +- Das Feld Address ist nicht erforderlich und gefährdet die Privatsphäre. +- `Salt` ist ein wesentlicher Parameter der Schlüsselableitungsfunktion und sollte ihr zugeordnet werden, nicht der Kryptographie im Allgemeinen. +- _SaltLen_ ist unnötig (es kann einfach von Salt abgeleitet werden). +- Die Schlüsselableitungsfunktion ist frei wählbar, der Krypto-Algorithmus aber fest einprogrammiert. +- `Version` ist eigentlich numerisch, wird aber als String gespeichert (eine strukturierte Versionierung per String wäre zwar denkbar, sprengt aber den Rahmen für ein Konfigurationsdateiformat, das sich selten ändert). +- `KDF` und `cipher` sind konzeptionell verwandte Konzepte, werden aber unterschiedlich organisiert. +- Der `MAC` wird aus einem Datenstück berechnet, das von Leerräumen (Whitespace) unabhängig ist(!) + +Durch Änderungen am Format ergibt sich die folgende Datei. Ihre Funktionalität entspricht dem Beispiel auf der zuvor verlinkten Seite: + +```json +{ + "crypto": { + "cipher": "aes-128-cbc", + "ciphertext": "07533e172414bfa50e99dba4a0ce603f654ebfa1ff46277c3e0c577fdc87f6bb4e4fe16c5a94ce6ce14cfa069821ef9b", + "cipherparams": { + "iv": "16d67ba0ce5a339ff2f07951253e6ba8" + }, + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "n": 262144, + "p": 1, + "r": 8, + "salt": "06870e5e6a24e183a5c807bd1c43afd86d573f7db303ff4853d135cd0fd3fe91" + }, + "mac": "8ccded24da2e99a11d48cda146f9cc8213eb423e2ea0d8427f41c3be414424dd", + "version": 1 + }, + "id": "0498f19a-59db-4d54-ac95-33901b4f1870", + "version": 2 +} +``` + +## Änderungen gegenüber Version 2 {#alterations-from-v2} + +Version 2 war eine frühe, fehlerbehaftete Implementierung in C++. An den Grundlagen ändert sich nichts. diff --git a/public/content/translations/de/developers/docs/design-and-ux/dex-design-best-practice/index.md b/public/content/translations/de/developers/docs/design-and-ux/dex-design-best-practice/index.md new file mode 100644 index 00000000000..d0e14d0bc55 --- /dev/null +++ b/public/content/translations/de/developers/docs/design-and-ux/dex-design-best-practice/index.md @@ -0,0 +1,220 @@ +--- +title: Bewährte Praktiken für das Design von dezentralen Börsen (DEX) +description: Ein Leitfaden, der UX/UI-Entscheidungen für das Tauschen von Tokens erklärt. +lang: de +--- + +Seit dem Start von Uniswap im Jahr 2018 wurden Hunderte von dezentralen Börsen auf Dutzenden von verschiedenen Chains gestartet. +Viele von ihnen führten neue Elemente ein oder fügten ihre eigene Note hinzu, aber die Benutzeroberfläche ist im Allgemeinen gleich geblieben. + +Ein Grund dafür ist [Jakobs Gesetz](https://lawsofux.com/jakobs-law/): + +> Benutzer verbringen die meiste Zeit auf anderen Websites. Das bedeutet, dass Benutzer es vorziehen, dass Ihre Website auf die gleiche Weise funktioniert wie alle anderen Websites, die sie bereits kennen. + +Dank früher Innovatoren wie Uniswap, Pancakeswap und Sushiswap haben DeFi-Benutzer eine kollektive Vorstellung davon, wie eine DEX aussieht. +Aus diesem Grund bildet sich jetzt so etwas wie eine „Best Practice“ heraus. Wir sehen, dass immer mehr Design-Entscheidungen über Websites hinweg standardisiert werden. Man kann die Entwicklung von DEXs als ein riesiges Beispiel für Live-Tests sehen. Dinge, die funktionierten, blieben, Dinge, die nicht funktionierten, wurden verworfen. Es gibt immer noch Raum für Persönlichkeit, aber es gibt bestimmte Standards, denen eine DEX entsprechen sollte. + +Dieser Artikel ist eine Zusammenfassung von: + +- was man einbeziehen sollte +- wie man es so benutzerfreundlich wie möglich gestaltet +- die wichtigsten Möglichkeiten, das Design anzupassen + +Alle Beispiel-Wireframes wurden speziell für diesen Artikel erstellt, obwohl sie alle auf realen Projekten basieren. + +Das Figma-Kit ist ebenfalls am Ende enthalten – Sie können es gerne verwenden und Ihre eigenen Wireframes beschleunigen! + +## Grundlegende Anatomie einer DEX {#basic-anatomy-of-a-dex} + +Die Benutzeroberfläche enthält im Allgemeinen drei Elemente: + +1. Hauptformular +2. Schaltfläche +3. Detailbereich + +![Generische DEX-Benutzeroberfläche, die die drei Hauptelemente zeigt](./1.png) + +## Variationen {#variations} + +Dies wird ein wiederkehrendes Thema in diesem Artikel sein, aber es gibt verschiedene Möglichkeiten, diese Elemente zu organisieren. Der „Detailbereich“ kann sein: + +- Über der Schaltfläche +- Unter der Schaltfläche +- In einem Akkordeon-Panel versteckt +- Und/oder in einem „Vorschau“-Modal + +N.B. Ein „Vorschau“-Modal ist optional, aber wenn Sie nur sehr wenige Details auf der Hauptbenutzeroberfläche anzeigen, wird es unerlässlich. + +## Struktur des Hauptformulars {#structure-of-the-main-form} + +Dies ist das Feld, in dem Sie tatsächlich auswählen, welchen Token Sie tauschen möchten. Die Komponente besteht aus einem Eingabefeld und einer kleinen Schaltfläche in einer Reihe. + +DEXs zeigen normalerweise zusätzliche Details in einer Reihe darüber und einer Reihe darunter an, obwohl dies auch anders konfiguriert werden kann. + +![Eingabezeile mit einer Detailzeile darüber und darunter](./2.png) + +## Variationen {#variations2} + +Hier werden zwei UI-Variationen gezeigt; eine ohne Ränder, die ein sehr offenes Design erzeugt, und eine, bei der die Eingabezeile einen Rand hat, was den Fokus auf dieses Element legt. + +![Zwei UI-Variationen des Hauptformulars](./3.png) + +Diese Grundstruktur ermöglicht es, **vier wichtige Informationen** im Design anzuzeigen: eine in jeder Ecke. Wenn es nur eine obere/untere Reihe gibt, dann gibt es nur zwei Plätze. + +Im Laufe der Entwicklung von DeFi wurden hier viele verschiedene Dinge integriert. + +## Wichtige Informationen, die enthalten sein sollten {#key-info-to-include} + +- Guthaben in der Wallet +- Max-Schaltfläche +- Fiat-Äquivalent +- Preisauswirkung auf den „erhaltenen“ Betrag + +In den Anfängen von DeFi fehlte oft das Fiat-Äquivalent. Wenn Sie irgendeine Art von Web3-Projekt entwickeln, ist es unerlässlich, dass ein Fiat-Äquivalent angezeigt wird. Benutzer denken immer noch in lokalen Währungen, daher sollte dies einbezogen werden, um den realen mentalen Modellen zu entsprechen. + +Im zweiten Feld (dem, in dem Sie den Token auswählen, zu dem Sie tauschen) können Sie auch die Preisauswirkung neben dem Fiat-Währungsbetrag angeben, indem Sie die Differenz zwischen dem eingegebenen Betrag und den geschätzten Ausgabebeträgen berechnen. Dies ist ein recht nützliches Detail, das man einbeziehen sollte. + +Prozent-Schaltflächen (z. B. 25 %, 50 %, 75 %) können eine nützliche Funktion sein, aber sie nehmen mehr Platz ein, fügen mehr Handlungsaufforderungen hinzu und erhöhen die mentale Belastung. Dasselbe gilt für Prozentregler. Einige dieser UI-Entscheidungen hängen von Ihrer Marke und Ihrem Benutzertyp ab. + +Zusätzliche Details können unter dem Hauptformular angezeigt werden. Da diese Art von Informationen hauptsächlich für Profi-Benutzer gedacht ist, ist es sinnvoll, sie entweder: + +- so minimal wie möglich zu halten, oder; +- in einem Akkordeon-Panel zu verstecken + +![Details, die in den Ecken des Hauptformulars angezeigt werden](./4.png) + +## Zusätzliche Informationen, die enthalten sein sollten {#extra-info-to-include} + +- Token-Preis +- Slippage +- Mindestens erhaltener Betrag +- Erwartete Ausgabe +- Preisauswirkung +- Gas-Kostenschätzung +- Andere Gebühren +- Order-Routing + +Man könnte argumentieren, dass einige dieser Details optional sein könnten. + +Order-Routing ist interessant, macht aber für die meisten Benutzer keinen großen Unterschied. + +Einige andere Details geben einfach dasselbe auf unterschiedliche Weise wieder. Zum Beispiel sind „mindestens erhaltener Betrag“ und „Slippage“ zwei Seiten derselben Medaille. Wenn Sie die Slippage auf 1 % eingestellt haben, dann ist der Mindestbetrag, den Sie erwarten können = erwartete Ausgabe - 1 %. Einige Benutzeroberflächen zeigen den erwarteten Betrag, den Mindestbetrag und die Slippage an … Was nützlich, aber möglicherweise übertrieben ist. + +Die meisten Benutzer werden die Standard-Slippage ohnehin beibehalten. + +Die „Preisauswirkung“ wird oft in Klammern neben dem Fiat-Äquivalent im „An“-Feld angezeigt. Dies ist ein großartiges UX-Detail, aber wenn es hier angezeigt wird, muss es dann wirklich noch einmal unten angezeigt werden? Und dann noch einmal auf einem Vorschaubildschirm? + +Viele Benutzer (insbesondere diejenigen, die kleine Beträge tauschen) werden sich nicht um diese Details kümmern; sie werden einfach eine Zahl eingeben und auf Tauschen klicken. + +![Einige Details zeigen dasselbe](./5.png) + +Welche Details genau angezeigt werden, hängt von Ihrer Zielgruppe und dem Gefühl ab, das Ihre App vermitteln soll. + +Wenn Sie die Slippage-Toleranz im Detailbereich anzeigen, sollten Sie sie auch direkt von hier aus bearbeitbar machen. Dies ist ein gutes Beispiel für einen „Beschleuniger“; ein netter UX-Trick, der die Abläufe erfahrener Benutzer beschleunigen kann, ohne die allgemeine Benutzerfreundlichkeit der App zu beeinträchtigen. + +![Die Slippage kann über den Detailbereich gesteuert werden](./6.png) + +Es ist eine gute Idee, nicht nur über eine bestimmte Information auf einem Bildschirm nachzudenken, sondern über den gesamten Ablauf: +Zahlen im Hauptformular eingeben → Details scannen → Zum Vorschaubildschirm klicken (falls Sie einen haben). +Sollte der Detailbereich jederzeit sichtbar sein, oder muss der Benutzer darauf klicken, um ihn zu erweitern? +Sollten Sie durch das Hinzufügen eines Vorschaubildschirms Reibung erzeugen? Dies zwingt den Benutzer, langsamer zu machen und seinen Handel zu überdenken, was nützlich sein kann. Aber wollen sie all die gleichen Informationen noch einmal sehen? Was ist für sie an diesem Punkt am nützlichsten? + +## Design-Optionen {#design-options} + +Wie bereits erwähnt, hängt vieles von Ihrem persönlichen Stil ab +Wer ist Ihr Benutzer? +Was ist Ihre Marke? +Wollen Sie eine „Profi“-Oberfläche, die jedes Detail anzeigt, oder wollen Sie minimalistisch sein? +Selbst wenn Sie auf Profi-Benutzer abzielen, die alle möglichen Informationen wollen, sollten Sie sich dennoch an Alan Coopers weise Worte erinnern: + +> Egal wie schön, egal wie cool Ihre Benutzeroberfläche ist, es wäre besser, wenn es weniger davon gäbe. + +### Struktur {#structure} + +- Tokens links oder Tokens rechts +- 2 oder 3 Reihen +- Details über oder unter der Schaltfläche +- Details erweitert, minimiert oder nicht angezeigt + +### Komponentenstil {#component-style} + +- leer +- umrandet +- gefüllt + +Aus reiner UX-Sicht ist der UI-Stil weniger wichtig, als Sie denken. Visuelle Trends kommen und gehen in Zyklen, und viele Vorlieben sind subjektiv. + +Der einfachste Weg, ein Gefühl dafür zu bekommen – und über die verschiedenen Konfigurationen nachzudenken – ist, sich einige Beispiele anzusehen und dann selbst ein wenig zu experimentieren. + +Das enthaltene Figma-Kit enthält leere, umrandete und gefüllte Komponenten. + +Schauen Sie sich die folgenden Beispiele an, um verschiedene Möglichkeiten zu sehen, wie Sie alles zusammensetzen können: + +![3 Reihen in einem gefüllten Stil](./7.png) + +![3 Reihen in einem umrandeten Stil](./8.png) + +![2 Reihen in einem leeren Stil](./9.png) + +![3 Reihen in einem umrandeten Stil, mit einem Detailbereich](./10.png) + +![3 Reihen, bei denen die Eingabezeile einen umrandeten Stil hat](./11.png) + +![2 Reihen in einem gefüllten Stil](./12.png) + +## Aber auf welche Seite sollte der Token? {#but-which-side-should-the-token-go-on} + +Das Fazit ist, dass es wahrscheinlich keinen großen Unterschied für die Benutzerfreundlichkeit macht. Es gibt jedoch ein paar Dinge zu beachten, die Sie in die eine oder andere Richtung beeinflussen könnten. + +Es war mäßig interessant zu sehen, wie sich die Mode im Laufe der Zeit verändert hat. Uniswap hatte den Token anfangs auf der linken Seite, hat ihn aber inzwischen auf die rechte Seite verschoben. Sushiswap hat diese Änderung ebenfalls während eines Design-Upgrades vorgenommen. Die meisten, aber nicht alle Protokolle sind diesem Beispiel gefolgt. + +Finanzielle Konventionen setzen traditionell das Währungssymbol vor die Zahl, z. B. $50, €50, £50, aber wir _sagen_ 50 Dollar, 50 Euro, 50 Pfund. + +Für den allgemeinen Benutzer – insbesondere für jemanden, der von links nach rechts und von oben nach unten liest – fühlt sich der Token auf der rechten Seite wahrscheinlich natürlicher an. + +![Eine Benutzeroberfläche mit Tokens auf der linken Seite](./13.png) + +Den Token auf die linke Seite und alle Zahlen auf die rechte Seite zu setzen, sieht angenehm symmetrisch aus, was ein Pluspunkt ist, aber es gibt einen weiteren Nachteil bei diesem Layout. + +Das Gesetz der Nähe besagt, dass Elemente, die nahe beieinander liegen, als zusammengehörig wahrgenommen werden. Dementsprechend wollen wir zusammengehörige Elemente nebeneinander platzieren. Das Token-Guthaben ist direkt mit dem Token selbst verbunden und ändert sich, wann immer ein neuer Token ausgewählt wird. Es ist daher etwas sinnvoller, das Token-Guthaben neben der Token-Auswahlschaltfläche zu platzieren. Es könnte unter den Token verschoben werden, aber das bricht die Symmetrie des Layouts. + +Letztendlich gibt es für beide Optionen Vor- und Nachteile, aber es ist interessant, wie der Trend zum Token auf der rechten Seite zu gehen scheint. + +## Verhalten der Schaltfläche {#button-behavior} + +Haben Sie keine separate Schaltfläche für „Genehmigen“. Haben Sie auch keinen separaten Klick für „Genehmigen“. Der Benutzer möchte tauschen, also sagen Sie einfach „Tauschen“ auf der Schaltfläche und initiieren Sie die Genehmigung als ersten Schritt. Ein Modal kann den Fortschritt mit einem Stepper oder einer einfachen „Tx 1 von 2 – genehmigt“-Benachrichtigung anzeigen. + +![Eine Benutzeroberfläche mit separaten Schaltflächen für Genehmigen und Tauschen](./14.png) + +![Eine Benutzeroberfläche mit einer Schaltfläche, die „Genehmigen“ anzeigt](./15.png) + +### Schaltfläche als kontextbezogene Hilfe {#button-as-contextual-help} + +Die Schaltfläche kann auch als Warnung dienen! + +Dies ist eigentlich ein ziemlich ungewöhnliches Designmuster außerhalb von Web3, hat sich aber darin zum Standard entwickelt. Dies ist eine gute Innovation, da sie Platz spart und die Aufmerksamkeit fokussiert hält. + +Wenn die Hauptaktion – TAUSCHEN – aufgrund eines Fehlers nicht verfügbar ist, kann der Grund mit der Schaltfläche erklärt werden, z. B.: + +- Netzwerk wechseln +- Wallet verbinden +- verschiedene Fehler + +Die Schaltfläche kann auch **der auszuführenden Aktion zugeordnet werden**. Wenn der Benutzer zum Beispiel nicht tauschen kann, weil er sich im falschen Netzwerk befindet, sollte auf der Schaltfläche „Zu Ethereum wechseln“ stehen, und wenn der Benutzer auf die Schaltfläche klickt, sollte das Netzwerk auf Ethereum umgeschaltet werden. Dies beschleunigt den Benutzerfluss erheblich. + +![Schlüsselaktionen, die vom Haupt-CTA initiiert werden](./16.png) + +![Fehlermeldung, die im Haupt-CTA angezeigt wird](./17.png) + +## Erstellen Sie Ihre eigene mit dieser Figma-Datei {#build-your-own-with-this-figma-file} + +Dank der harten Arbeit mehrerer Protokolle hat sich das DEX-Design stark verbessert. Wir wissen, welche Informationen der Benutzer benötigt, wie wir sie anzeigen sollten und wie wir den Ablauf so reibungslos wie möglich gestalten können. +Hoffentlich bietet dieser Artikel einen soliden Überblick über die UX-Prinzipien. + +Wenn Sie experimentieren möchten, können Sie gerne das Figma-Wireframe-Kit verwenden. Es ist so einfach wie möglich gehalten, bietet aber genügend Flexibilität, um die Grundstruktur auf verschiedene Weisen aufzubauen. + +[Figma Wireframe-Kit](https://www.figma.com/community/file/1393606680816807382/dex-wireframes-kit) + +DeFi wird sich weiterentwickeln, und es gibt immer Raum für Verbesserungen. + +Viel Erfolg! diff --git a/public/content/translations/de/developers/docs/design-and-ux/heuristics-for-web3/index.md b/public/content/translations/de/developers/docs/design-and-ux/heuristics-for-web3/index.md new file mode 100644 index 00000000000..3b8a508b5d5 --- /dev/null +++ b/public/content/translations/de/developers/docs/design-and-ux/heuristics-for-web3/index.md @@ -0,0 +1,138 @@ +--- +title: 7 Heuristiken für das Design von Web3-Schnittstellen +description: Grundsätze zur Verbesserung der Benutzerfreundlichkeit von Web3 +lang: de +--- + +Benutzerfreundlichkeits-Heuristiken sind allgemeine „Faustregeln“, mit denen Sie die Benutzerfreundlichkeit Ihrer Website messen können. +Die 7 Heuristiken hier sind speziell auf Web3 zugeschnitten und sollten zusammen mit Jakob Nielsens [10 allgemeinen Prinzipien für Interaktionsdesign](https://www.nngroup.com/articles/ten-usability-heuristics/) verwendet werden. + +## Sieben Benutzerfreundlichkeits-Heuristiken für Web3 {#seven-usability-heuristics-for-web3} + +1. Feedback folgt der Aktion +2. Sicherheit und Vertrauen +3. Die wichtigsten Informationen sind offensichtlich +4. Verständliche Terminologie +5. Aktionen sind so kurz wie möglich +6. Netzwerkverbindungen sind sichtbar und flexibel +7. Steuerung über die App, nicht über die Wallet + +## Definitionen und Beispiele {#definitions-and-examples} + +### 1. Feedback folgt der Aktion {#feedback-follows-action} + +**Es sollte offensichtlich sein, wenn etwas passiert ist oder gerade passiert.** + +Benutzer entscheiden über ihre nächsten Schritte auf der Grundlage des Ergebnisses ihrer vorherigen Schritte. Daher ist es wichtig, dass sie über den Systemstatus informiert bleiben. Dies ist in Web3 besonders wichtig, da Transaktionen manchmal eine kurze Zeit benötigen, um in die Blockchain aufgenommen zu werden. Wenn es kein Feedback gibt, das sie zum Warten auffordert, sind sich die Benutzer unsicher, ob etwas passiert ist. + +**Tipps:** + +- Informieren Sie den Benutzer über Nachrichten, Benachrichtigungen und andere Warnungen. +- Kommunizieren Sie Wartezeiten klar und deutlich. +- Wenn eine Aktion länger als ein paar Sekunden dauert, beruhigen Sie den Benutzer mit einem Timer oder einer Animation, damit er das Gefühl hat, dass etwas passiert. +- Wenn ein Prozess aus mehreren Schritten besteht, zeigen Sie jeden Schritt an. + +**Beispiel:** +Wenn Sie jeden Schritt einer Transaktion anzeigen, wissen die Benutzer, wo sie sich im Prozess befinden. Geeignete Symbole informieren den Benutzer über den Status seiner Aktionen. + +![Information für den Benutzer über jeden Schritt beim Tausch von Tokens](./Image1.png) + +### 2. Sicherheit und Vertrauen sind fest verankert {#security-and-trust-are-backed-in} + +Sicherheit sollte Priorität haben, und dies sollte für den Benutzer hervorgehoben werden. +Die Menschen legen großen Wert auf ihre Daten. Sicherheit ist für Benutzer oft ein Hauptanliegen und sollte daher auf allen Ebenen des Designs berücksichtigt werden. Sie sollten immer versuchen, das Vertrauen Ihrer Benutzer zu gewinnen, aber die Art und Weise, wie Sie dies tun, kann in verschiedenen Apps unterschiedliche Dinge bedeuten. Es sollte kein nachträglicher Gedanke sein, sondern durchgehend bewusst gestaltet werden. Bauen Sie Vertrauen in der gesamten Benutzererfahrung auf, einschließlich der sozialen Kanäle und der Dokumentation sowie der endgültigen Benutzeroberfläche. Faktoren wie der Grad der Dezentralisierung, der Multi-Sig-Status des Treasury und ob das Team gedoxxt ist, beeinflussen das Vertrauen der Benutzer. + +**Tipps:** + +- Listen Sie Ihre Audits mit Stolz auf +- Holen Sie sich mehrere Audits +- Bewerben Sie alle von Ihnen entworfenen Sicherheitsfunktionen +- Heben Sie mögliche Risiken hervor, einschließlich der zugrunde liegenden Integrationen +- Kommunizieren Sie die Komplexität von Strategien +- Berücksichtigen Sie Probleme, die nicht die Benutzeroberfläche betreffen und die Sicherheitswahrnehmung Ihrer Benutzer beeinträchtigen könnten + +**Beispiel:** +Fügen Sie Ihre Audits in der Fußzeile in einer gut sichtbaren Größe ein. + +![Audits, auf die in der Fußzeile der Website verwiesen wird](./Image2.png) + +### 3. Die wichtigsten Informationen sind offensichtlich {#the-most-important-info-is-obvious} + +Zeigen Sie bei komplexen Systemen nur die relevantesten Daten an. Bestimmen Sie, was am wichtigsten ist, und priorisieren Sie dessen Anzeige. +Zu viele Informationen sind überwältigend, und Benutzer orientieren sich bei Entscheidungen in der Regel an einer einzigen Information. In DeFi sind dies wahrscheinlich der APR bei Rendite-Apps und der LTV bei Kredit-Apps. + +**Tipps:** + +- Benutzerforschung wird die wichtigste Metrik aufdecken +- Machen Sie die wichtigsten Informationen groß und die anderen Details klein und unauffällig +- Menschen lesen nicht, sie scannen; stellen Sie sicher, dass Ihr Design scanbar ist + +**Beispiel:** Große, vollfarbige Tokens sind beim Scannen leicht zu finden. Der APR ist groß und in einer Akzentfarbe hervorgehoben. + +![Der Token und der APR sind leicht zu finden](./Image3.png) + +### 4. Klare Terminologie {#clear-terminology} + +Die Terminologie sollte verständlich und angemessen sein. +Technischer Jargon kann eine große Hürde sein, da er die Konstruktion eines völlig neuen mentalen Modells erfordert. Benutzer können das Design nicht mit Wörtern, Phrasen und Konzepten in Beziehung setzen, die sie bereits kennen. Alles wirkt verwirrend und ungewohnt, und es gibt eine steile Lernkurve, bevor sie überhaupt versuchen können, es zu benutzen. Ein Benutzer könnte sich DeFi nähern, um etwas Geld zu sparen, und was er findet, ist: Mining, Farming, Staking, Emissionen, Bribes, Vaults, Lockers, veTokens, Vesting, Epochen, dezentrale Algorithmen, protokolleigene Liquidität… +Versuchen Sie, einfache Begriffe zu verwenden, die von der breitmöglichsten Gruppe von Menschen verstanden werden. Erfinden Sie keine brandneuen Begriffe nur für Ihr Projekt. + +**Tipps:** + +- Verwenden Sie eine einfache und konsistente Terminologie +- Verwenden Sie so weit wie möglich die bestehende Sprache +- Erfinden Sie keine eigenen Begriffe +- Folgen Sie den Konventionen, sobald sie erscheinen +- Klären Sie die Benutzer so gut wie möglich auf + +**Beispiel:** +„Ihre Belohnungen“ ist ein weithin verstandener, neutraler Begriff; kein neues Wort, das für dieses Projekt erfunden wurde. Die Belohnungen werden in USD angegeben, um den mentalen Modellen der realen Welt zu entsprechen, auch wenn die Belohnungen selbst in einem anderen Token sind. + +![Token-Belohnungen, angezeigt in U.S. Dollar](./Image4.png) + +### 5. Aktionen sind so kurz wie möglich {#actions-are-as-short-as-possible} + +Beschleunigen Sie die Interaktionen des Benutzers durch die Gruppierung von Teilaktionen. +Dies kann sowohl auf der Smart-Contract-Ebene als auch auf der Benutzeroberfläche erfolgen. Der Benutzer sollte nicht von einem Teil des Systems zu einem anderen wechseln – oder das System ganz verlassen – müssen, um eine übliche Aktion abzuschließen. + +**Tipps:** + +- Kombinieren Sie „Approve“ nach Möglichkeit mit anderen Aktionen +- Bündeln Sie die Signierschritte so nah wie möglich + +**Beispiel:** Die Kombination von „Liquidität hinzufügen“ und „Staken“ ist ein einfaches Beispiel für einen Beschleuniger, der einem Benutzer sowohl Zeit als auch Gas spart. + +![Modal, das einen Schalter zur Kombination der Einzahlungs- und Staking-Aktionen anzeigt](./Image5.png) + +### 6. Netzwerkverbindungen sind sichtbar und flexibel {#network-connections-are-visible-and-flexible} + +Informieren Sie den Benutzer darüber, mit welchem Netzwerk er verbunden ist, und stellen Sie klare Verknüpfungen zum Wechseln des Netzwerks bereit. +Dies ist bei Multichain-Apps besonders wichtig. Die Hauptfunktionen der App sollten auch dann sichtbar sein, wenn die Verbindung getrennt ist oder eine Verbindung zu einem nicht unterstützten Netzwerk besteht. + +**Tipps:** + +- Zeigen Sie so viel wie möglich von der App an, während die Verbindung getrennt ist +- Zeigen Sie an, mit welchem Netzwerk der Benutzer aktuell verbunden ist +- Zwingen Sie den Benutzer nicht, zur Wallet zu gehen, um das Netzwerk zu wechseln +- Wenn die App vom Benutzer einen Netzwerkwechsel verlangt, fordern Sie die Aktion vom Haupt-Call-to-Action aus an +- Wenn die App Märkte oder Vaults für mehrere Netzwerke enthält, geben Sie deutlich an, welches Set sich der Benutzer gerade ansieht + +**Beispiel:** Zeigen Sie dem Benutzer in der App-Leiste an, mit welchem Netzwerk er verbunden ist, und ermöglichen Sie ihm, es zu ändern. + +![Dropdown-Schaltfläche, die das verbundene Netzwerk anzeigt](./Image6.png) + +### 7. Steuerung über die App, nicht über die Wallet {#control-from-the-app-not-the-wallet} + +Die Benutzeroberfläche sollte dem Benutzer alles mitteilen, was er wissen muss, und ihm die Kontrolle über alles geben, was er tun muss. +In Web3 gibt es Aktionen, die Sie in der Benutzeroberfläche durchführen, und Aktionen, die Sie in der Wallet durchführen. Im Allgemeinen leiten Sie eine Aktion in der Benutzeroberfläche ein und bestätigen sie dann in der Wallet. Benutzer können sich unwohl fühlen, wenn diese beiden Stränge nicht sorgfältig integriert sind. + +**Tipps:** + +- Kommunizieren Sie den Systemstatus über Feedback in der Benutzeroberfläche +- Führen Sie eine Aufzeichnung ihres Verlaufs +- Stellen Sie Links zu Block-Explorern für alte Transaktionen bereit +- Stellen Sie Verknüpfungen zum Wechseln von Netzwerken bereit. + +**Beispiel:** Ein dezenter Container zeigt dem Benutzer, welche relevanten Tokens er in seiner Wallet hat, und der Haupt-CTA bietet eine Verknüpfung zum Wechseln des Netzwerks. + +![Der Haupt-CTA fordert den Benutzer zum Netzwerkwechsel auf](./Image7.png) diff --git a/public/content/translations/de/developers/docs/design-and-ux/index.md b/public/content/translations/de/developers/docs/design-and-ux/index.md new file mode 100644 index 00000000000..ff950149d1a --- /dev/null +++ b/public/content/translations/de/developers/docs/design-and-ux/index.md @@ -0,0 +1,86 @@ +--- +title: Design und UX in Web3 +description: Einführung in UX-Design und -Forschung im Web3-Bereich und Ethereum +lang: de +--- + +Sind Sie neu in der Entwicklung mit Ethereum? Dann sind Sie hier an der richtigen Stelle. Die Ethereum-Community hat Ressourcen verfasst, um Sie in die Grundlagen des Web3-Designs und research einzuführen. Sie lernen Kernkonzepte kennen, die sich von anderen App-Designs, die Sie kennen, unterscheiden können. + +Benötigen Sie zunächst ein grundlegendes Verständnis von web3? Schauen Sie sich den [**Lern-Hub**](/learn/) an. + +## Beginnen Sie mit der Nutzerforschung {#start-with-user-research} + +Effektives Design geht über die Gestaltung visuell ansprechender Benutzeroberflächen hinaus. Es geht darum, ein tiefes Verständnis für die Bedürfnisse, Ziele und treibenden Faktoren des Benutzers zu erlangen. Daher empfehlen wir allen Designern dringend, einen Designprozess wie den [**Double-Diamond-Prozess**](https://en.wikipedia.org/wiki/Double_Diamond_\(design_process_model\)) zu übernehmen, um sicherzustellen, dass ihre Arbeit überlegt und zielgerichtet ist. + +- [Web3 braucht mehr UX-Forscher und -Designer](https://blog.akasha.org/akasha-conversations-9-web3-needs-more-ux-researchers-and-designers) – Ein Überblick über die aktuelle Designreife +- [Eine einfache Anleitung zur UX-Forschung in Web3](https://uxplanet.org/a-complete-guide-to-ux-research-for-web-3-0-products-d6bead20ebb1) – Einfache Anleitung zur Durchführung von Forschung +- [Wie man UX-Entscheidungen in Web3 angeht](https://archive.devcon.org/archive/watch/6/data-empathy-how-to-approach-ux-decisions-in-web3/) – Ein kurzer Überblick über quantitative und qualitative Forschung und die Unterschiede zwischen beiden (Video, 6 Min.) +- [UX-Forscher in Web3 sein](https://medium.com/@georgia.rakusen/what-its-like-being-a-user-researcher-in-web3-6a4bcc096849) – Eine persönliche Sichtweise darauf, wie es ist, ein UX-Forscher in Web3 zu sein + +## Forschungsstudien in Web3 {#research-in-web3} + +Dies ist eine umfassende Liste von Studien zu user research, die in Web3 durchgeführt wurden. Sie helfen bei Design- und Produktentscheidungen oder können als Inspiration für die Durchführung eigener Studien dienen. + +| Schwerpunktbereich | Name | +| :------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Krypto-Onboarding | [The Reown Pulse 2024: Crypto Consumer Sentiment & Usage](https://reown.com/blog/unveiling-walletconnects-consumer-crypto-report) | +| Krypto-Onboarding | [CRADL: UX in Kryptowährung](https://docs.google.com/presentation/d/1s2OPSH5sMJzxRYaJSSRTe8W2iIoZx0PseIV-WeZWD1s/edit?usp=sharing) | +| Krypto-Onboarding | [CRADL: Onboarding zur Kryptowährung](https://docs.google.com/presentation/d/1R9nFuzA-R6SxaGCKhoMbE4Vxe0JxQSTiHXind3LVq_w/edit?usp=sharing) | +| Krypto-Onboarding | [Bitcoin-UX-Bericht](https://github.com/patestevao/BitcoinUX-report/blob/master/report.md) | +| Krypto-Onboarding | [ConSensys: The State of Web3 perception around the world 2023](https://consensys.io/insight-report/web3-and-crypto-global-survey-2023) | +| Krypto-Onboarding | [NEAR: Accelerating the journey towards adoption](https://drive.google.com/file/d/1VuaQP4QSaQxR5ddQKTMGI0b0rWdP7uGn/view) | +| Staking | [OpenUX: Rocket Pool Node Operator UX](https://storage.googleapis.com/rocketpool/RocketPool-NodeOperator-UX-Report-Jan-2024.pdf) | +| Staking | [Staking: Key trends, takeaways, and predictions - Eth Staker](https://lookerstudio.google.com/u/0/reporting/cafcee00-e1af-4148-bae8-442a88ac75fa/page/p_ja2srdhh2c?s=hmbTWDh9hJo) | +| Staking | [Multi-App-Staking](https://github.com/threshold-network/UX-User-Research/blob/main/Multi-App%20Staking%20\(MAS\)/iterative-user-study/MAS%20Iterative%20User%20Study.pdf) | +| DAO | [2022 DAO Research Update: What do DAO Builders Need?](https://blog.aragon.org/2022-dao-research-update/) | +| DeFi | [Absicherungs-Pools](https://github.com/threshold-network/UX-User-Research/tree/main/Keep%20Coverage%20Pool) | +| DeFi | [ConSensys: DeFi User Research Report 2022](https://cdn2.hubspot.net/hubfs/4795067/ConsenSys%20Codefi-Defi%20User%20ResearchReport.pdf) | +| Metaverse | [Metaverse: Nutzerforschungsbericht](https://www.politico.com/f/?id=00000187-7685-d820-a7e7-7e85d1420000) | +| Metaverse | [Going on Safari: Researching Users in the Metaverse](https://archive.devcon.org/archive/watch/6/going-on-safari-researching-users-in-the-metaverse/?tab=YouTube) (Video, 27 Min.) | + +## Design für Web3 {#design-for-web3} + +- [Web3 UX-Design-Handbuch](https://web3ux.design/) – Praktische Anleitung zum Entwerfen von Web3-Apps +- [Web3-Designprinzipien](https://medium.com/@lyricalpolymath/web3-design-principles-f21db2f240c1) – Ein Framework mit UX-Regeln für Blockchain-basierte Dapps +- [Blockchain-Designprinzipien](https://medium.com/design-ibm/blockchain-design-principles-599c5c067b6e) – Erkenntnisse des Blockchain-Designteams bei IBM +- [Neueux.com](https://neueux.com/apps) – UI-Bibliothek mit Nutzerflüssen mit vielfältigen Filteroptionen +- [Web3's Usability Crisis: What You NEED to Know!](https://www.youtube.com/watch?v=oBSXT_6YDzg) – Eine Podiumsdiskussion über die Fallstricke bei der entwicklerfokussierten Projekterstellung (Video, 34 Min.) + +## Erste Schritte {#getting-started} + +- [Heuristiken für Web3](/developers/docs/design-and-ux/heuristics-for-web3/) – 7 Heuristiken für das Web3-Interface-Design +- [DEX-Design Best Practices](/developers/docs/design-and-ux/dex-design-best-practice/) – Eine Anleitung zum Entwerfen dezentraler Börsen + +## Web3-Design-Fallstudien {#design-case-studies} + +- [Deep Work Studio](https://www.deepwork.studio/case-studies) +- [Ein NFT auf OpenSea verkaufen](https://builtformars.com/case-studies/opensea) +- [Wallet-UX-Analyse: Wie sich Wallets ändern müssen](https://www.youtube.com/watch?v=oTpuxYj8JWI&ab_channel=ETHDenver) (Video, 20 Min.) + +## Design-Bounties {#bounties} + +- [Dework](https://app.dework.xyz/bounties) +- [Buildbox-Hackathons](https://app.buidlbox.io/) +- [ETHGlobal-Hackathons](https://ethglobal.com/) + +## Design-DAOs und -Communitys {#design-daos-and-communities} + +Engagieren Sie sich in beruflich orientierten Community-Organisationen oder treten Sie Designgruppen bei, um mit anderen Mitgliedern über Design- und Forschungsthemen und -trends zu diskutieren. + +- [Vectordao.com](https://vectordao.com/) +- [Deepwork.studio](https://www.deepwork.studio/) +- [We3.co](https://we3.co/) +- [Openux.xyz](https://openux.xyz/) + +## Designsysteme und andere Design-Ressourcen {#design-systems-and-resources} + +- [Optimism Design](https://www.figma.com/@optimism) (Figma) +- [Ethereum.org Designsystem](https://www.figma.com/@ethdotorg) (Figma) +- [Finity, ein Designsystem von Polygon](https://www.figma.com/community/file/1073921725197233598/finity-design-system) (Figma) +- [Kleros Designsystem](https://www.figma.com/community/file/999852250110186964/kleros-design-system) (Figma) +- [Safe Designsystem](https://www.figma.com/community/file/1337417127407098506/safe-design-system) (Figma) +- [ENS Designsystem](https://thorin.ens.domains/) +- [Mirror Designsystem](https://degen-xyz.vercel.app/) + +**Auf dieser Seite aufgeführte Artikel und Projekte sind keine offiziellen Empfehlungen** und dienen nur zu Informationszwecken. +Wir fügen Links zu dieser Seite auf der Grundlage von Kriterien in unserer [Auflistungsrichtlinie](/contributing/design/adding-design-resources) hinzu. Wenn Sie möchten, dass wir ein Projekt/einen Artikel hinzufügen, bearbeiten Sie diese Seite auf [GitHub](https://github.com/ethereum/ethereum-org-website/blob/dev/public/content/developers/docs/design-and-ux/index.md). diff --git a/public/content/translations/de/developers/docs/development-networks/index.md b/public/content/translations/de/developers/docs/development-networks/index.md index a651178cd46..ef9ea6ac8cc 100644 --- a/public/content/translations/de/developers/docs/development-networks/index.md +++ b/public/content/translations/de/developers/docs/development-networks/index.md @@ -18,39 +18,37 @@ Entwicklungsnetzwerke sind im Wesentlichen Ethereum-Kunden (Implementierungen vo **Warum nicht einfach einen Ethereum-Knoten lokal betreiben?** -Sie _könnten_ [einen Knoten betreiben](/developers/docs/nodes-and-clients/#running-your-own-node), da jedoch Entwicklungsnetzwerke speziell für die Entwicklung erstellt werden, sind sie oft mit praktischen Funktionen ausgestattet wie: +Sie _könnten_ einen [Node](/developers/docs/nodes-and-clients/#running-your-own-node) betreiben, aber da Entwicklungsnetzwerke speziell für die Entwicklung konzipiert sind, sind sie oft mit praktischen Funktionen ausgestattet, wie z. B.: -- Seeding deterministisch mit Daten für die lokale Blockchain durchführen (z. B. Konten mit ETH-Guthaben) +- Deterministisches Seeding Ihrer lokalen Blockchain mit Daten (z. B. Konten mit ETH-Guthaben) - Sofortige Erzeugung von Blöcken mit jeder empfangenen Transaktion, in der richtigen Reihenfolge und ohne Verzögerung - Verbesserte Debugging- und Protokollierungsfunktionen ## Verfügbare Tools {#available-projects} -**Hinweis**: Die meisten [Entwicklerframeworks](/developers/docs/frameworks/) enthalten ein integriertes Entwicklungsnetzwerk. Wir empfehlen Ihnen, mit einem Framework für die Einrichtung [Ihrer lokalen Entwicklungsumgebung](/developers/local-environment/) zu beginnen. +**Hinweis**: Die meisten [Entwicklungsframeworks](/developers/docs/frameworks/) enthalten ein integriertes Entwicklungsnetzwerk. Wir empfehlen Ihnen, mit einem Framework zu beginnen, um Ihre [lokale Entwicklungsumgebung einzurichten](/developers/local-environment/). -### Hardhat Network {#hardhat-network} +### Hardhat-Netzwerk {#hardhat-network} Ein lokales Ethereum-Netzwerk, das für die Entwicklung konzipiert ist. Die können darin Ihre Contracts bereitstellen, Tests durchführen und Ihren Code debuggen. Hardhat Network beinhaltet Hardhat, eine Ethereum-Entwicklungsumgebung für Profis. - [Website](https://hardhat.org/) -- [GitHub](https://github.com/nomiclabs/hardhat) +- [GitHub](https://github.com/NomicFoundation/hardhat) ### Lokale Beacon Chains {#local-beacon-chains} Einige Konsensclients verfügen über integrierte Tools, um lokale Beacon Chains zu Testzwecken zu erstellen. Anleitungen für Lighthouse, Nimbus und Lodestar sind verfügbar: -- [Lokales Testnetz unter Verwendung von Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) -- [Lokales Testnetz unter Verwendung von Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) +- [Lokales Testnet mit Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) +- [Lokales Testnet mit Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) -### Öffentliche Ethereum Test-Chains {#public-beacon-testchains} +### Öffentliche Ethereum-Testchains {#public-beacon-testchains} -Es gibt auch zwei öffentliche Testimplementierungen von Ethereum: Sepolia und Hoodi. Sepolia ist das empfohlene Standard-Testnetz für die Anwendungsentwicklung, mit einem geschlossenen Validatorsatz für schnelle Synchronisation. Hoodi ist ein Testnetz für Validierung und Staking, das einen offenen Validatorsatz verwendet und es potenziell jedem ermöglicht, zu validieren. +Es gibt auch zwei gewartete öffentliche Testimplementierungen von Ethereum: Sepolia und Hoodi. Die empfohlene Testnet-Version mit Langzeitunterstützung ist **Hoodi**, auf der jeder frei validieren kann. Sepolia nutzt einen Validatoren-Satz mit Genehmigung, was bedeutet, dass es auf diesem Testnet keinen allgemeinen Zugang für neue Validatoren gibt. -- [Hoodi Staking Launchpad](https://hoodi.launchpad.ethereum.org/en/) -- [Sepolia Website](https://sepolia.dev/) -- [Hoodi Website](https://hoodi.ethpandaops.io/) +- [Hoodi Staking Launchpad](https://hoodi.launchpad.ethereum.org/) ### Kurtosis Ethereum-Paket {#kurtosis} @@ -58,12 +56,12 @@ Kurtosis ist ein Build-System für Multi-Container-Testumgebungen, das es Entwic Das Ethereum-Kurtosis-Paket kann verwendet werden, um schnell ein parameterisierbares, hochskalierbares und privates Ethereum-Testnetz über Docker oder Kubernetes einzurichten. Das Paket unterstützt alle wichtigen Clients der Ausführungs- und Konsensebene. Kurtosis verwaltet gekonnt alle lokalen Portzuweisungen und Dienstverbindungen für ein repräsentatives Netzwerk, das in Validierungs- und Test-Workflows im Zusammenhang mit der Ethereum-Kerninfrastruktur verwendet wird. -- [Ethereum Netzwerk-Paket](https://github.com/kurtosis-tech/ethereum-package) +- [Ethereum-Netzwerkpaket](https://github.com/kurtosis-tech/ethereum-package) - [Website](https://www.kurtosis.com/) - [GitHub](https://github.com/kurtosis-tech/kurtosis) - [Dokumentation](https://docs.kurtosis.com/) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} _Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/ethereum-stack/index.md b/public/content/translations/de/developers/docs/ethereum-stack/index.md index 2d5c5a715a1..b40a1e9533f 100644 --- a/public/content/translations/de/developers/docs/ethereum-stack/index.md +++ b/public/content/translations/de/developers/docs/ethereum-stack/index.md @@ -8,13 +8,13 @@ Wie bei jedem Software-Stack variiert der komplette "Ethereum-Stack" zielabhäng Es gibt jedoch zentrale Komponenten von Ethereum, die dabei helfen, ein gedankliches Modell für die Interaktion von Softwareanwendungen mit der Ethereum-Blockchain bereitzustellen. Wenn Sie die Ebenen des Stacks verstehen, ist es einfacher, die unterschiedlichen Möglichkeiten für die Integration von Ethereum in Softwareprojekte zu verstehen. -## Ebene 1: Ethereum-Virtual Machine {#ethereum-virtual-machine} +## Ebene 1: Ethereum Virtual Machine {#ethereum-virtual-machine} -Die [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) ist die Laufzeitumgebung für Smart Contracts in Ethereum. Alle Smart Contracts und Statusänderungen auf der Ethereum-Blockchain erfolgen über [Transaktionen](/developers/docs/transactions/). Die EVM übernimmt die gesamte Transaktionsabwicklung im Ethereum-Netzwerk. +Die [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) ist die Laufzeitumgebung für Smart Contracts auf Ethereum. Alle Smart Contracts und Zustandsänderungen auf der Ethereum-Blockchain werden durch [Transaktionen](/developers/docs/transactions/) ausgeführt. Die EVM übernimmt die gesamte Transaktionsabwicklung im Ethereum-Netzwerk. -Wie bei jeder virtuellen Maschine erzeugt die EVM einen Abstraktionsgrad zwischen dem ausführenden Code und der ausführenden Maschine (einem Ethereum-Node). Derzeit läuft die EVM auf Tausenden von Knoten auf der ganzen Welt. +Wie bei jeder virtuellen Maschine erzeugt die EVM einen Abstraktionsgrad zwischen dem ausführenden Code und der ausführenden Maschine (einem Ethereum-Node). Derzeit läuft die EVM auf Tausenden von Knoten, die weltweit verteilt sind. -Unter der Haube verwendet die EVM eine Reihe von Opcode-Anweisungen, um bestimmte Aufgaben auszuführen. Diese (140 einmaligen) Opcodes erlauben es der EVM [Turing-komplett](https://en.wikipedia.org/wiki/Turing_completeness) zu sein, was bedeutet, dass die EVM in der Lage ist, fast alles zu berechnen, wenn man genügend Ressourcen hat. +Unter der Haube verwendet die EVM eine Reihe von Opcode-Anweisungen, um bestimmte Aufgaben auszuführen. Diese (140 einzigartigen) Opcodes ermöglichen es der EVM, [Turing-vollständig](https://en.wikipedia.org/wiki/Turing_completeness) zu sein, was bedeutet, dass die EVM bei ausreichenden Ressourcen in der Lage ist, so gut wie alles zu berechnen. Als dApp-Entwickler müssen Sie über die EVM nicht mehr wissen, als dass sie existiert und sie alle Anwendungen auf Ethereum zuverlässig ohne Ausfallzeiten betreibt. @@ -22,9 +22,9 @@ Als dApp-Entwickler müssen Sie über die EVM nicht mehr wissen, als dass sie ex [Smart Contracts](/developers/docs/smart-contracts/) sind die ausführbaren Programme, die auf der Ethereum-Blockchain laufen. -Smart Contracts werden unter Verwendung bestimmter [Programmiersprachen](/developers/docs/smart-contracts/languages/) geschrieben, die in EVM Bytecode kompiliert werden (Low-Level-Maschinenbefehle, Opcodes genannt). +Smart Contracts werden in spezifischen [Programmiersprachen](/developers/docs/smart-contracts/languages/) geschrieben, die zu EVM-Bytecode (Maschinenbefehle auf niedriger Ebene, sogenannte Opcodes) kompiliert werden. -Smart Contracts dienen nicht nur als Open-Source-Bibliotheken, sondern sind im Wesentlichen offene API-Dienste, die rund um die Uhr laufen und nicht aufgehoben werden können. Smart Contracts stellen öffentliche Funktionen zur Verfügung, mit denen Nutzer und Anwendungen ([dApps](/developers/docs/dapps/)) interagieren können, ohne dass eine Berechtigung dafür erforderlich ist. Jede Anwendung kann sich in die bereitgestellten Smart Contracts integrieren, um Funktionen zusammenzustellen, wie z. B. das Hinzufügen von [Daten-Feeds](/developers/docs/oracles/) oder die Unterstützung von Token-Swaps. Zudem kann jeder neue Smart Contracts für Ethereum bereitstellen, um maßgeschneiderte Funktionen für die Anforderungen der eigenen Anwendung zu schaffen. +Smart Contracts dienen nicht nur als Open-Source-Bibliotheken, sondern sind im Wesentlichen offene API-Dienste, die rund um die Uhr laufen und nicht aufgehoben werden können. Smart Contracts stellen öffentliche Funktionen zur Verfügung, mit denen Benutzer und Anwendungen ([Dapps](/developers/docs/dapps/)) ohne Genehmigung interagieren können. Jede Anwendung kann in bereitgestellte Smart Contracts integriert werden, um Funktionalitäten zusammenzustellen, wie z. B. das Hinzufügen von [Daten-Feeds](/developers/docs/oracles/) oder die Unterstützung von Token-Swaps. Zudem kann jeder neue Smart Contracts für Ethereum bereitstellen, um maßgeschneiderte Funktionen für die Anforderungen der eigenen Anwendung zu schaffen. Als dApp-Entwickler müssen Sie Smart Contracts nur dann schreiben, wenn Sie benutzerdefinierte Funktionen zur Ethereum-Blockchain hinzufügen möchten. Sie werden feststellen, dass sich die meisten oder alle Bedürfnisse Ihres Projekts durch die Integration von bestehenden Smart Contracts erfüllen lassen, zum Beispiel wenn Sie Zahlungen in Stablecoins unterstützen oder den dezentralen Austausch von Tokens ermöglichen möchten. @@ -40,9 +40,9 @@ Indem Sie Ihre Anwendung mit einem Ethereum-Node verbinden (über die [JSON-RPC- Viele komfortable Bibliotheken (die von der Open-Source-Community von Ethereum erstellt und verwaltet werden) ermöglichen es Ihren Anwendern, sich mit der Ethereum-Blockchain zu verbinden und mit ihr zu kommunizieren. -Wenn Ihre benutzerseitige Anwendung eine Web-App ist, können Sie auch eine entsprechende [JavaScript-API](/developers/docs/apis/javascript/) direkt in Ihr Frontend `installieren`. Oder Sie verwenden eine [Python](/developers/docs/programming-languages/python/)- oder [Java](/developers/docs/programming-languages/java/)-API, um diese Funktionalität serverseitig zu implementieren. +Wenn Ihre Endbenutzer-Anwendung eine Web-App ist, können Sie eine [JavaScript-API](/developers/docs/apis/javascript/) mit `npm install` direkt in Ihr Frontend installieren. Oder Sie entscheiden sich vielleicht dafür, diese Funktionalität serverseitig zu implementieren und eine API für [Python](/developers/docs/programming-languages/python/) oder [Java](/developers/docs/programming-languages/java/) zu verwenden. -Obwohl diese APIs kein notwendiger Bestandteil des Stacks sind, gestalten sie die direkte Interaktion mit einem Ethereum-Node wesentlich einfacher. Zudem bieten sie Dienstprogrammfunktionen (z. B. Umwandlung von ETH zu GWei), so dass Sie als Entwickler weniger Zeit damit verbringen, Probleme mit Ethereum-Clients zu lösen, und sich auf die konkreten Funktionen Ihrer Anwendung konzentrieren können. +Obwohl diese APIs kein notwendiger Bestandteil des Stacks sind, gestalten sie die direkte Interaktion mit einem Ethereum-Node wesentlich einfacher. Sie bieten auch Hilfsfunktionen (z. B. die Umrechnung von ETH in Gwei), sodass Sie als Entwickler weniger Zeit mit den Feinheiten von Ethereum-Clients verbringen und sich mehr auf die anwendungsspezifische Funktionalität konzentrieren können. ## Ebene 5: Endbenutzeranwendungen {#end-user-applications} @@ -52,10 +52,10 @@ Die Art und Weise, wie Sie diese Benutzeroberflächen entwickeln, bleibt im Wese ## Bereit, Ihren Stack zu wählen? {#ready-to-choose-your-stack} -Machen Sie sich mit unserem Leitfaden vertraut, um [eine lokale Entwicklungsumgebung für Ihre Ethereum-Anwendung aufzusetzen](/developers/local-environment/). +Lesen Sie unseren Leitfaden zum [Einrichten einer lokalen Entwicklungsumgebung](/developers/local-environment/) für Ihre Ethereum-Anwendung. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Die Architektur einer Web 3.0-Anwendung](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) – _Preethi Kasireddy_ +- [Die Architektur einer Web 3.0-Anwendung](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ -_Kennen Sie eine Community Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/evm/index.md b/public/content/translations/de/developers/docs/evm/index.md index bb357fd24ff..e9dec99b553 100644 --- a/public/content/translations/de/developers/docs/evm/index.md +++ b/public/content/translations/de/developers/docs/evm/index.md @@ -1,77 +1,87 @@ --- -title: Ethereum Virtual Machine (EVM) +title: Ethereum Virtuelle Maschine (EVM) description: Eine Einführung in die virtuelle Maschine von Ethereum und wie sie sich auf Zustand, Transaktionen und Smart Contracts bezieht. lang: de --- -Die Ethereum Virtual Machine (EVM) ist eine dezentrale virtuelle Umgebung, die Code konsistent und sicher auf allen Ethereum-Knoten ausführt. Knoten führen die EVM aus, um Smart Contracts auszuführen, wobei sie "[Gas](/gas/)" verwenden, um den für [Operationen](/developers/docs/evm/opcodes/) erforderlichen Rechenaufwand zu messen, wodurch eine effiziente Ressourcenzuweisung und Netzwerksicherheit gewährleistet werden. +Die Ethereum Virtual Machine (EVM) ist eine dezentrale virtuelle Umgebung, die Code konsistent und sicher auf allen Ethereum-Knoten ausführt. Knoten führen die EVM aus, um Smart Contracts auszuführen, wobei sie "[Gas](/developers/docs/gas/)" verwenden, um den für [Operationen](/developers/docs/evm/opcodes/) erforderlichen Rechenaufwand zu messen, wodurch eine effiziente Ressourcenzuweisung und Netzwerksicherheit gewährleistet werden. ## Voraussetzungen {#prerequisites} -Um den EVM zu verstehen, sind ein paar grundlegende Kenntnisse der gängigen Informatikterminologie wie [Bytes](https://wikipedia.org/wiki/Byte), [Speicher](https://wikipedia.org/wiki/Computer_memory) und [Stack](https://wikipedia.org/wiki/Stack_(abstract_data_type)) notwendig. Es wäre auch hilfreich, wenn Sie sich mit Kryptografie-/Blockchain-Konzepten wie [Hash-Funktionen](https://wikipedia.org/wiki/Cryptographic_hash_function) und dem [Merkle-Baum](https://wikipedia.org/wiki/Merkle_tree) auskennen. +Einige grundlegende Kenntnisse der gängigen Terminologie der Informatik wie [Bytes](https://wikipedia.org/wiki/Byte), [Speicher](https://wikipedia.org/wiki/Computer_memory) und ein [Stack](https://wikipedia.org/wiki/Stack_\(abstract_data_type\)) sind notwendig, um die EVM zu verstehen. Es wäre auch hilfreich, mit Kryptographie-/Blockchain-Konzepten wie [Hash-Funktionen](https://wikipedia.org/wiki/Cryptographic_hash_function) und dem [Merkle-Baum](https://wikipedia.org/wiki/Merkle_tree) vertraut zu sein. -## Vom Ledger zur Zustandsmaschine {#from-ledger-to-state-machine} +## Vom Hauptbuch zur Zustandsmaschine {#from-ledger-to-state-machine} Die Analogie eines 'verteilten Schalters' wird oft verwendet, um Blockchains wie Bitcoin zu beschreiben, die eine dezentrale Währung mit grundlegenden Tools der Kryptographie ermöglichen. Der Ledger führt eine Aufzeichnung von Aktivitäten, die sich an eine Reihe von Regeln halten müssen, die wiederum bestimmen, welche Aktionen erfolgen bzw. nicht erfolgen können, um den Ledger zu verändern. Zum Beispiel kann eine Bitcoin-Adresse nicht mehr Bitcoin ausgeben, als sie zuvor erhalten hat. Diese Regeln untermauern alle Transaktionen auf Bitcoin und vielen anderen Blockchains. -Während Ethereum seine eigene native Kryptowährung (Ether) hat, die fast genau den gleichen intuitiven Regeln folgt, ermöglicht es auch eine wesentlich leistungsfähigere Funktion: [Smart Contracts](/developers/docs/smart-contracts/). Für diese komplexere Funktion ist eine ausgeklügeltere Analogie erforderlich. Anstelle eines verteilten Ledgers ist Ethereum eine verteilte [Zustandsmaschine](https://wikipedia.org/wiki/Finite-state_machine). Ethereums Zustand ist eine große Datenstruktur, die nicht nur alle Konten und Kontostände enthält, sondern einen _Maschinenzustand_, der nach einer vordefinierten Reihe von Regeln von Block zu Block wechselt und beliebigen Maschinencode ausführen kann. Die spezifischen Regeln für das Ändern des Zustands von Block zu Block werden vom EVM definiert. +Während Ethereum seine eigene native Kryptowährung (Ether) hat, die fast genau den gleichen intuitiven Regeln folgt, ermöglicht es auch eine viel mächtigere Funktion: [Smart Contracts](/developers/docs/smart-contracts/). Für diese komplexere Funktion ist eine ausgeklügeltere Analogie erforderlich. Anstelle eines verteilten Hauptbuchs ist Ethereum eine verteilte [Zustandsmaschine](https://wikipedia.org/wiki/Finite-state_machine). Der Zustand von Ethereum ist eine große Datenstruktur, die nicht nur alle Konten und Guthaben enthält, sondern auch einen _Maschinenzustand_, der sich von Block zu Block nach einem vordefinierten Satz von Regeln ändern kann und der beliebigen Maschinencode ausführen kann. Die spezifischen Regeln für das Ändern des Zustands von Block zu Block werden vom EVM definiert. -![Ein Diagramm, das die Funktionsweise eines Kontos zeigt](./evm.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Ein Diagramm, das den Aufbau der EVM zeigt](./evm.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -## Ethereum-Zustandsübergangsfunktion {#the-ethereum-state-transition-function} +## Die Ethereum-Zustandsübergangsfunktion {#the-ethereum-state-transition-function} -Die EVM verhält sich wie eine mathematische Funktion: Mit einer Eingabe, erzeugt sie eine deterministische Ausgabe. Folglich ist es sehr hilfreich, Ethereum formaler als eine **Zustandsübergangsfunktion** enthaltend zu beschreiben: +Die EVM verhält sich wie eine mathematische Funktion: Mit einer Eingabe, erzeugt sie eine deterministische Ausgabe. Daher ist es sehr hilfreich, Ethereum formeller als etwas zu beschreiben, das über eine **Zustandsübergangsfunktion** verfügt: ``` Y(S, T)= S' ``` -Bei einem alten gültigen Zustand `(S)` und einem neuen Satz gültiger Transaktionen `(T)` erzeugt die Ethereum-Statusübergangsfunktion `Y(S, T)` einen neuen gültigen Ausgabezustand `S'`. +Bei einem alten gültigen Zustand `(S)` und einem neuen Satz gültiger Transaktionen `(T)` erzeugt die Ethereum-Zustandsübergangsfunktion `Y(S, T)` einen neuen gültigen Ausgabezustand `S'` ### Zustand {#state} -Im Rahmen von Ethereum ist der Zustand eine enorme Datenstruktur, die [ modifizierte Merkle-Patricia-Trie](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/) genannt wird, die alle [Konten](/developers/docs/accounts/) durch Hashes verbunden hält und mit einem einzigen Stamm-Hash in der Blockchain abrufbar ist. +Im Kontext von Ethereum ist der Zustand eine riesige Datenstruktur, die als [modifizierter Merkle-Patricia-Trie](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/) bezeichnet wird. Sie hält alle [Konten](/developers/docs/accounts/), die durch Hashes verknüpft sind, und ist auf einen einzigen Root-Hash reduzierbar, der auf der Blockchain gespeichert ist. ### Transaktionen {#transactions} Transaktionen sind kryptographisch signierte Anweisungen von Konten. Es gibt zwei Arten von Transaktionen: solche, die zu Nachrichtenanrufen führen, und solche, die zur Erstellung von Verträgen führen. -Die Erstellung von Verträgen führt zur Erstellung eines neuen Vertragskontos mit zusammengestelltem [Smart-Contract](/developers/docs/smart-contracts/anatomy/)-Bytecode. Immer wenn ein anderes Konto einen Nachrichtenaufruf an diesen Vertrag stellt, führt es seinen Bytecode aus. +Die Vertragserstellung führt zur Erstellung eines neuen Vertragskontos, das kompilierten [Smart-Contract](/developers/docs/smart-contracts/anatomy/)-Bytecode enthält. Immer wenn ein anderes Konto einen Nachrichtenaufruf an diesen Vertrag stellt, führt es seinen Bytecode aus. ## EVM-Anweisungen {#evm-instructions} -Die EVM wird als [Stackmaschine](https://wikipedia.org/wiki/Stack_machine) mit einer Tiefe von 1024 Artikeln ausgeführt. Jedes Element ist ein 256-Bit-Wort, das für die einfache Verwendung mit 256-Bit-Kryptographie (wie Keccak-256-Hashes oder secp256k1-Signaturen) gewählt wurde. +Die EVM wird als [Stack-Maschine](https://wikipedia.org/wiki/Stack_machine) mit einer Tiefe von 1024 Elementen ausgeführt. Jedes Element ist ein 256-Bit-Wort, das für die einfache Verwendung mit 256-Bit-Kryptographie (wie Keccak-256-Hashes oder secp256k1-Signaturen) gewählt wurde. -Während der Ausführung behält die EVM einen transienten _-Speicher_ (als wortadressiertes Byte-Array), der zwischen Transaktionen nicht vorhanden ist. +Während der Ausführung unterhält die EVM einen transienten _Speicher_ (als wortadressiertes Byte-Array), der zwischen den Transaktionen nicht persistent ist. -Verträge enthalten jedoch eine Merkle-Patricia_-Speicher_-Trie (als wortadressierbares Wort-Array), mit der das betreffende Konto und ein Teil des globalen Zustands verbunden sind. +### Transienter Speicher -Kompilierter Smart-Contract-Bytecode wird als eine Anzahl von EVM-[Opcodes ausgeführt](/developers/docs/evm/opcodes), die standardmäßige Stackoperationen wie `XOR`, `UND`, `ADD`, `SUB` etc. ausführen. Die EVM implementiert auch eine Reihe von Blockchain-spezifischen Stack-Operationen, wie `ADDRESS`, `BALANCE`, `BLOCKHASH` usw. +Der transiente Speicher ist ein Schlüssel-Wert-Speicher pro Transaktion, auf den über die Opcodes `TSTORE` und `TLOAD` zugegriffen wird. Er bleibt über alle internen Aufrufe innerhalb derselben Transaktion bestehen, wird aber am Ende der Transaktion gelöscht. Im Gegensatz zum Speicher wird der transiente Speicher als Teil des EVM-Zustands und nicht als Teil des Ausführungsrahmens modelliert, aber er wird nicht in den globalen Zustand übernommen. Der transiente Speicher ermöglicht eine gas-effiziente, temporäre Zustandsfreigabe über interne Aufrufe während einer Transaktion hinweg. -![Ein Diagramm, das zeigt, wo Gas im EVM-Betrieb benötigt wird](../gas/gas.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +### Speicherort + +Verträge enthalten einen Merkle-Patricia-_Speicher_-Trie (als wortadressierbares Wort-Array), der mit dem betreffenden Konto verknüpft und Teil des globalen Zustands ist. Dieser persistente Speicher unterscheidet sich vom transienten Speicher, der nur für die Dauer einer einzigen Transaktion verfügbar ist und nicht Teil des persistenten Speicher-Tries des Kontos ist. + +### Operationscodes + +Kompilierter Smart-Contract-Bytecode wird als eine Reihe von EVM-[Opcodes](/developers/docs/evm/opcodes) ausgeführt, die Standard-Stack-Operationen wie `XOR`, `AND`, `ADD`, `SUB` usw. durchführen. Die EVM implementiert auch eine Reihe von Blockchain-spezifischen Stack-Operationen, wie z. B. `ADDRESS`, `BALANCE`, `BLOCKHASH`, usw. Das Opcode-Set enthält auch `TSTORE` und `TLOAD`, die den Zugriff auf den transienten Speicher ermöglichen. + +![Ein Diagramm, das zeigt, wo Gas für EVM-Operationen benötigt wird](../gas/gas.png) +_Diagramme adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ ## EVM-Implementierungen {#evm-implementations} Alle Implementierungen der EVM müssen sich nach der im Yellowpaper von Ethereum beschriebenen Spezifikation richten. -Während der siebenjährigen Geschichte von Ethereum hat die EVM mehrere Revisionen durchlaufen. Zudem gibt es mehrere Implementierungen der EVM in verschiedenen Programmiersprachen. +In der zehnjährigen Geschichte von Ethereum wurde die EVM mehrfach überarbeitet, und es gibt mehrere Implementierungen der EVM in verschiedenen Programmiersprachen. -[Ethereum-Ausführungs-Clients](/developers/docs/nodes-and-clients/#execution-clients) enthalten eine EVM-Implementierung. Zusätzlich gibt es mehrere eigenständige Implementierungen, einschließlich: +[Ethereum-Ausführungs-Clients](/developers/docs/nodes-and-clients/#execution-clients) beinhalten eine EVM-Implementierung. Zusätzlich gibt es mehrere eigenständige Implementierungen, einschließlich: - [Py-EVM](https://github.com/ethereum/py-evm) - _Python_ - [evmone](https://github.com/ethereum/evmone) - _C++_ - [ethereumjs-vm](https://github.com/ethereumjs/ethereumjs-vm) - _JavaScript_ -- [revm](https://github.com/bluealloy/revm) – _Rust_ +- [revm](https://github.com/bluealloy/revm) - _Rust_ -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Ethereum Yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf) - [Jellopaper aka KEVM: Semantics of EVM in K](https://jellopaper.org/) - [The Beigepaper](https://github.com/chronaeon/beigepaper) -- [Opcodes der virtuellen Maschine von Ethereum](https://www.ethervm.io/) -- [Betriebscodes für die Referenzdokumente für die virtuelle Ethereum-Maschine](https://www.evm.codes/) -- [Eine kurze Einführung in die Dokumentation von Solidity](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#index-6) -- [Ethereum meistern – Die Ethereum Virtual Machine](https://github.com/ethereumbook/ethereumbook/blob/openedition/13evm.asciidoc) +- [Opcodes der Ethereum Virtual Machine](https://www.ethervm.io/) +- [Interaktive Referenz der Opcodes der Ethereum Virtual Machine](https://www.evm.codes/) +- [Eine kurze Einführung in der Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#index-6) +- [Mastering Ethereum – Die Ethereum Virtual Machine](https://github.com/ethereumbook/ethereumbook/blob/openedition/13evm.asciidoc) ## Verwandte Themen {#related-topics} diff --git a/public/content/translations/de/developers/docs/evm/opcodes/index.md b/public/content/translations/de/developers/docs/evm/opcodes/index.md index 467c273bd2c..a59b15c4543 100644 --- a/public/content/translations/de/developers/docs/evm/opcodes/index.md +++ b/public/content/translations/de/developers/docs/evm/opcodes/index.md @@ -4,171 +4,174 @@ description: Eine Liste aller verfügbaren Opcodes für die virtuelle Ethereum-M lang: de --- -## Übersicht {#overview} +## Überblick {#overview} -Das ist eine aktualisierte Version der EVM-Referenzseite unter [wolflo/evm-opcodes](https://github.com/wolflo/evm-opcodes). Auch aus dem [Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf), dem [Jello Paper](https://jellopaper.org/evm/), und der [Geth](https://github.com/ethereum/go-ethereum)-Implementierung. Das soll eine zugängliche Referenz sein, aber sie ist nicht besonders streng. Wenn Sie sich sicher sein wollen, und Kenntnis von jedem Sonderfall haben benötigen, ist es ratsam, das Jello Paper oder eine Client-Implementierung zu verwenden. +Dies ist eine aktualisierte Version der EVM-Referenzseite auf [wolflo/evm-opcodes](https://github.com/wolflo/evm-opcodes). +Auch aus dem [Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf), dem [Jello Paper](https://jellopaper.org/evm/) und der [geth](https://github.com/ethereum/go-ethereum)-Implementierung entnommen. +Das soll eine zugängliche Referenz sein, aber sie ist nicht besonders streng. +Wenn Sie sich sicher sein wollen, und Kenntnis von jedem Sonderfall haben benötigen, ist es ratsam, das Jello Paper oder eine Client-Implementierung zu verwenden. -Suchen Sie nach einer interaktiven Referenz? Sehen Sie sich [evm.codes](https://www.evm.codes/) an. +Suchen Sie nach einer interaktiven Referenz? Besuchen Sie [evm.codes](https://www.evm.codes/). Für Operationen mit dynamischen Gaskosten, siehe [gas.md](https://github.com/wolflo/evm-opcodes/blob/main/gas.md). -💡 Kurztipp: Um ganze Zeilen einzusehen, verwenden Sie `[shift] + scroll`, um horizontal auf dem Desktop zu scrollen. +💡 Schneller Tipp: Um ganze Zeilen anzuzeigen, verwenden Sie `[shift] + scroll`, um auf dem Desktop horizontal zu scrollen. -| Stack | Name | Gas | Anfangs-Stack | Ergebnis-Stack | Speicher | Anmerkungen | -|:-----:|:-------------- |:-----------------------------------------------------------------------------------------------:|:------------------------------------------------ |:-------------------------------------------- |:----------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 00 | STOP | 0 | | | | halt execution | -| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256 addition modulo 2\*\*256 | -| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256 multiplication modulo 2\*\*256 | -| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256 addition modulo 2\*\*256 | -| 04 | DIV | 5 | `a, b` | `a // b` | | uint256 division | -| 05 | SDIV | 5 | `a, b` | `a // b` | | int256 division | -| 06 | MOD | 5 | `a, b` | `a % b` | | uint256 modulus | -| 07 | SMOD | 5 | `a, b` | `a % b` | | int256 modulus | -| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256 addition modulo N | -| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256 multiplication modulo N | -| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256 exponentiation modulo 2\*\*256 | -| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [sign extend](https://wikipedia.org/wiki/Sign_extension) `x` from `(b+1)` bytes to 32 bytes | -| 0C-0F | _invalid_ | | | | | | -| 10 | LT | 3 | `a, b` | `a < b` | | uint256 less-than | -| 11 | GT | 3 | `a, b` | `a > b` | | uint256 greater-than | -| 12 | SLT | 3 | `a, b` | `a < b` | | int256 less-than | -| 13 | SGT | 3 | `a, b` | `a > b` | | int256 greater-than | -| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256 equality | -| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 iszero | -| 16 | AND | 3 | `a, b` | `a && b` | | bitwise AND | -| 17 | OR | 3 | `a, b` | `a \|\| b` | | bitwise OR | -| 18 | XOR | 3 | `a, b` | `a ^ b` | | bitwise XOR | -| 19 | NOT | 3 | `a` | `~a` | | bitwise NOT | -| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | `i`th byte of (u)int256 `x`, from the left | -| 1B | SHL | 3 | `shift, val` | `val << shift` | | shift left | -| 1C | SHR | 3 | `shift, val` | `val >> shift` | | logical shift right | -| 1D | SAR | 3 | `shift, val` | `val >> shift` | | arithmetic shift right | -| 1E-1F | _invalid_ | | | | | | -| 20 | KECCAK256 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len-1])` | | keccak256 | -| 21-2F | _invalid_ | | | | | | -| 30 | ADDRESS | 2 | `.` | `address(this)` | | address of executing contract | -| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | balance, in wei | -| 32 | ORIGIN | 2 | `.` | `tx.origin` | | address that originated the tx | -| 33 | CALLER | 2 | `.` | `msg.sender` | | address of msg sender | -| 34 | CALLVALUE | 2 | `.` | `msg.value` | | msg value, in wei | -| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | read word from msg data at index `idx` | -| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | length of msg data, in bytes | -| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | copy msg data | -| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | length of executing contract's code, in bytes | -| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | copy executing contract's bytecode | -| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | gas price of tx, in wei per unit gas [\*\*](https://eips.ethereum.org/EIPS/eip-1559#gasprice) | -| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | size of code at addr, in bytes | -| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | copy code from `addr` | -| 3D | RETURNDATASIZE | 2 | `.` | `size` | | size of returned data from last external call, in bytes | -| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | copy returned data from last external call | -| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `Hash` | | hash = addr.exists ? keccak256(addr.code) : 0 | -| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | | -| 41 | COINBASE | 2 | `.` | `block.coinbase` | | Adresse des Proposers für den aktuellen Block | -| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | timestamp of current block | -| 43 | NUMBER | 2 | `.` | `block.number` | | number of current block | -| 44 | PREVRANDAO | 2 | `.` | `randomness beacon` | | randomness beacon | -| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | gas limit of current block | -| 46 | CHAINID | 2 | `.` | `chain_id` | | push current [chain id](https://eips.ethereum.org/EIPS/eip-155) onto stack | -| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | balance of executing contract, in wei | -| 48 | BASEFEE | 2 | `.` | `block.basefee` | | base fee of current block | -| 49 | BLOBHASH | 3 | `idx` | `tx.blob_versioned_hashes[idx]` | | [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) | -| 4A | BLOBBASEFEE | 2 | `.` | `block.blobbasefee` | | Blob-Basisgebühr des aktuellen Blocks ([EIP-7516](https://eips.ethereum.org/EIPS/eip-7516)) | -| 4B-4F | _invalid_ | | | | | | -| 50 | POP | 2 | `_anon` | `.` | | remove item from top of stack and discard it | -| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | read word from memory at offset `ost` | -| 52 | MSTORE | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost:ost+32] := val | write a word to memory | -| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | write a single byte to memory | -| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `storage[key]` | | read word from storage | -| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | storage[key] := val | write word to storage | -| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` mark that `pc` is only assigned if `dst` is a valid jumpdest | -| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ? dst : $pc + 1` | -| 58 | PC | 2 | `.` | `$pc` | | program counter | -| 59 | MSIZE | 2 | `.` | `len(mem)` | | size of memory in current execution context, in bytes | -| 5A | GAS | 2 | `.` | `gasRemaining` | | | -| 5B | JUMPDEST | 1 | | | mark valid jump destination | a valid jump destination for example a jump destination not inside the push data | -| 5C | TLOAD | 100 | `key` | `tstorage[key]` | | read word from transient storage ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | -| 5D | TSTORE | 100 | `key, val` | `.` | tstorage[key] := val | write word to transient storage ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | -| 5E | MCOPY | 3+3\*words+[A0](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `dstOst, ost, len` | `.` | mem[dstOst] := mem[ost:ost+len] | copy memory from one area to another ([EIP-5656](https://eips.ethereum.org/EIPS/eip-5656)) | -| 5F | PUSH0 | 2 | `.` | `uint8` | | Bringen Sie den konstanten Wert 0 in den Stack ein | -| 60 | PUSH1 | 3 | `.` | `uint8` | | push 1-byte value onto stack | -| 61 | PUSH2 | 3 | `.` | `uint16` | | push 2-byte value onto stack | -| 62 | PUSH3 | 3 | `.` | `uint24` | | push 3-byte value onto stack | -| 63 | PUSH4 | 3 | `.` | `uint32` | | push 4-byte value onto stack | -| 64 | PUSH5 | 3 | `.` | `uint40` | | push 5-byte value onto stack | -| 65 | PUSH6 | 3 | `.` | `uint48` | | push 6-byte value onto stack | -| 66 | PUSH7 | 3 | `.` | `uint56` | | push 7-byte value onto stack | -| 67 | PUSH8 | 3 | `.` | `uint64` | | push 8-byte value onto stack | -| 68 | PUSH9 | 3 | `.` | `uint72` | | push 9-byte value onto stack | -| 69 | PUSH10 | 3 | `.` | `uint80` | | push 10-byte value onto stack | -| 6A | PUSH11 | 3 | `.` | `uint88` | | push 11-byte value onto stack | -| 6B | PUSH12 | 3 | `.` | `uint96` | | push 12-byte value onto stack | -| 6C | PUSH13 | 3 | `.` | `uint104` | | push 13-byte value onto stack | -| 6D | PUSH14 | 3 | `.` | `uint112` | | push 14-byte value onto stack | -| 6E | PUSH15 | 3 | `.` | `uint120` | | push 15-byte value onto stack | -| 6F | PUSH16 | 3 | `.` | `uint128` | | push 16-byte value onto stack | -| 70 | PUSH17 | 3 | `.` | `uint136` | | push 17-byte value onto stack | -| 71 | PUSH18 | 3 | `.` | `uint144` | | push 18-byte value onto stack | -| 72 | PUSH19 | 3 | `.` | `uint152` | | push 19-byte value onto stack | -| 73 | PUSH20 | 3 | `.` | `uint160` | | push 20-byte value onto stack | -| 74 | PUSH21 | 3 | `.` | `uint168` | | push 21-byte value onto stack | -| 75 | PUSH22 | 3 | `.` | `uint176` | | push 22-byte value onto stack | -| 76 | PUSH23 | 3 | `.` | `uint184` | | push 23-byte value onto stack | -| 77 | PUSH24 | 3 | `.` | `uint192` | | push 24-byte value onto stack | -| 78 | PUSH25 | 3 | `.` | `uint200` | | push 25-byte value onto stack | -| 79 | PUSH26 | 3 | `.` | `uint208` | | push 26-byte value onto stack | -| 7A | PUSH27 | 3 | `.` | `uint216` | | push 27-byte value onto stack | -| 7B | PUSH28 | 3 | `.` | `uint224` | | push 28-byte value onto stack | -| 7C | PUSH29 | 3 | `.` | `uint232` | | push 29-byte value onto stack | -| 7D | PUSH30 | 3 | `.` | `uint240` | | push 30-byte value onto stack | -| 7E | PUSH31 | 3 | `.` | `uint248` | | push 31-byte value onto stack | -| 7F | PUSH32 | 3 | `.` | `uint256` | | push 32-byte value onto stack | -| 80 | DUP1 | 3 | `a` | `a, a` | | clone 1st value on stack | -| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | clone 2nd value on stack | -| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | clone 3rd value on stack | -| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | clone 4th value on stack | -| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | clone 5th value on stack | -| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | clone 6th value on stack | -| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | clone 7th value on stack | -| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | clone 8th value on stack | -| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | clone 9th value on stack | -| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | clone 10th value on stack | -| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | clone 11th value on stack | -| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | clone 12th value on stack | -| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | clone 13th value on stack | -| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | clone 14th value on stack | -| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | clone 15th value on stack | -| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | clone 16th value on stack | -| 90 | SWAP1 | 3 | `a, b` | `b, a` | | | -| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | | -| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | | -| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | | -| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | | -| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | | -| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | | -| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | | -| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | | -| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | | -| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | -| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | -| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG2(memory[ost:ost+len-1], topic0, topic1) | -| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | -| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | -| A5-EF | _invalid_ | | | | | | -| F0 | CREATE | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len` | `addr` | | addr = keccak256(rlp([address(this), this.nonce])) | -| F1 | CALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | gas, addr, val, argOst, argLen, retOst, retLen | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, val, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] = returndata | same as DELEGATECALL, but does not propagate original msg.sender and msg.value | -| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | return mem[ost:ost+len-1] | -| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | -| F6-F9 | _invalid_ | | | | | | -| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| FB-FC | _invalid_ | | | | | | -| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | revert(mem[ost:ost+len-1]) | -| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | designated invalid opcode - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | | -| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `.` | | sendet alle ETH an `addr`; wenn es in derselben Transaktion ausgeführt wird, in der ein Vertrag erstellt wurde, zerstört es den Vertrag | +| Stack | Name | Gas | Anfangs-Stack | Ergebnis-Stack | Speicher | Anmerkungen | | +| :---: | :------------- | :---------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | +| 00 | STOP | 0 | | | | Ausführung anhalten | | +| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256 Addition Modulo 2\*\*256 | | +| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256 Multiplikation Modulo 2\*\*256 | | +| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256 Subtraktion Modulo 2\*\*256 | | +| 04 | DIV | 5 | `a, b` | `a // b` | | uint256 Division | | +| 05 | SDIV | 5 | `a, b` | `a // b` | | int256 Division | | +| 06 | MOD | 5 | `a, b` | `a % b` | | uint256 Modulus | | +| 07 | SMOD | 5 | `a, b` | `a % b` | | int256 Modulus | | +| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256 Addition Modulo N | | +| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256 Multiplikation Modulo N | | +| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256 Potenzierung Modulo 2\*\*256 | | +| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [Vorzeichenerweiterung](https://de.wikipedia.org/wiki/Vorzeichenerweiterung) von `x` von `(b+1)` Bytes auf 32 Bytes | | +| 0C-0F | _ungültig_ | | | | | | | +| 10 | LT | 3 | `a, b` | `a < b` | | uint256 kleiner-als | | +| 11 | GT | 3 | `a, b` | `a > b` | | uint256 größer-als | | +| 12 | SLT | 3 | `a, b` | `a < b` | | int256 kleiner-als | | +| 13 | SGT | 3 | `a, b` | `a > b` | | int256 größer-als | | +| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256 Gleichheit | | +| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 ist-Null | | +| 16 | AND | 3 | `a, b` | `a && b` | | Bitweises UND | | +| 17 | OR | 3 | `a, b` | `a \\|\\| b` | | Bitweises ODER | | +| 18 | XOR | 3 | `a, b` | `a ^ b` | | Bitweises XOR | | +| 19 | NOT | 3 | `a` | `~a` | | Bitweises NICHT | | +| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | `i`-tes Byte von (u)int256 `x`, von links | | +| 1B | SHL | 3 | `shift, val` | `val << shift` | | Linksverschiebung | | +| 1C | SHR | 3 | `shift, val` | `val >> shift` | | Logische Rechtsverschiebung | | +| 1D | SAR | 3 | `shift, val` | `val >> shift` | | Arithmetische Rechtsverschiebung | | +| 1E-1F | _ungültig_ | | | | | | | +| 20 | KECCAK256 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len-1])` | | keccak256 | | +| 21-2F | _ungültig_ | | | | | | | +| 30 | ADDRESS | 2 | `.` | `address(this)` | | Adresse des ausführenden Vertrags | | +| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | Guthaben, in Wei | | +| 32 | ORIGIN | 2 | `.` | `tx.origin` | | Adresse, von der die Transaktion (tx) ausging | | +| 33 | CALLER | 2 | `.` | `msg.sender` | | Adresse des Nachrichtenabsenders (msg) | | +| 34 | CALLVALUE | 2 | `.` | `msg.value` | | Wert der Nachricht (msg) in Wei | | +| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | Wort aus den Nachrichtendaten (msg) am Index `idx` lesen | | +| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | Länge der Nachrichtendaten (msg), in Bytes | | +| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | Nachrichtendaten (msg) kopieren | | +| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | Länge des Codes des ausführenden Vertrags, in Bytes | | +| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | Bytecode des ausführenden Vertrags kopieren | +| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | Gaspreis der Transaktion (tx), in Wei pro Gaseinheit [\*\*](https://eips.ethereum.org/EIPS/eip-1559#gasprice) | | +| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | Größe des Codes bei Adresse (addr), in Bytes | | +| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | Code von `addr` kopieren | | +| 3D | RETURNDATASIZE | 2 | `.` | `size` | | Größe der zurückgegebenen Daten vom letzten externen Aufruf, in Bytes | | +| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | Zurückgegebene Daten vom letzten externen Aufruf kopieren | | +| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `hash` | | hash = addr.exists ? keccak256(addr.code) : 0 | | +| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | | | +| 41 | COINBASE | 2 | `.` | `block.coinbase` | | Adresse des Proposers für den aktuellen Block | | +| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | Zeitstempel des aktuellen Blocks | | +| 43 | NUMBER | 2 | `.` | `block.number` | | Nummer des aktuellen Blocks | | +| 44 | PREVRANDAO | 2 | `.` | `randomness beacon` | | Zufalls-Beacon | | +| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | Gaslimit des aktuellen Blocks | | +| 46 | CHAINID | 2 | `.` | `chain_id` | | Aktuelle [Chain-ID](https://eips.ethereum.org/EIPS/eip-155) auf den Stack legen | | +| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | Guthaben des ausführenden Vertrags, in Wei | | +| 48 | BASEFEE | 2 | `.` | `block.basefee` | | Grundgebühr des aktuellen Blocks | | +| 49 | BLOBHASH | 3 | `idx` | `tx.blob_versioned_hashes[idx]` | | [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) | | +| 4A | BLOBBASEFEE | 2 | `.` | `block.blobbasefee` | | Blob-Grundgebühr des aktuellen Blocks ([EIP-7516](https://eips.ethereum.org/EIPS/eip-7516)) | | +| 4B-4F | _ungültig_ | | | | | | | +| 50 | POP | 2 | `_anon` | `.` | | Element von der Spitze des Stacks entfernen und verwerfen | | +| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | Wort aus dem Speicher am Offset `ost` lesen | | +| 52 | MSTORE | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost:ost+32] := val | Ein Wort in den Speicher schreiben | | +| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | Ein einzelnes Byte in den Speicher schreiben | | +| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `storage[key]` | | Wort aus dem Speicher lesen | | +| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | storage[key] := val | Wort in den Speicher schreiben | | +| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` markiert, dass `pc` nur zugewiesen wird, wenn `dst` ein gültiges Sprungziel ist | | +| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ?` dst : $pc + 1\` | | +| 58 | PC | 2 | `.` | `$pc` | | Programm-Zähler | | +| 59 | MSIZE | 2 | `.` | `len(mem)` | | Größe des Speichers im aktuellen Ausführungskontext, in Bytes | | +| 5A | GAS | 2 | `.` | `gasRemaining` | | | | +| 5B | JUMPDEST | 1 | | | Gültiges Sprungziel markieren | ein gültiges Sprungziel, z. B. ein Sprungziel, das nicht innerhalb der Push-Daten liegt | | +| 5C | TLOAD | 100 | `key` | `tstorage[key]` | | Wort aus dem transienten Speicher lesen ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | | +| 5D | TSTORE | 100 | `key, val` | `.` | tstorage[key] := val | Wort in den transienten Speicher schreiben ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | | +| 5E | MCOPY | 3+3\*words+[A0](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `dstOst, ost, len` | `.` | mem[dstOst] := mem[ost:ost+len] | Speicher von einem Bereich in einen anderen kopieren ([EIP-5656](https://eips.ethereum.org/EIPS/eip-5656)) | | +| 5F | PUSH0 | 2 | `.` | `uint8` | | Bringen Sie den konstanten Wert 0 in den Stack ein | | +| 60 | PUSH1 | 3 | `.` | `uint8` | | 1-Byte-Wert auf den Stack legen | | +| 61 | PUSH2 | 3 | `.` | `uint16` | | 2-Byte-Wert auf den Stack legen | | +| 62 | PUSH3 | 3 | `.` | `uint24` | | 3-Byte-Wert auf den Stack legen | | +| 63 | PUSH4 | 3 | `.` | `uint32` | | 4-Byte-Wert auf den Stack legen | | +| 64 | PUSH5 | 3 | `.` | `uint40` | | 5-Byte-Wert auf den Stack legen | | +| 65 | PUSH6 | 3 | `.` | `uint48` | | 6-Byte-Wert auf den Stack legen | | +| 66 | PUSH7 | 3 | `.` | `uint56` | | 7-Byte-Wert auf den Stack legen | | +| 67 | PUSH8 | 3 | `.` | `uint64` | | 8-Byte-Wert auf den Stack legen | | +| 68 | PUSH9 | 3 | `.` | `uint72` | | 9-Byte-Wert auf den Stack legen | | +| 69 | PUSH10 | 3 | `.` | `uint80` | | 10-Byte-Wert auf den Stack legen | | +| 6A | PUSH11 | 3 | `.` | `uint88` | | 11-Byte-Wert auf den Stack legen | | +| 6B | PUSH12 | 3 | `.` | `uint96` | | 12-Byte-Wert auf den Stack legen | | +| 6C | PUSH13 | 3 | `.` | `uint104` | | 13-Byte-Wert auf den Stack legen | | +| 6D | PUSH14 | 3 | `.` | `uint112` | | 14-Byte-Wert auf den Stack legen | | +| 6E | PUSH15 | 3 | `.` | `uint120` | | 15-Byte-Wert auf den Stack legen | | +| 6F | PUSH16 | 3 | `.` | `uint128` | | 16-Byte-Wert auf den Stack legen | | +| 70 | PUSH17 | 3 | `.` | `uint136` | | 17-Byte-Wert auf den Stack legen | | +| 71 | PUSH18 | 3 | `.` | `uint144` | | 18-Byte-Wert auf den Stack legen | | +| 72 | PUSH19 | 3 | `.` | `uint152` | | 19-Byte-Wert auf den Stack legen | | +| 73 | PUSH20 | 3 | `.` | `uint160` | | 20-Byte-Wert auf den Stack legen | | +| 74 | PUSH21 | 3 | `.` | `uint168` | | 21-Byte-Wert auf den Stack legen | | +| 75 | PUSH22 | 3 | `.` | `uint176` | | 22-Byte-Wert auf den Stack legen | | +| 76 | PUSH23 | 3 | `.` | `uint184` | | 23-Byte-Wert auf den Stack legen | | +| 77 | PUSH24 | 3 | `.` | `uint192` | | 24-Byte-Wert auf den Stack legen | | +| 78 | PUSH25 | 3 | `.` | `uint200` | | 25-Byte-Wert auf den Stack legen | | +| 79 | PUSH26 | 3 | `.` | `uint208` | | 26-Byte-Wert auf den Stack legen | | +| 7A | PUSH27 | 3 | `.` | `uint216` | | 27-Byte-Wert auf den Stack legen | | +| 7B | PUSH28 | 3 | `.` | `uint224` | | 28-Byte-Wert auf den Stack legen | | +| 7C | PUSH29 | 3 | `.` | `uint232` | | 29-Byte-Wert auf den Stack legen | | +| 7D | PUSH30 | 3 | `.` | `uint240` | | 30-Byte-Wert auf den Stack legen | | +| 7E | PUSH31 | 3 | `.` | `uint248` | | 31-Byte-Wert auf den Stack legen | | +| 7F | PUSH32 | 3 | `.` | `uint256` | | 32-Byte-Wert auf den Stack legen | | +| 80 | DUP1 | 3 | `a` | `a, a` | | 1. Wert auf dem Stack klonen | | +| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | 2. Wert auf dem Stack klonen | | +| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | 3. Wert auf dem Stack klonen | | +| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | 4. Wert auf dem Stack klonen | | +| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | 5. Wert auf dem Stack klonen | | +| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | 6. Wert auf dem Stack klonen | | +| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | 7. Wert auf dem Stack klonen | | +| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | 8. Wert auf dem Stack klonen | | +| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | 9. Wert auf dem Stack klonen | | +| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | 10. Wert auf dem Stack klonen | | +| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | 11. Wert auf dem Stack klonen | | +| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | 12. Wert auf dem Stack klonen | | +| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | 13. Wert auf dem Stack klonen | | +| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | 14. Wert auf dem Stack klonen | | +| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | 15. Wert auf dem Stack klonen | | +| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | 16. Wert auf dem Stack klonen | | +| 90 | SWAP1 | 3 | `a, b` | `b, a` | | | | +| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | | | +| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | | | +| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | | | +| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | | | +| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | | +| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | | +| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG2(memory[ost:ost+len-1], topic0, topic1) | | +| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | | +| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | | +| A5-EF | _ungültig_ | | | | | | | +| F0 | CREATE | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len` | `addr` | | addr = keccak256(rlp([address(this), this.nonce])) | | +| F1 | CALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | gas, addr, val, argOst, argLen, retOst, retLen | `erfolg` | mem[retOst:retOst+retLen-1] := returndata | | | +| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, val, argOst, argLen, retOst, retLen` | `erfolg` | mem[retOst:retOst+retLen-1] = returndata | dasselbe wie DELEGATECALL, aber leitet den ursprünglichen msg.sender und msg.value nicht weiter | | +| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | return mem[ost:ost+len-1] | | +| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `erfolg` | mem[retOst:retOst+retLen-1] := returndata | | | +| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | | +| F6-F9 | _ungültig_ | | | | | | | +| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `erfolg` | mem[retOst:retOst+retLen-1] := returndata | | | +| FB-FC | _ungültig_ | | | | | | | +| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | revert(mem[ost:ost+len-1]) | | +| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | designierter ungültiger Opcode - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | | | +| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `.` | | sendet alle ETH an `addr`; wenn es in derselben Transaktion ausgeführt wird, in der ein Vertrag erstellt wurde, zerstört es den Vertrag | | diff --git a/public/content/translations/de/developers/docs/frameworks/index.md b/public/content/translations/de/developers/docs/frameworks/index.md index 25b2032dc40..170f4b6fe13 100644 --- a/public/content/translations/de/developers/docs/frameworks/index.md +++ b/public/content/translations/de/developers/docs/frameworks/index.md @@ -6,19 +6,27 @@ lang: de ## Einführung in Frameworks {#introduction-to-frameworks} -Für den Aufbau einer vollwertigen dApp sind unterschiedliche Technologieteile erforderlich. Software-Frameworks enthalten viele der erforderlichen Funktionen oder bieten einfache Plugin-Systeme, über die Sie die Tools auswählen können, die Sie als hilfreich erachten. +Für den Aufbau einer vollwertigen dApp sind +unterschiedliche Technologieteile erforderlich. Software-Frameworks enthalten viele der erforderlichen +Funktionen oder bieten einfache Plugin-Systeme, über die Sie die Tools auswählen können, +die Sie als hilfreich erachten. -Frameworks bieten zahlreiche direkt einsetzbare Funktionen wie: +Frameworks bieten zahlreiche direkt einsetzbare Funktionen +wie: - Funktionen, um eine lokale Blockchain-Instanz aufzusetzen - Dienstprogramme zum Kompilieren und Testen von Smart Contracts -- Client-Entwicklungs-Add-ons zur Erstellung Ihrer anwenderorientierten Anwendung im selben Projekt/Repository -- Konfiguration für die Verbindung zu Ethereum-Netzwerken und zur Bereitstellung von Verträgen, sei es zu einer lokal laufenden Instanz oder für ein öffentliches Netzwerk von Ethereum -- Dezentralisierte App-Verteilung – Integration mit Speicheroptionen wie IPFS +- Client-Entwicklungs-Add-ons zur Erstellung Ihrer anwenderorientierten Anwendung + im selben Projekt/Repository. +- Konfiguration zur Verbindung mit Ethereum-Netzwerken und zur Bereitstellung + von Verträgen, sei es für eine lokal laufende Instanz oder eines + der öffentlichen Netzwerke von Ethereum. +- Verteilung dezentraler Apps – Integrationen mit Speicheroptionen + wie IPFS. ## Voraussetzungen {#prerequisites} -Bevor Sie sich mit Frameworks beschäftigen, empfehlen wir, dass Sie sich mit der Einführung in [dApps](/developers/docs/dapps/) und den [Ethereum-Stack](/developers/docs/ethereum-stack/) vertraut machen. +Bevor Sie sich mit Frameworks beschäftigen, empfehlen wir Ihnen, zuerst unsere Einführung in [Dapps](/developers/docs/dapps/) und den [Ethereum-Stack](/developers/docs/ethereum-stack/) zu lesen. ## Verfügbare Frameworks {#available-frameworks} @@ -27,40 +35,40 @@ Bevor Sie sich mit Frameworks beschäftigen, empfehlen wir, dass Sie sich mit de - [Foundry installieren](https://book.getfoundry.sh/) - [Foundry-Buch](https://book.getfoundry.sh/) - [Foundry-Community-Chat auf Telegram](https://t.me/foundry_support) -- [Fantastisches Foundry](https://github.com/crisgarner/awesome-foundry) +- [Awesome Foundry](https://github.com/crisgarner/awesome-foundry) -**Hardhat –** **_Ethereum-Entwicklungsumgebung für Experten_** +**Hardhat –** **_Ethereum-Entwicklungsumgebung für Profis._** - [hardhat.org](https://hardhat.org) - [GitHub](https://github.com/nomiclabs/hardhat) -**Ape –** **_Das Smart-Contract-Entwicklungstool für Python-Experten, Data Scientists und Sicherheitsexperten_** +**Ape –** **_Das Smart-Contract-Entwicklungstool für Pythonistas, Datenwissenschaftler und Sicherheitsexperten._** - [Dokumentation](https://docs.apeworx.io/ape/stable/) - [GitHub](https://github.com/ApeWorX/ape) -**Web3j –** **_eine Plattform für die Entwicklung von Blockchain-Anwendungen auf JVM._** +**Web3j –** **_Eine Plattform für die Entwicklung von Blockchain-Anwendungen auf der JVM._** -- [Website](https://www.web3labs.com/web3j-sdk) +- [Homepage](https://www.web3labs.com/web3j-sdk) - [Dokumentation](https://docs.web3j.io) - [GitHub](https://github.com/web3j/web3j) -**ethers-kt – ** **_asynchrone, hochleistungsfähige Kotlin-/Java-/Android-Bibliothek für EVM-basierte Blockchains._** +**ethers-kt –** **_Asynchrone, hochleistungsfähige Kotlin-/Java-/Android-Bibliothek für EVM-basierte Blockchains._** - [GitHub](https://github.com/Kr1ptal/ethers-kt) - [Beispiele](https://github.com/Kr1ptal/ethers-kt/tree/master/examples) - [Discord](https://discord.gg/rx35NzQGSb) -**Create Eth App –** **_Ethereum-basierte Apps mit einem Befehl erstellen. Zur Auswahl steht ein breitest Angebot an UI-Frameworks und DeFi-Vorlagen._** +**Create Eth App –** **_Erstellen Sie Ethereum-basierte Apps mit einem Befehl._** Zur Auswahl steht ein breitest Angebot an UI-Frameworks und DeFi-Vorlagen._\*\* - [GitHub](https://github.com/paulrberg/create-eth-app) - [Vorlagen](https://github.com/PaulRBerg/create-eth-app/tree/develop/templates) -**Scaffold-Eth –** **_Ethers.js + Hardhat + React-Komponenten und Hooks für web3: alles, was Sie brauchen, um mit der Entwicklung dezentraler Anwendungen auf Basis von Smart Contracts zu beginnen._** +**Scaffold-Eth –** **_Ethers.js + Hardhat + React-Komponenten und Hooks für Web3: alles, was Sie für den Einstieg in die Erstellung dezentralisierter Anwendungen auf der Grundlage von Smart Contracts benötigen._** - [GitHub](https://github.com/scaffold-eth/scaffold-eth-2) -**Tenderly –** **_Web3-Entwicklungsplattform, die es Blockchain-Entwicklern ermöglicht, Smart Contracts zu erstellen, zu testen, zu debuggen, zu überwachen und zu betreiben sowie die dApp-Nutzererfahrung zu verbessern._** +**Tenderly –** **_Web3-Entwicklungsplattform, die es Blockchain-Entwicklern ermöglicht, Smart Contracts zu erstellen, zu testen, zu debuggen, zu überwachen und zu betreiben sowie die Dapp-UX zu verbessern._** - [Website](https://tenderly.co/) - [Dokumentation](https://docs.tenderly.co/) @@ -70,7 +78,7 @@ Bevor Sie sich mit Frameworks beschäftigen, empfehlen wir, dass Sie sich mit de - [Website](https://thegraph.com/) - [Tutorial](/developers/tutorials/the-graph-fixing-web3-data-querying/) -**Alchemy-****_Ehereum-Entwicklungsplattform_** +**Alchemy –** **_Ethereum-Entwicklungsplattform._** - [alchemy.com](https://www.alchemy.com/) - [GitHub](https://github.com/alchemyplatform) @@ -82,18 +90,18 @@ Bevor Sie sich mit Frameworks beschäftigen, empfehlen wir, dass Sie sich mit de - [GitHub](https://github.com/node-real) - [Discord](https://discord.gg/V5k5gsuE) -**thirdweb SDK –** **_erstellen Sie Web3-Anwendungen, die mit Ihren Smart Contracts interagieren können, indem Sie unsere leistungsstarken SDKs und CLI verwenden._** +**thirdweb SDK –** **_Erstellen Sie Web3-Anwendungen, die mit Ihren Smart Contracts interagieren können, indem Sie unsere leistungsstarken SDKs und unsere CLI verwenden._** - [Dokumentation](https://portal.thirdweb.com/sdk/) - [GitHub](https://github.com/thirdweb-dev/) -**Chainstack –** **_Web3-Entwicklungsplattform (Ethereum und andere)._** +**Chainstack –** **_Web3 (Ethereum und andere) Entwicklungsplattform._** - [chainstack.com](https://www.chainstack.com/) - [GitHub](https://github.com/chainstack) - [Discord](https://discord.gg/BSb5zfp9AT) -**Crossmint –** **_eine Plattform für Web3-Entwicklung auf Unternehmensniveau, die es Ihnen ermöglicht, NFT-Anwendungen auf allen wichtigen EVM-Blockchains (und anderen) zu erstellen._** +**Crossmint –** **_Web3-Entwicklungsplattform auf Unternehmensniveau, mit der Sie NFT-Anwendungen auf allen wichtigen EVM-Ketten(und anderen) erstellen können._** - [Website](https://www.crossmint.com) - [Dokumentation](https://docs.crossmint.com) @@ -105,34 +113,42 @@ Bevor Sie sich mit Frameworks beschäftigen, empfehlen wir, dass Sie sich mit de - [GitHub](https://github.com/eth-brownie/brownie) - **Brownie wird derzeit nicht gewartet** -**OpenZeppelin SDK –** **_das ultimative Smart-Contract-Toolkit: eine Suite an Tools, die Ihnen helfen, zu entwickeln, zu kompilieren, zu aktualisieren, bereitzustellen und mit Smart Contracts zu interagieren._** +**OpenZeppelin SDK –** **_Das ultimative Smart-Contract-Toolkit: Eine Suite von Tools, die Ihnen bei der Entwicklung, Kompilierung, Aktualisierung, Bereitstellung und Interaktion mit Smart Contracts helfen._** -- [OpenZeppelin SDK](https://openzeppelin.com/sdk/) +- [OpenZeppelin Defender SDK](https://docs.openzeppelin.com/defender/sdk) - [GitHub](https://github.com/OpenZeppelin/openzeppelin-sdk) - [Community-Forum](https://forum.openzeppelin.com/c/support/17) - **Die Entwicklung von OpenZeppelin SDK ist beendet** -**Catapulta –** **_ein Tool für die Bereitstellung von Multi-Chain-Smart-Contracts, das die Verifizierung in Block-Explorern automatisiert, bereitgestellte Smart Contracts verfolgt und Bereitstellungsberichte teilt; Plug-and-Play für Foundry- und Hardhat-Projekte._** +**Catapulta –** **_Multi-Chain-Bereitstellungstool für Smart Contracts, das Verifizierungen in Block-Explorern automatisiert, bereitgestellte Smart Contracts nachverfolgt und Bereitstellungsberichte teilt; Plug-and-Play für Foundry- und Hardhat-Projekte._** - [Website](https://catapulta.sh/) - [Dokumentation](https://catapulta.sh/docs) -- [Github](https://github.com/catapulta-sh) +- [GitHub](https://github.com/catapulta-sh) -**Covalent –** **_erweiterte Blockchain-APIs für über 200 Ketten._** +**GoldRush (powered by Covalent) –** **_GoldRush bietet die umfassendste Blockchain-Daten-API-Suite für Entwickler, Analysten und Unternehmen. Ganz gleich, ob Sie ein DeFi-Dashboard, eine Wallet, einen Trading-Bot, einen KI-Agenten oder eine Compliance-Plattform erstellen, die Daten-APIs bieten einen schnellen, genauen und entwicklerfreundlichen Zugriff auf die wesentlichen On-Chain-Daten, die Sie benötigen._** -- [covalenthq.com](https://www.covalenthq.com/) -- [Dokumentation](https://www.covalenthq.com/docs/api/) +- [Website](https://goldrush.dev/) +- [Dokumentation](https://goldrush.dev/docs/chains/ethereum) - [GitHub](https://github.com/covalenthq) - [Discord](https://www.covalenthq.com/discord/) -**Wake –** **_ein All-in-One-Python-Framework für das Testen von Contracts, Fuzzing, Bereitstellung, Schwachstellenscanning und Code-Navigation._** +**Wake –** **_All-in-One-Python-Framework für das Testen von Verträgen, Fuzzing, Bereitstellung, Schwachstellenscans und Code-Navigation._** -- [Website](https://getwake.io/) +- [Homepage](https://getwake.io/) - [Dokumentation](https://ackeeblockchain.com/wake/docs/latest/) - [GitHub](https://github.com/Ackee-Blockchain/wake) - [VS-Code-Erweiterung](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity) -## Weiterführende Informationen {#further-reading} +**Veramo –** **_Ein quelloffenes, modulares und agnostisches Framework, das es Entwicklern dezentralisierter Anwendungen erleichtert, dezentrale Identitäten und verifizierbare Nachweise in ihre Anwendungen zu integrieren._** + +- [Homepage](https://veramo.io/) +- [Dokumentation](https://veramo.io/docs/basics/introduction) +- [GitHub](https://github.com/uport-project/veramo) +- [Discord](https://discord.com/invite/FRRBdjemHV) +- [NPM-Paket](https://www.npmjs.com/package/@veramo/core) + +## Weiterführende Lektüre {#further-reading} _Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/gas/index.md b/public/content/translations/de/developers/docs/gas/index.md index 09ac46fea76..e308182b49e 100644 --- a/public/content/translations/de/developers/docs/gas/index.md +++ b/public/content/translations/de/developers/docs/gas/index.md @@ -1,6 +1,7 @@ --- title: Gas und Gebühren -description: +metaTitle: "Ethereum Gas und Gebühren: Technische Übersicht" +description: Informieren Sie sich über die Ethereum Gasgebühren, wie sie berechnet werden und welche Rolle sie für die Netzwerksicherheit und Transaktionsverarbeitung spielen. lang: de --- @@ -8,33 +9,34 @@ Gas ist für das Ethereum-Netzwerk unerlässlich. Es ist der Treibstoff, der Eth ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst [Transaktionen](/developers/docs/transactions/) und [Blöcke](/developers/docs/evm/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [Transaktionen](/developers/docs/transactions/) und die [EVM](/developers/docs/evm/) zu informieren. -## Was ist Gas? {#what-is-gas} +## Was ist Sprit? {#what-is-gas} Gas bezieht sich auf die Einheit, die den Umfang des Rechenaufwands misst, der für die Durchführung spezifischer Operationen im Ethereum-Netzwerk erforderlich ist. Da jede Transaktion im Ethereum-Netzwerk den Einsatz von Rechenressourcen erfordert, um zur Ausführung zu gelangen, ist für diese Ressourcen eine Vergütung erforderlich. Das dient der Sicherstellung, dass das Ethereum-Netzwerk weder für Spam-Attacken anfällig ist, noch in Zustände unendlicher Rechenzyklen verfallen kann. Die Bezahlung für Berechnungen erfolgt in Form einer Gasgebühr. -Die Gasgebühr entspricht **dem Volumen des verbrauchten Gases für eine spezifische Transaktion multipliziert mit dem Preis je Gaseinheit**. Die Gebühr wird unabhängig davon gezahlt, ob eine Transaktion erfolgreich ist oder nicht. +Die Gasgebühr ist **die Menge des für einen Vorgang verbrauchten Gases multipliziert mit den Kosten pro Gaseinheit**. Die Gebühr wird unabhängig davon gezahlt, ob eine Transaktion erfolgreich ist oder nicht. -![Ein Diagramm, das zeigt, wo Gas im EVM-Betrieb benötigt wird](./gas.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Ein Diagramm, das zeigt, wo Gas bei EVM-Operationen benötigt wird](./gas.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ Gasgebühren sind in der originären Währung von Ethereum, Ether (ETH), zu entrichten. Die Gaspreise werden in der Regel in Gwei angegeben, einer Untereinheit von ETH. Jede Gwei entspricht einem Milliardstel einer ETH (0,000000001 ETH oder 10-9 ETH). Anstatt z. B. zu sagen, dass dein Gas 0,000000001 Ether kostet, kannst du sagen, dass dein Gas 1 Gwei kostet. -Das Wort "gwei" ist eine Kurzform von "giga-wei", was "Milliarde wei" bedeutet. Ein gwei entspricht einer Milliarde wei. Wei selbst (benannt nach [Wei Dai](https://wikipedia.org/wiki/Wei_Dai), dem Erfinder von [B-Geld](https://www.investopedia.com/terms/b/bmoney.asp)) ist die kleinste Einheit von ETH. +Das Wort "gwei" ist eine Kurzform von "giga-wei", was "Milliarde wei" bedeutet. Ein gwei entspricht einer Milliarde wei. Wei selbst (benannt nach [Wei Dai](https://wikipedia.org/wiki/Wei_Dai), dem Schöpfer von [b-money](https://www.investopedia.com/terms/b/bmoney.asp)) ist die kleinste Einheit von ETH. ## Wie werden die Gasgebühren berechnet? {#how-are-gas-fees-calculated} Sie können die Menge an Gas, die Sie zu zahlen bereit sind, festlegen, wenn Sie eine Transaktion einreichen. Durch das Angebot einer festgelegten Gasmenge beteiligen Sie sich an einer Auktion zur Einbeziehung Ihrer Transaktion in den nächsten Block. Bei einem zu niedrigen Gasangebot verringert sich die Wahrscheinlichkeit, dass Validierer Ihre Transaktion für die Einbindung in den nächsten Block auswählen, was zu einer verzögerten oder sogar nicht erfolgenden Ausführung Ihrer Transaktion führen kann. Wenn Sie zu viel bieten, könnten Sie ETH verschwenden. Wie können Sie also feststellen, wie viel Sie zahlen müssen? -Der Gesamtbetrag, den Sie zahlen, wird in zwei Komponenten aufgeteilt: die `Grundgebühr `und die `Prioritätsgebühr` (Trinkgeld). +Der Gesamtbetrag, den Sie zahlen, wird in zwei Komponenten aufgeteilt: die `Grundgebühr` und die `Prioritätsgebühr` (Trinkgeld). -Die `Grundgebühr` wird durch das Protokoll festgelegt - Sie müssen mindestens diesen Betrag zahlen, damit Ihre Transaktion als gültig betrachtet wird. Die `Prioritätsgebühr` ist ein Trinkgeld, das Sie auf die Grundgebühr aufschlagen, um Ihre Transaktion für die Validierer attraktiv zu machen, so dass diese sie für die Aufnahme in den nächsten Block auswählen. +Die `Grundgebühr` wird vom Protokoll festgelegt – Sie müssen mindestens diesen Betrag bezahlen, damit Ihre Transaktion als gültig angesehen wird. Die `Prioritätsgebühr` ist ein Trinkgeld, das Sie zur Grundgebühr hinzufügen, um Ihre Transaktion für Validatoren attraktiv zu machen, sodass sie diese für die Aufnahme in den nächsten Block auswählen. -Eine Transaktion, für die nur die `Grundgebühr` gezahlt wird, ist zwar technisch gesehen gültig, wird aber wahrscheinlich nicht berücksichtigt, da sie den Validierern keinen Anreiz bietet, sie einer anderen Transaktion vorzuziehen. Die "richtige" `Prioritätsgebühr` wird durch die Netzwerkauslastung zu dem Zeitpunkt bestimmt, an dem Sie Ihre Transaktion senden. Wenn es viel Nachfrage gibt, müssen Sie Ihre `Prioritätsgebühr` möglicherweise höher ansetzen, aber wenn es weniger Nachfrage gibt, können Sie weniger bezahlen. +Eine Transaktion, für die nur die `Grundgebühr` gezahlt wird, ist zwar technisch gesehen gültig, wird aber wahrscheinlich nicht berücksichtigt, da sie den Validatoren keinen Anreiz bietet, sie einer anderen Transaktion vorzuziehen. Die 'richtige' `Prioritätsgebühr` wird durch die Netzwerkauslastung zum Zeitpunkt des Sendens Ihrer Transaktion bestimmt – bei hoher Nachfrage müssen Sie Ihre `Prioritätsgebühr` möglicherweise höher ansetzen, aber bei geringerer Nachfrage können Sie weniger bezahlen. Nehmen wir zum Beispiel an, Jordan muss Taylor 1 ETH bezahlen. Ein ETH-Transfer erfordert 21.000 Gaseinheiten, und die Grundgebühr beträgt 10 gwei. Jordan enthält ein Trinkgeld von 2 gwei. @@ -42,52 +44,56 @@ Die Gesamtgebühr würde sich nun wie folgt zusammensetzen: `Verbrauchte Gaseinheiten * (Grundgebühr + Prioritätsgebühr)` -wobei die `Grundgebühr` ein durch das Protokoll bestimmter Wert und die `Prioritätsgebühr` ein vom Benutzer gesetzter Wert als Anreiz für den Validierer ist. +wobei die `Grundgebühr` ein vom Protokoll festgelegter Wert ist und die `Prioritätsgebühr` ein vom Benutzer als Trinkgeld an den Validator festgelegter Wert ist. -z.B. `21,000 * (10 + 2) = 252,000 gwei` (0.000252 ETH). +z. B. `21.000 * (10 + 2) = 252.000 Gwei` (0,000252 ETH). Wenn Jordan das Geld versendet, werden 1,000252 ETH von Jordans Konto abgezogen. Taylor werden 1,0000 ETH gutgeschrieben. Der Validator erhält das Trinkgeld von 0,000042 ETH. Die `Grundgebühr` von 0,00021 ETH wird verbrannt. ### Grundgebühr {#base-fee} -Jeder Block hat seine eigene Basisgebühr, welche als reservierter Preis erscheint. Um in einen Block aufgenommen zu werden, muss der angebotene Preis pro Gas mindestens der Grundgebühr entsprechen. Die Grundgebühr wird unabhängig vom aktuellen Block berechnet und richtet sich stattdessen nach den vorherigen Blöcken. Das macht die Transaktionsgebühren für die Nutzer/Nutzerinnen berechenbarer. Bei der Erstellung des Blocks wird diese **Grundgebühr "verbrannt"** und damit aus dem Verkehr gezogen. +Jeder Block hat seine eigene Basisgebühr, welche als reservierter Preis erscheint. Um in einen Block aufgenommen zu werden, muss der angebotene Preis pro Gas mindestens der Grundgebühr entsprechen. Die Grundgebühr wird unabhängig vom aktuellen Block berechnet und stattdessen durch die vorherigen Blöcke bestimmt, was die Transaktionsgebühren für Benutzer berechenbarer macht. Wenn der Block erstellt wird, wird diese **Grundgebühr „verbrannt“** und damit aus dem Umlauf genommen. -Die Grundgebühr wird anhand einer Formel berechnet, die die Größe des vorherigen Blocks (die für alle Transaktionen verwendete Gasmenge) mit der Zielgröße vergleicht. Die Grundgebühr erhöht sich um maximal 12,5 % pro Block, wenn die Zielblockgröße überschritten wird. Dieses exponentielle Wachstum macht es wirtschaftlich unrentabel, die Blockgröße unbegrenzt hoch zu halten. +Die Grundgebühr wird durch eine Formel berechnet, die die Größe des vorherigen Blocks (die für alle Transaktionen verwendete Gasmenge) mit der Zielgröße (die Hälfte des Gaslimits) vergleicht. Die Grundgebühr wird um maximal 12,5 % pro Block steigen oder fallen, wenn die Zielblockgröße über bzw. unter dem Zielwert liegt. Dieses exponentielle Wachstum macht es wirtschaftlich unrentabel, die Blockgröße unbegrenzt hoch zu halten. -| Blocknummer | Enthaltenes Gas | Gebührenerhöhung | Aktuelle Grundgebühr | -| ----------- | ---------------:| ----------------:| --------------------:| -| 1 | 15 m | 0 % | 100 gwei | -| 2 | 30 m | 0 % | 100 gwei | -| 3 | 30 m | 12,5 % | 112,5 gwei | -| 4 | 30 m | 12,5 % | 126,6 gwei | -| 5 | 30 m | 12,5 % | 142,4 gwei | -| 6 | 30 m | 12,5 % | 160,2 gwei | -| 7 | 30 m | 12,5 % | 180,2 gwei | -| 8 | 30 m | 12,5 % | 202,7 gwei | +| Blocknummer | Enthaltenes Gas | Gebührenerhöhung | Aktuelle Grundgebühr | +| ----------- | ----------------------: | ---------------: | -------------------: | +| 1 | 18 Mio. | 0 % | 100 gwei | +| 2 | 36 Mio. | 0 % | 100 gwei | +| 3 | 36 Mio. | 12,5 % | 112,5 gwei | +| 4 | 36 Mio. | 12,5 % | 126,6 gwei | +| 5 | 36 Mio. | 12,5 % | 142,4 gwei | +| 6 | 36 Mio. | 12,5 % | 160,2 gwei | +| 7 | 36 Mio. | 12,5 % | 180,2 gwei | +| 8 | 36 Mio. | 12,5 % | 202,7 gwei | -Der obigen Tabelle folgend: Um eine Transaktion auf Block Nummer 9 zu erstellen, wird eine Wallet den Nutzer mit Sicherheit wissen lassen, dass die **maximale Grundgebühr**, die dem nächsten Block hinzugefügt wird, `aktuelle Grundgebühr * 112,5%` oder `202,7 gwei * 112,5% = 228,1 gwei` ist. +In der obigen Tabelle wird ein Beispiel mit 36 Millionen als Gaslimit demonstriert. Folgt man diesem Beispiel, wird eine Wallet dem Benutzer beim Erstellen einer Transaktion in Block Nummer 9 mit Sicherheit mitteilen, dass die **maximale Grundgebühr**, die dem nächsten Block hinzugefügt wird, `aktuelle Grundgebühr * 112,5 %` oder `202,7 Gwei * 112,5 % = 228,1 Gwei` beträgt. Außerdem ist es unwahrscheinlich, dass es zu längeren Zeiträumen mit vollen Blöcken kommt, da die Grundgebühr vor einem vollen Block schnell ansteigt. -| Blocknummer | Enthaltenes Gas | Gebührenerhöhung | Aktuelle Grundgebühr | -| ----------- | ---------------:| ----------------:| --------------------:| -| 30 | 30 m | 12,5 % | 2705,6 gwei | -| ... | ... | 12,5 % | ... | -| 50 | 30 m | 12,5 % | 28531,3 gwei | -| ... | ... | 12,5 % | ... | -| 100 | 30 m | 12,5 % | 10302608,6 gwei | +| Blocknummer | Enthaltenes Gas | Gebührenerhöhung | Aktuelle Grundgebühr | +| --------------------------------------------------- | --------------------------------------------------: | ---------------: | --------------------------------------------------: | +| 30 | 36 Mio. | 12,5 % | 2705,6 gwei | +| ... | ... | 12,5 % | ... | +| 50 | 36 Mio. | 12,5 % | 28531,3 gwei | +| ... | ... | 12,5 % | ... | +| 100 | 36 Mio. | 12,5 % | 10302608,6 gwei | -### Prioritätsgebühr (Trinkgeld) {#priority-fee} +### Prioritätsgebühr (Trinkgelder) {#priority-fee} -Die Prioritätsgebühr (Trinkgeld) bietet den Validierern einen Anreiz, eine Transaktion in den Block aufzunehmen. Ohne Trinkgeld wäre es für Validierer wirtschaftlich rentabel, leere Blöcke zu schürfen, da sie die gleiche Blockbelohnung erhalten würden. Kleine Trinkgelder geben den Validierern einen minimalen Anreiz, eine Transaktion aufzunehmen. Damit Transaktionen vor anderen Transaktionen im selben Block bevorzugt ausgeführt werden, kann ein höheres Trinkgeld hinzugefügt werden, um zu versuchen, konkurrierende Transaktionen zu überbieten. +Die Prioritätsgebühr (das Trinkgeld) gibt Validatoren einen Anreiz, die Anzahl der Transaktionen in einem Block zu maximieren, die nur durch das Blockgaslimit begrenzt ist. Ohne Trinkgelder könnte ein rationaler Validator weniger – oder sogar gar keine – Transaktionen aufnehmen, ohne eine direkte Strafe auf der Ausführungsebene oder der Konsens-Ebene zu erhalten, da die Staking-Belohnungen unabhängig davon sind, wie viele Transaktionen sich in einem Block befinden. Zudem ermöglichen es Trinkgelder den Benutzern, andere für eine Priorität innerhalb desselben Blocks zu überbieten, was effektiv Dringlichkeit signalisiert. ### Maximale Gebühr {#maxfee} -Um eine Transaktion im Netzwerk auszuführen, können Nutzer/Nutzerinnen ein maximales Limit angeben, das sie bereit sind, für die Ausführung ihrer Transaktion zu bezahlen. Dieser optionale Parameter ist als `maxFeePerGas` bekannt. Damit eine Transaktion ausgeführt werden kann, muss die maximale Gebühr die Summe aus der Grundgebühr und dem Trinkgeld übersteigen. Der Absender der Transaktion erhält die Differenz zwischen der maximalen Gebühr und der Summe aus Grundgebühr und Trinkgeld zurück. +Um eine Transaktion im Netzwerk auszuführen, können Nutzer/Nutzerinnen ein maximales Limit angeben, das sie bereit sind, für die Ausführung ihrer Transaktion zu bezahlen. Dieser optionale Parameter wird als `maxFeePerGas` bezeichnet. Damit eine Transaktion ausgeführt werden kann, muss die maximale Gebühr die Summe aus der Grundgebühr und dem Trinkgeld übersteigen. Der Absender der Transaktion erhält die Differenz zwischen der maximalen Gebühr und der Summe aus Grundgebühr und Trinkgeld zurück. ### Blockgröße {#block-size} -Jeder Block hat eine Zielgröße von 15 Millionen Gas, aber die Größe der Blöcke wird entsprechend der Netznachfrage erhöht oder verringert, bis zur Blockgrenze von 60 Millionen Gas (die zweifache Zielblockgröße). Das Protokoll erreicht durch den Prozess des _Tâtonnement_ eine gleichgewichtige Blockgröße von durchschnittlich 30 Millionen. Das heißt, wenn die Blockgröße die Zielblockgröße übersteigt, erhöht das Protokoll die Grundgebühr für den folgenden Block. Ebenso senkt das Protokoll die Grundgebühr, wenn die Blockgröße kleiner als die Zielblockgröße ist. Der Betrag, um den die Grundgebühr angepasst wird, ist proportional dazu, wie weit die aktuelle Blockgröße vom Zielwert entfernt ist. [Mehr über Blöcke](/developers/docs/blocks/). +Jeder Block hat eine Zielgröße, die der Hälfte des aktuellen Gaslimits entspricht, aber die Größe der Blöcke wird entsprechend der Netzwerknachfrage zu- oder abnehmen, bis das Blocklimit erreicht ist (2x die Zielblockgröße). Das Protokoll erreicht eine durchschnittliche Gleichgewichts-Blockgröße am Zielwert durch den Prozess des _Tâtonnement_. Das heißt, wenn die Blockgröße die Zielblockgröße übersteigt, erhöht das Protokoll die Grundgebühr für den folgenden Block. Ebenso senkt das Protokoll die Grundgebühr, wenn die Blockgröße kleiner als die Zielblockgröße ist. + +Der Betrag, um den die Grundgebühr angepasst wird, ist proportional dazu, wie weit die aktuelle Blockgröße vom Zielwert entfernt ist. Dies ist eine lineare Berechnung von -12,5 % für einen leeren Block, 0 % bei der Zielgröße, bis zu +12,5 % für einen Block, der das Gaslimit erreicht. Das Gaslimit kann im Laufe der Zeit auf der Grundlage von Signalen der Validatoren sowie durch Netzwerk-Upgrades schwanken. Sie können die Änderungen des Gaslimits im Laufe der Zeit [hier einsehen](https://eth.blockscout.com/stats/averageGasLimit?interval=threeMonths). + +[Mehr über Blöcke](/developers/docs/blocks/) ### Berechnung der Gasgebühren in der Praxis {#calculating-fees-in-practice} @@ -97,15 +103,16 @@ Sie können ausdrücklich angeben, wie viel Sie bereit sind zu zahlen, damit Ihr Kurzum, Gasgebühren helfen dabei, das Ethereum-Netz sicher zu halten. Indem wir für jede Berechnung, die im Netzwerk ausgeführt wird, eine Gebühr verlangen, verhindern wir, dass Akteure mit böswilligen Absichten das Netzwerk spammen. Um versehentliche oder feindliche Endlosschleifen oder andere Verschwendung von Rechenlast in Code zu vermeiden, muss jede Transaktion eine Grenze für die Anzahl der Rechenschritte festlegen, die sie zur Codeausführung verwenden kann. Die Grundeinheit der Berechnung ist "Gas". -Auch wenn eine Transaktion ein Limit beinhaltet, wird jedes nicht verbrauchte Gas an den Nutzer zurückgegeben (d. h. `max fee - (base fee + tip)` wird zurückgegeben). +Obwohl eine Transaktion ein Limit enthält, wird jedes nicht in einer Transaktion verbrauchte Gas an den Nutzer zurückgegeben (z. B. wird `maximale Gebühr - (Grundgebühr + Trinkgeld)` zurückgegeben). -![Diagramm zeigt, wie ungenutztes Gas zurückerstattet wird](../transactions/gas-tx.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Diagramm, das zeigt, wie ungenutztes Gas zurückerstattet wird](../transactions/gas-tx.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ ## Was ist das Gaslimit? {#what-is-gas-limit} -Das Gaslimit bezieht sich auf die maximale Menge an Gas, die Sie bereit sind, bei einer Transaktion zu verbrauchen. Kompliziertere Transaktionen mit [Smart Contracts](/developers/docs/smart-contracts/) erfordern mehr Rechenarbeit und damit ein höheres Gaslimit als eine einfache Zahlung. Ein Standard-ETH-Transfer erfordert ein Gaslimit von 21.000 Gaseinheiten. +Das Gaslimit bezieht sich auf die maximale Menge an Gas, die Sie bereit sind, bei einer Transaktion zu verbrauchen. Kompliziertere Transaktionen, die [Smart Contracts](/developers/docs/smart-contracts/) beinhalten, erfordern mehr Rechenarbeit, weshalb sie ein höheres Gaslimit als eine einfache Zahlung benötigen. Ein Standard-ETH-Transfer erfordert ein Gaslimit von 21.000 Gaseinheiten. -Wenn Sie zum Beispiel ein Gaslimit von 50.000 für einen einfachen ETH-Transfer festlegen würden, würde die EVM 21.000 verbrauchen und Sie würden die restlichen 29.000 zurückbekommen. Wenn Sie jedoch zu wenig Gas angeben, z. B. ein Gaslimit von 20.000 für einen einfachen ETH-Transfer, wird die EVM Ihre 20.000 Gaseinheiten verbrauchen und versuchen, die Transaktion durchzuführen, aber sie wird nicht abgeschlossen. Die EVM macht dann alle Änderungen rückgängig, da der Validierer jedoch bereits Arbeit im Wert von 20.000 Gaseinheiten geleistet hat, ist dieses Gas verbraucht. +Wenn Sie zum Beispiel ein Gaslimit von 50.000 für einen einfachen ETH-Transfer festlegen würden, würde die EVM 21.000 verbrauchen und Sie würden die restlichen 29.000 zurückbekommen. Wenn Sie jedoch zu wenig Gas angeben, zum Beispiel ein Gaslimit von 20.000 für eine einfache ETH-Überweisung, wird die Transaktion während der Validierungsphase fehlschlagen. Sie wird abgelehnt, bevor sie in einen Block aufgenommen wird, und es wird kein Gas verbraucht. Andererseits, wenn eine Transaktion während der Ausführung kein Gas mehr hat (z. B. ein Smart Contract verbraucht auf halber Strecke all das Gas), wird die EVM alle Änderungen rückgängig machen, aber dennoch wird all das bereitgestellte Gas für die geleistete Arbeit verbraucht sein. ## Warum können die Gasgebühren so hoch sein? {#why-can-gas-fees-get-so-high} @@ -113,26 +120,32 @@ Die hohen Gasgebühren sind auf die Beliebtheit von Ethereum zurückzuführen. W ## Initiativen zur Senkung der Gaskosten {#initiatives-to-reduce-gas-costs} -Die [Skalierbarkeits-Upgrades](/roadmap/) für Ethereum waren letztendlich dazu gedacht, einige der Probleme mit den Gasgebühren lösen. Das wiederum soll die Plattform in die Lage versetzen, Tausende von Transaktionen pro Sekunde zu verarbeiten und global zu skalieren. +Die Ethereum-[Skalierbarkeits-Upgrades](/roadmap/) sollten letztendlich einige der Probleme mit den Gasgebühren lösen, was es der Plattform wiederum ermöglichen wird, Tausende von Transaktionen pro Sekunde zu verarbeiten und global zu skalieren. + +Die Skalierung auf Layer 2 ist eine der wichtigsten Initiativen, um die Gaskosten, das Nutzererlebnis und die Skalierbarkeit deutlich zu verbessern. -Die Skalierung auf Layer 2 ist eine der wichtigsten Initiativen, um die Gaskosten, das Nutzererlebnis und die Skalierbarkeit deutlich zu verbessern. [Mehr zur Skalierung mit Layer 2](/developers/docs/scaling/#layer-2-scaling) +[Mehr zur Layer-2-Skalierung](/developers/docs/scaling/#layer-2-scaling) -## Gasgebühren überwachen {#monitoring-gas-fees} +## Überwachung der Gasgebühren {#monitoring-gas-fees} Wenn Sie die Gaspreise überwachen möchten, damit Sie Ihre ETH günstiger verschicken können, stehen Ihnen unterschiedliche Tools zur Verfügung, wie zum Beispiel: -- [Etherscan](https://etherscan.io/gastracker) _Transaktionsgaspreis-Schätzer_ -- [Blocknative ETH Gas Estimator](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm) _Chrome-Erweiterung zur Gasschätzung, die sowohl Typ 0 Legacy-Transaktionen als auch Typ 2 EIP-1559-Transaktionen unterstützt_ -- [Cryptoneur Gas Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator) _Berechnen Sie Gasgebühren in Ihrer lokalen Währung für verschiedene Transaktionsarten im Mainnet, Arbitrum und Polygon._ +- [Etherscan](https://etherscan.io/gastracker) _Schätzung des Transaktions-Gaspreises_ +- [Blockscout](https://eth.blockscout.com/gas-tracker) _Open-Source-Schätzung des Transaktions-Gaspreises_ +- [ETH Gas Tracker](https://www.ethgastracker.com/) _Überwachen und verfolgen Sie die Gaspreise von Ethereum und L2, um Transaktionsgebühren zu senken und Geld zu sparen_ +- [Blocknative ETH Gas Estimator](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm) _Chrome-Erweiterung zur Gasschätzung, die sowohl Legacy-Transaktionen vom Typ 0 als auch EIP-1559-Transaktionen vom Typ 2 unterstützt._ +- [Cryptoneur Gas Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator) _Berechnen Sie Gasgebühren in Ihrer Landeswährung für verschiedene Transaktionsarten auf Mainnet, Arbitrum und Polygon._ -## Verwandte Werkzeuge {#related-tools} +## Zugehörige Werkzeuge {#related-tools} -- [Blocknative's Gas Platform](https://www.blocknative.com/gas) _API zur Gasschätzung von Blocknative's Global Mempool Data Platform_ +- [Blocknative's Gas Platform](https://www.blocknative.com/gas) _API zur Gasschätzung, betrieben von Blocknatives globaler Mempool-Datenplattform_ +- [Gas Network](https://gas.network) On-Chain-Gas-Orakel. Unterstützung für über 35 Chains. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Ethereum Gas erklärt](https://defiprime.com/gas) -- [Den Gasverbrauch von Smart Contracts reduzieren](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a) -- [Strategien für Programmierer zur Optimierung des Gasverbrauchs](https://www.alchemy.com/overviews/solidity-gas-optimization) -- [Spezifikationen zu EIP-1559](https://eips.ethereum.org/EIPS/eip-1559). -- [Tim Beikos EIP-1559-Ressourcen](https://hackmd.io/@timbeiko/1559-resources). +- [Reduzierung des Gasverbrauchs Ihrer Smart Contracts](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a) +- [Strategien zur Gasoptimierung für Entwickler](https://www.alchemy.com/overviews/solidity-gas-optimization) +- [EIP-1559-Dokumentation](https://eips.ethereum.org/EIPS/eip-1559). +- [Tim Beikos EIP-1559-Ressourcen](https://hackmd.io/@timbeiko/1559-resources) +- [EIP-1559: Mechanismen von Memes trennen](https://web.archive.org/web/20241126205908/https://research.2077.xyz/eip-1559-separating-mechanisms-from-memes) diff --git a/public/content/translations/de/developers/docs/ides/index.md b/public/content/translations/de/developers/docs/ides/index.md index 71ca31bcf64..ef4c4ddbcd7 100644 --- a/public/content/translations/de/developers/docs/ides/index.md +++ b/public/content/translations/de/developers/docs/ides/index.md @@ -1,6 +1,6 @@ --- title: Integrierte Entwicklungsumgebungen (Integrated Development Environments, IDEs) -description: +description: Erfahren Sie mehr über webbasierte und Desktop IDEs für die Ethereum-Entwicklung, einschließlich Remix, VS Code und beliebte Plugins. lang: de --- @@ -10,38 +10,37 @@ Wenn es um die Einrichtung einer [integrierten Entwicklungsumgebung (IDE)](https Wenn Sie sich erst einmal mit dem Code vertraut machen möchten, bevor Sie [eine lokale Entwicklungsumgebung aufsetzen](/developers/local-environment/), bieten sich diese Web-Apps an, die für die Entwicklung von Ethereum Smart Contracts konzipiert sind. -**[Remix](https://remix.ethereum.org/)** - **_Webbasierte IDE mit integrierter statischer Analyse und einer virtuellen Test-Blockchain-Maschine_** +**[Remix](https://remix.ethereum.org/)** – **_webbasierte IDE mit integrierter statischer Analyse und einer virtuellen Test-Blockchain-Maschine_** - [Dokumentation](https://remix-ide.readthedocs.io/en/latest/#) - [Gitter](https://gitter.im/ethereum/remix) -**[ChainIDE](https://chainide.com/)** - **_Eine cloudbasierte Multi-Chain-IDE_** +**[ChainIDE](https://chainide.com/)** – **_Eine cloudbasierte Multi-Chain-IDE_** - [Dokumentation](https://chainide.gitbook.io/chainide-english-1/) - [Hilfeforum](https://forum.chainide.com/) -**[Replit (Solidity Starter - Beta)](https://replit.com/@replit/Solidity-starter-beta)** - **_Eine anpassbare Entwicklungsumgebung für Ethereum mit Hot Reloading, Fehlerprüfung und erstklassiger Testnetz-Unterstützung_** +**[Replit (Solidity Starter – Beta)](https://replit.com/@replit/Solidity-starter-beta)** – **_Eine anpassbare Entwicklungsumgebung für Ethereum mit Hot-Reloading, Fehlerprüfung und erstklassiger Testnet-Unterstützung_** - [Dokumentation](https://docs.replit.com/) -**[Tenderly Sandbox](https://sandbox.tenderly.co/)** - **_Eine schnelle Prototyping-Umgebung, in der Sie Smart Contracts im Browser mit Solidity und JavaScript schreiben, ausführen und debuggen können_** +**[Tenderly Sandbox](https://sandbox.tenderly.co/)** – **_Eine schnelle Prototyping-Umgebung, in der Sie Smart Contracts im Browser mit Solidity und JavaScript schreiben, ausführen und debuggen können_** -**[EthFiddle](https://ethfiddle.com/)** - **_Webbasierte IDE, mit der Sie Ihren Smart Contract schreiben, kompilieren und debuggen können_** +**[EthFiddle](https://ethfiddle.com/)** – **_Webbasierte IDE, mit der Sie Ihren Smart Contract schreiben, kompilieren und debuggen können_** - [Gitter](https://gitter.im/loomnetwork/ethfiddle) ## Desktop-IDEs {#desktop-ides} -Die meisten etablierten IDEs haben Plugins entwickelt, um die Ethereum-Entwicklungserfahrung zu verbessern. Alle bieten mindestens Syntaxhervorhebung für [Smart Contract-Sprachen](/developers/docs/smart-contracts/languages/). +Die meisten etablierten IDEs haben Plugins entwickelt, um die Ethereum-Entwicklungserfahrung zu verbessern. Sie bieten mindestens eine Syntaxhervorhebung für [Smart-Contract-Sprachen](/developers/docs/smart-contracts/languages/). -**Visual Studio Code -** **_Eine professionelle plattformübergreifende IDE mit offizieller Ethereum-Unterstützung_** +**Visual Studio Code –** **_Professionelle plattformübergreifende IDE mit offizieller Ethereum-Unterstützung_** - [Visual Studio Code](https://code.visualstudio.com/) -- [Azure Blockchain Workbench](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/microsoft-azure-blockchain.azure-blockchain-workbench?tab=Overview) -- [Code-Beispiele](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md) +- [Codebeispiele](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md) - [GitHub](https://github.com/microsoft/vscode) -**JetBrains IDEs (IntelliJ IDEA, usw.) ** **_Unverzichtbare Werkzeuge für Softwareentwickler und -teams_** +**JetBrains IDEs (IntelliJ IDEA, usw.) -** **_Unverzichtbare Werkzeuge für Softwareentwickler und Teams_** - [JetBrains](https://www.jetbrains.com/) - [GitHub](https://github.com/JetBrains) @@ -49,17 +48,17 @@ Die meisten etablierten IDEs haben Plugins entwickelt, um die Ethereum-Entwicklu **Remix Desktop –** **_Erleben Sie Remix IDE auf Ihrem lokalen Rechner_** -- [Download](https://github.com/ethereum/remix-desktop/releases) +- [Herunterladen](https://github.com/ethereum/remix-desktop/releases) - [GitHub](https://github.com/ethereum/remix-desktop) -## Plug-ins und Erweiterungen {#plugins-extensions} +## Plugins und Erweiterungen {#plugins-extensions} -- [Solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) – Ethereum-Solidity-Sprache für Visual Studio Code -- [Solidity + Hardhat für VS Code](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) - Solidity- und Hardhat-Unterstützung durch das Hardhat-Team -- [Prettier Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity) – Code-Formatierer mit Prettier +- [solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) – Ethereum Solidity Language für Visual Studio Code +- [Solidity + Hardhat for VS Code](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) – Solidity- und Hardhat-Unterstützung durch das Hardhat-Team +- [Prettier Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity) – Code-Formatierung mit Prettier -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Ethereum IDEs](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _- Liste von Alchemy über Ethereum-IDEs_ +- [Ethereum-IDEs](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _– Alchemys Liste der Ethereum-IDEs_ -_Kennst du eine Community-Ressource, die dir geholfen hat? Bearbeite diese Seite und füge sie hinzu!_ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/index.md b/public/content/translations/de/developers/docs/index.md index dfb508cc36b..562e927953b 100644 --- a/public/content/translations/de/developers/docs/index.md +++ b/public/content/translations/de/developers/docs/index.md @@ -6,13 +6,13 @@ lang: de Diese Dokumentation soll Ihnen dabei helfen, mit Ethereum zu entwickeln. Darin wird das Konzept von Ethereum erläutert sowie der Technologie-Stack von Ethereum. Außerdem sind fortgeschrittene Themen für komplexere Anwendungen und Anwendungsfälle dokumentiert. -Diese Dokumentation wird von der Open-Source-Community gepflegt, also zögern Sie nicht, neue Themen vorzuschlagen oder neue Inhalte hinzuzufügen. Geben Sie dabei Beispiele an, wenn das Ihrer Meinung nach hilfreich ist. Die gesamte Entwicklungsdokumentation kann auf GitHub bearbeitet werden. Falls Sie sich nicht sicher sind wie, [befolgen Sie einfach diese Anleitung](https://github.com/ethereum/ethereum-org-website/blob/dev/docs/editing-markdown.md). +Diese Dokumentation wird von der Open-Source-Community gepflegt, also zögern Sie nicht, neue Themen vorzuschlagen oder neue Inhalte hinzuzufügen. Geben Sie dabei Beispiele an, wenn das Ihrer Meinung nach hilfreich ist. Die gesamte Dokumentation kann über GitHub bearbeitet werden – wenn Sie sich nicht sicher sind, wie das geht, [folgen Sie diesen Anweisungen](https://github.com/ethereum/ethereum-org-website/blob/dev/docs/editing-markdown.md). ## Entwicklungsmodule {#development-modules} Wenn das Ihr erster Versuch bei der Entwicklung mit Ethereum ist, empfehlen wir Ihnen, ganz vorne zu beginnen und sich wie bei einem Buch durchzuarbeiten. -### Grundsätzliche Themen {#foundational-topics} +### Grundlegende Themen {#foundational-topics} @@ -20,6 +20,6 @@ Wenn das Ihr erster Versuch bei der Entwicklung mit Ethereum ist, empfehlen wir -### Fortgeschritten {#advanced} +### Erweitert {#advanced} diff --git a/public/content/translations/de/developers/docs/intro-to-ether/index.md b/public/content/translations/de/developers/docs/intro-to-ether/index.md index e6407726993..628465f8af4 100644 --- a/public/content/translations/de/developers/docs/intro-to-ether/index.md +++ b/public/content/translations/de/developers/docs/intro-to-ether/index.md @@ -1,12 +1,12 @@ --- -title: Einführung in Ether +title: "Ether: Eine technische Einführung" description: Eine Einführung für Entwickler in die Kryptowährung Ether. lang: de --- ## Voraussetzungen {#prerequisites} -Damit du diese Seite besser verstehst, empfehlen wir dir, zuerst [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. +Damit du diese Seite besser verstehen kannst, empfehlen wir dir, zuerst [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. ## Was ist eine Kryptowährung? {#what-is-a-cryptocurrency} @@ -18,17 +18,17 @@ Die erste Kryptowährung war Bitcoin, die vom Pseudonym Satoshi Nakamoto erschaf ## Was ist Ether? {#what-is-ether} -**Ether (ETH)** ist die Kryptowährung, die für viele Dinge im Ethereum-Netzwerk verwendet wird. Grundsätzlich ist es die einzig akzeptable Form der Bezahlung von Transaktionsgebühren, und nach [der Zusammenführung](/roadmap/merge) wird Ether benötigt, um Blöcke auf dem Mainnet zu validieren und vorzuschlagen. Ether werden u. a. auch als primäre Form von Sicherheiten auf den [DeFi](/defi)-Kreditmärkten, als Rechnungseinheit auf NFT-Marktplätzen, als Bezahlung für die Erbringung von Dienstleistungen oder für den Verkauf von Gütern in der realen Welt und mehr verwendet. +**Ether (ETH)** ist die Kryptowährung, die für viele Dinge im Ethereum-Netzwerk verwendet wird. Grundsätzlich ist es die einzig akzeptable Zahlungsform für Transaktionsgebühren und nach [The Merge](/roadmap/merge) wird Ether benötigt, um Blöcke auf dem Mainnet zu validieren und vorzuschlagen. Ether wird auch als primäre Form von Sicherheiten in den [DeFi](/defi)-Kreditmärkten, als Rechnungseinheit auf NFT-Marktplätzen, als Zahlung für erbrachte Dienstleistungen oder den Verkauf von realen Gütern und mehr verwendet. -Ethereum ermöglicht es Entwicklern, [**dezentrale Anwendungen (dapps)**](/developers/docs/dapps) zu erstellen, die sich alle einen Pool von Rechenleistung teilen. Da dieser gemeinsame Pool endlich ist, braucht Ethereum einen Mechanismus, um zu bestimmen, wer ihn nutzen darf. Andernfalls könnte eine App versehentlich oder böswillig alle Netzwerkressourcen verbrauchen, was anderen den Zugriff auf die App verwehren würde. +Ethereum ermöglicht es Entwicklern, [**dezentralisierte Anwendungen (Dapps)**](/developers/docs/dapps) zu erstellen, die sich alle einen Pool an Rechenleistung teilen. Da dieser gemeinsame Pool endlich ist, braucht Ethereum einen Mechanismus, um zu bestimmen, wer ihn nutzen darf. Andernfalls könnte eine App versehentlich oder böswillig alle Netzwerkressourcen verbrauchen, was anderen den Zugriff auf die App verwehren würde. -Die Kryptowährung Ether unterstützt einen Preismechanismus für die Rechenleistung von Ethereum. Wenn Nutzer/Nutzerinnen eine Transaktion durchführen wollen, müssen sie Ether bezahlen, damit ihre Transaktion auf der Blockchain anerkannt wird. Diese Nutzungskosten werden als [Gasgebühren](/developers/docs/gas/) bezeichnet, und die Gasgebühr hängt von der Menge an Rechenleistung ab, die für die Ausführung der Transaktion benötigt wird, sowie von der netzwerkweiten Nachfrage nach Rechenleistung zu diesem Zeitpunkt. +Die Kryptowährung Ether unterstützt einen Preismechanismus für die Rechenleistung von Ethereum. Wenn Nutzer/Nutzerinnen eine Transaktion durchführen wollen, müssen sie Ether bezahlen, damit ihre Transaktion auf der Blockchain anerkannt wird. Diese Nutzungskosten werden als [Gasgebühren](/developers/docs/gas/) bezeichnet. Die Gasgebühr hängt von der Menge an Rechenleistung ab, die für die Ausführung der Transaktion erforderlich ist, und von der netzwerkweiten Nachfrage nach Rechenleistung zu diesem Zeitpunkt. Selbst wenn eine böswillige Dapp eine Endlosschleife einreichen würde, ginge der Transaktion irgendwann der Ether aus und sie würde beendet, so dass das Netzwerk wieder zur Normalität zurückkehren könnte. -Es ist üblich, Ethereum und Ether [zu verwechseln](https://abcnews.go.com/Business/bitcoin-slumps-week-low-amid-renewed-worries-chinese/story?id=78399845); wenn Leute den "Preis von Ethereum" erwähnen, beschreiben sie den Preis von Ether. +Ethereum und Ether werden [häufig verwechselt](https://abcnews.go.com/Business/bitcoin-slumps-week-low-amid-renewed-worries-chinese/story?id=78399845) – wenn vom "Preis von Ethereum" die Rede ist, ist damit der Preis von Ether gemeint. -## Ether-Minting {#minting-ether} +## Ether prägen {#minting-ether} Minting ist der Prozess, bei dem neuer Ether im Ethereum-Ledger erstellt wird. Das zugrundeliegende Ethereum-Protokoll erstellt den neuen Ether, und es ist nicht möglich, dass ein Nutzer Ether erstellt. @@ -38,15 +38,15 @@ Ether wird als Belohnung für jeden vorgeschlagenen Block und an jedem Epochen-C Neben der Erzeugung von Ether durch Blockbelohnungen kann Ether auch durch einen Prozess namens "Burning" zerstört werden. Wenn Ether verbrannt wird, wird er dauerhaft aus dem Verkehr gezogen. -Bei jeder Transaktion auf Ethereum wird Ether verbrannt. Wenn Nutzer für ihre Transaktionen bezahlen, wird eine grundlegende Gasgebühr vernichtet, die vom Netzwerk entsprechend der Transaktion festgelegt wird. Dies, zusammen mit variablen Blockgrößen und einer maximalen Gasgebühr, vereinfacht die Abschätzung der Transaktionsgebühren auf Ethereum. Wenn die Nachfrage im Netzwerk hoch ist, können [Blöcke](https://etherscan.io/block/12965263) mehr Ether verbrauchen, als sie minten, wodurch die Ausgabe von Ether effektiv ausgeglichen wird. +Bei jeder Transaktion auf Ethereum wird Ether verbrannt. Wenn Nutzer für ihre Transaktionen bezahlen, wird eine grundlegende Gasgebühr vernichtet, die vom Netzwerk entsprechend der Transaktion festgelegt wird. Dies, zusammen mit variablen Blockgrößen und einer maximalen Gasgebühr, vereinfacht die Abschätzung der Transaktionsgebühren auf Ethereum. Wenn die Nachfrage im Netzwerk hoch ist, können [Blöcke](https://eth.blockscout.com/block/22580057) mehr Ether verbrennen, als sie prägen, wodurch die Ether-Emission effektiv ausgeglichen wird. -Das Verbrennen der Grundgebühr verhindert, dass ein Block-Produzent Transaktionen manipulieren kann. Wenn beispielsweise Block-Ersteller die Grundgebühr erhalten, könnten sie ihre eigenen Transaktionen kostenlos einbeziehen und die Grundgebühr für alle anderen erhöhen. Alternativ könnten sie die Grundgebühr an einige Nutzer außerhalb der Kette zurückerstatten, was zu einem undurchsichtigen und komplexen Markt für Transaktionsgebühren führen würde. +Das Verbrennen der Grundgebühr verhindert, dass ein Block-Produzent Transaktionen manipulieren kann. Wenn beispielsweise Block-Ersteller die Grundgebühr erhalten, könnten sie ihre eigenen Transaktionen kostenlos einbeziehen und die Grundgebühr für alle anderen erhöhen. Alternativ dazu könnten sie einigen Nutzern die Basisgebühr off-chain zurückerstatten, was zu einem undurchsichtigeren und komplexeren Transaktionsgebührenmarkt führen würde. -## Stückelung von Ether {#denominations} +## Ether-Einheiten {#denominations} Da der Wert vieler Transaktionen auf Ethereum gering ist, hat Ether mehrere Stückelungen, die als kleinere Rechnungseinheiten bezeichnet werden können. Von diesen Stückelungen sind Wei und gwei besonders wichtig. -Wei ist die kleinstmögliche Menge an Ether. Daher basieren viele technische Implementierungen, wie das [Ethereum Yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf), auf Berechnungen in Wei. +Wei ist die kleinstmögliche Menge an Ether. Aus diesem Grund werden bei vielen technischen Implementierungen, wie z. B. im [Ethereum Yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf), alle Berechnungen in Wei durchgeführt. Gwei, kurz für Giga-Wei, wird oft verwendet, um die Gaskosten auf Ethereum zu beschreiben. @@ -55,24 +55,24 @@ Gwei, kurz für Giga-Wei, wird oft verwendet, um die Gaskosten auf Ethereum zu b | Wei | 10-18 | Technische Implementierungen | | Gwei | 10-9 | Menschlich lesbare Gasgebühren | -## Überweisung von Ether {#transferring-ether} +## Ether übertragen {#transferring-ether} -Jede Transaktion auf Ethereum enthält ein `value`-Feld, das den zu überweisenden Ether-Betrag in Wei angibt, der von der Adresse des Absenders an die Adresse des Empfängers gesendet wird. +Jede Transaktion auf Ethereum enthält ein `value`-Feld, das den zu übertragenden Ether-Betrag in Wei angibt, der von der Adresse des Absenders an die Adresse des Empfängers gesendet wird. -Wenn es sich bei der Empfängeradresse um einen [Smart Contract](/developers/docs/smart-contracts/) handelt, kann dieser übertragene Ether zum Bezahlen von Gas verwendet werden, wenn der Smart Contract seinen Code ausführt. +Wenn die Empfängeradresse ein [Smart Contract](/developers/docs/smart-contracts/) ist, kann dieser übertragene Ether zur Bezahlung von Gas verwendet werden, wenn der Smart Contract seinen Code ausführt. -[Weitere Informationen zu Transaktionen](/developers/docs/transactions/) +[Mehr zu Transaktionen](/developers/docs/transactions/) -## Ether-Saldo abfragen {#querying-ether} +## Ether abfragen {#querying-ether} -Nutzer können den Ether-Saldo jedes [Kontos](/developers/docs/accounts/) abfragen, indem sie das `balance`-Feld des Kontos einsehen, das den Ether-Bestand in Wei anzeigt. +Benutzer können den Ether-Saldo jedes [Kontos](/developers/docs/accounts/) abfragen, indem sie das `balance`-Feld des Kontos einsehen, das den Ether-Bestand in Wei anzeigt. -[Etherscan](https://etherscan.io) ist ein beliebtes Tool zur Überprüfung von Adresssalden über eine webbasierte Anwendung. Zum Beispiel zeigt [diese Etherscan-Seite](https://etherscan.io/address/0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae) den Kontostand der Ethereum Foundation. Kontostände können auch über Wallets oder direkt durch Anfragen an die Knoten abgefragt werden. +[Etherscan](https://etherscan.io) und [Blockscout](https://eth.blockscout.com) sind beliebte webbasierte Anwendungen, um die Guthaben von Adressen einzusehen. Zum Beispiel zeigt [diese Blockscout-Seite](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) das Guthaben der Ethereum Foundation. Kontostände können auch über Wallets oder direkt durch Anfragen an die Knoten abgefragt werden. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Definition von Ether und Ethereum](https://www.cmegroup.com/education/courses/introduction-to-ether/defining-ether-and-ethereum.html) - _CME Group_ +- [Definition von Ether und Ethereum](https://www.cmegroup.com/education/courses/introduction-to-ether/defining-ether-and-ethereum.html) – _CME Group_ - [Ethereum Whitepaper](/whitepaper/): Der ursprüngliche Vorschlag für Ethereum. Dieses Dokument enthält eine Beschreibung von Ether und der Beweggründe für seine Entstehung. -- [Gwei-Rechner](https://www.alchemy.com/gwei-calculator): Dieser Gwei-Rechner konvertiert Wei, Gwei und Ether. Geben Sie einfach einen Betrag an Wei, Gwei oder ETH ein, die Umrechnung erhalten Sie automatisch. +- [Gwei-Rechner](https://www.alchemy.com/gwei-calculator): Mit diesem Gwei-Rechner kannst du ganz einfach Wei, Gwei und Ether umrechnen. Geben Sie einfach einen Betrag an Wei, Gwei oder ETH ein, die Umrechnung erhalten Sie automatisch. -_Kennst du eine Community-Ressource, die dir geholfen hat? Bearbeite diese Seite und füge sie hinzu!_ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/intro-to-ethereum/index.md b/public/content/translations/de/developers/docs/intro-to-ethereum/index.md index d7481551ac1..293cb831280 100644 --- a/public/content/translations/de/developers/docs/intro-to-ethereum/index.md +++ b/public/content/translations/de/developers/docs/intro-to-ethereum/index.md @@ -1,5 +1,5 @@ --- -title: Einleitung zu Ethereum +title: Technische Einführung zu Ethereum description: Die Einführung eines dApp Entwicklers in die Kernkonzepte von Ethereum. lang: de --- @@ -16,7 +16,7 @@ Jeder Computer im Netzwerk muss jedem neuen Block und der Kette als Ganzes zusti Ethereum verwendet einen [Proof-of-Stake-basierten Konsensmechanismus](/developers/docs/consensus-mechanisms/pos/). Jeder, der der Chain neue Blöcke hinzufügen möchte, muss seine ETH – die native Kryptowährung der Ethereum-Blockchain – staken, die als Sicherheit und zum Ausführen der Validatorsoftware verwendet werden können. Diese "Validatoren" können dann nach dem Zufallsprinzip ausgewählt werden, um Blöcke einzureichen, die dann zur Überprüfung an andere Validatoren gesendet und zur Blockchain hinzugefügt werden. Es gibt ein System mit Belohnungen bzw. Strafen, das für die Teilnehmer einen starken Anreiz darstellt, ehrlich zu agieren und weitestgehend online verfügbar zu sein. -Wenn Sie sehen möchten, wie Blockchain-Daten gehasht und anschließend an den Verlauf der Blockreferenzen angehängt werden, sollten Sie sich [diese Demo](https://andersbrownworth.com/blockchain/blockchain) von Anders Brownworth und das dazugehörige Video unten ansehen. +Wenn Sie sehen möchten, wie Blockchain-Daten gehasht und anschließend an den Verlauf der Blockreferenzen angehängt werden, sollten Sie sich unbedingt [diese Demo](https://andersbrownworth.com/blockchain/blockchain) von Anders Brownworth und das dazugehörige Video unten ansehen. Sehen Sie sich die Erklärung von Anders Brownworth zu Blockchains an: @@ -42,9 +42,9 @@ Die Höhe der gezahlten ETH entspricht den für die Berechnung benötigten Resso ETH wird auch verwendet, um dem Netzwerk auf drei Arten kryptoökonomische Sicherheit zu geben: 1) Es wird als Mittel zur Belohnung von Validierern verwendet, die Blöcke vorschlagen oder unehrliches Verhalten anderer Validierer aufdecken; 2) Es wird von Validierern als Sicherheit gegen unehrliches Verhalten eingesetzt – wenn Validierer versuchen, sich falsch zu verhalten, kann das die Zerstörung ihrer ETH zur Folge haben; 3) Es wird verwendet, um "Stimmen" für neu vorgeschlagene Blöcke abzuwägen, was in die Fork-Auswahl des Konsensmechanismus einfließt. -## Was sind Smart Contracts? {#what-are-smart-contracts} +## Was sind Smart Contracts? Was sind Smart Contracts? {#what-are-smart-contracts} -In der Praxis schreiben die Teilnehmenden nicht jedes Mal einen neuen Code, wenn sie eine Berechnung auf der EVM anfordern wollen. Vielmehr laden Anwendungsentwickler Programme (wiederverwendbare Codeschnipsel) in den EVM-Speicher hoch, und die Nutzer stellen Anfragen, um diese Codeschnipsel mit unterschiedlichen Parametern auszuführen. Wir nennen die Programme, die hochgeladen und durch das Netzwerk ausgeführt werden, Smart Contracts (intelligente Verträge). +In der Praxis schreiben die Teilnehmenden nicht jedes Mal einen neuen Code, wenn sie eine Berechnung auf der EVM anfordern wollen. Vielmehr laden Anwendungsentwickler Programme (wiederverwendbare Codeschnipsel) in den EVM-Speicher hoch, und die Nutzer stellen Anfragen, um diese Codeschnipsel mit unterschiedlichen Parametern auszuführen. Wir nennen die Programme, die in das Netzwerk hochgeladen und von diesem ausgeführt werden, "Smart Contracts". Ganz grundsätzlich können Sie sich einen Smart Contract wie eine Art Verkaufsautomat vorstellen: ein Skript, das, wenn es mit bestimmten Parametern aufgerufen wird, bestimmte Aktionen oder Berechnungen durchführt, wenn bestimmte Bedingungen erfüllt sind. Zum Beispiel könnte ein einfacher Verkäufer-Smart-Contract das Eigentum an einem digitalen Vermögenswert schaffen und zuweisen, wenn der Aufrufer ("caller") ETH an einen bestimmten Empfänger sendet. @@ -60,21 +60,21 @@ Die Sequenz aller Blöcke, die dem Ethereum-Netzwerk in der Geschichte des Netzw ### ETH {#eth} -**Ether (ETH)** ist die einheimische Kryptowährung von Ethereum. Nutzer zahlen ETH an andere Nutzer, damit ihre Anfragen zur Ausführung des Codes erfüllt werden. +**Ether (ETH)** ist die native Kryptowährung von Ethereum. Nutzer zahlen ETH an andere Nutzer, damit ihre Anfragen zur Ausführung des Codes erfüllt werden. -[Mehr zu ETH](/developers/docs/intro-to-ether/) +[Mehr über ETH](/developers/docs/intro-to-ether/) ### EVM {#evm} Die virtuelle Ethereum-Machine ist der globale virtuelle Computer, dessen Zustand jeder Teilnehmer im Ethereum-Netzwerk speichert und dem er zustimmt. Jeder Teilnehmer kann die Ausführung von beliebigem Code auf der EVM beantragen. Jede Codeausführung ändert den Zustand der EVM. -[Mehr zur EVM](/developers/docs/evm/) +[Mehr über die EVM](/developers/docs/evm/) ### Nodes {#nodes} Die realen Maschinen, die den EVM-Zustand speichern. Knoten kommunizieren miteinander, um Informationen über den EVM-Zustand und neue Zustandsänderungen zu verbreiten. Alle Nutzer können auch die Ausführung von Code anfordern, indem sie eine Anfrage zur Codeausführung von einem Knoten aus senden. Das Ethereum-Netzwerk selbst ist das Aggregat aller Ethereum-Knoten und deren Kommunikation. -[Mehr zu Nodes](/developers/docs/nodes-and-clients/) +[Mehr über Nodes](/developers/docs/nodes-and-clients/) ### Konten {#accounts} @@ -96,21 +96,29 @@ Eine "Transaktionsanfrage" ist der formale Begriff für eine Anfrage zur Codeaus Da das Transaktionsvolumen sehr hoch ist, werden die Transaktionen in Stapeln oder Blöcken "übertragen". Blöcke enthalten in der Regel Dutzende bis Hunderte von Transaktionen. -[Mehr zu Blöcken](/developers/docs/blocks/) +[Mehr über Blöcke](/developers/docs/blocks/) ### Smart Contracts {#smart-contracts} -Ein wiederverwendbarer Codeschnipsel (ein Programm), den ein Entwickler in den EVM-Zustand veröffentlicht. Jeder kann anfragen, dass der Smart-Contract-Code ausgeführt wird, indem er eine Transaktionsanfrage stellt. Da Entwickler beliebige ausführbare Anwendungen in die EVM (Spiele, Marktplätze, Finanzinstrumente etc.) schreiben können, werden diese oft auch [dApps oder dezentralisierte Apps](/developers/docs/dapps/) genannt. +Ein wiederverwendbarer Codeschnipsel (ein Programm), den ein Entwickler in den EVM-Zustand veröffentlicht. Jeder kann anfragen, dass der Smart-Contract-Code ausgeführt wird, indem er eine Transaktionsanfrage stellt. Da Entwickler beliebige ausführbare Anwendungen in die EVM schreiben können (Spiele, Marktplätze, Finanzinstrumente usw.) indem sie Smart Contracts veröffentlichen, werden diese oft auch [Dapps oder dezentrale Anwendungen](/developers/docs/dapps/) genannt. -[Mehr zu Smart Contracts](/developers/docs/smart-contracts/) +[Mehr über Smart Contracts](/developers/docs/smart-contracts/) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Ethereum-Whitepaper](/whitepaper/) -- [Wie funktioniert Ethereum überhaupt?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) – _Preethi Kasireddy_ (**Hinweis:** Diese Ressource ist immer noch wertvoll, doch Sie sollten sich bewusst sein, dass sie aus der Zeit vor [der Zusammenführung](/roadmap/merge) stammt und sich daher noch auf den Proof-of-Work-Mechanismus von Ethereum bezieht – Ethereum ist jetzt durch [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) gesichert) +- [Wie funktioniert Ethereum eigentlich?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) - _Preethi Kasireddy_ (**Hinweis:** Diese Ressource ist immer noch wertvoll, aber beachten Sie, dass sie aus der Zeit vor [der Zusammenführung](/roadmap/merge) stammt und sich daher noch auf den Proof-of-Work-Mechanismus von Ethereum bezieht – Ethereum wird jetzt tatsächlich durch [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) gesichert) -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +### Eher der visuelle Lernende? {#visual-learner} + +Diese Videoserie bietet eine gründliche Auseinandersetzung mit grundlegenden Themen: + + + +[Ethereum-Grundlagen-Playlist](https://youtube.com/playlist?list=PLqgutSGloqiJyyoL0zvLVFPS-GMD2wKa5&si=kZTf5I7PKGTXDsOZ) + +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Tutorials {#related-tutorials} -- [Eine Anleitung für Entwickler zu Ethereum, Teil 1](/developers/tutorials/a-developers-guide-to-ethereum-part-one/) _ – eine einsteigerfreundliche Einführung zu Ethereum mit Python und web3.py_ +- [Eine Anleitung für Entwickler zu Ethereum, Teil 1](/developers/tutorials/a-developers-guide-to-ethereum-part-one/) _– Eine sehr einsteigerfreundliche Einführung in Ethereum mit Python und web3.py_ diff --git a/public/content/translations/de/developers/docs/mev/index.md b/public/content/translations/de/developers/docs/mev/index.md index 3f501d1e37c..f69d2a9d96b 100644 --- a/public/content/translations/de/developers/docs/mev/index.md +++ b/public/content/translations/de/developers/docs/mev/index.md @@ -1,42 +1,40 @@ --- -title: Maximaler extrahierbarer Wert (MEV) -description: Eine Einführung in den maximal extrahierbaren Wert (MEV) +title: Maximal extrahierbarer Wert (MEV) +description: Einführung in den maximal extrahierbaren Wert (MEV) lang: de --- Der Maximal extrahierbare Wert (MEV) bezieht sich auf den maximalen Wert, der aus der Blockproduktion extrahiert werden kann und der über die Standard-Blockprämie und die Gasgebühren hinausgeht, indem Transaktionen in einem Block einbezogen, ausgeschlossen oder in der Reihenfolge geändert werden. -## Durch Miner extrahierbarer Wert +## Maximal extrahierbarer Wert {#maximal-extractable-value} -Dieses Konzept wurde erstmals im Rahmen des [Arbeitsnachweis](/developers/docs/consensus-mechanisms/pow/) angewandt und anfangs als „miner extractable value" bezeichnet. Das liegt daran, dass beim Arbeitsnachweis die Miner den Einschluss, den Ausschluss und die Reihenfolge von Transaktionen kontrollieren. Nach der Umstellung auf Proof-of-Stake über [Die Zusammenführung](/roadmap/merge) werden jedoch die Validierer für diese Rollen verantwortlich sein, und Mining wird nicht mehr möglich sein. Die Methoden der Wertextraktion werden auch nach dieser Umstellung fortbestehen, so dass eine Namensänderung erforderlich war. Um das gleiche Akronym der Kontinuität willen und gleichzeitig die gleiche grundlegende Bedeutung beizubehalten, wird jetzt der „maximal extrahierbare Wert" als umfassenderer Ersatz verwendet. +Der maximal extrahierbare Wert wurde erstmals im Kontext von [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) angewendet und zunächst als "von Minern extrahierbarer Wert" bezeichnet. Das liegt daran, dass beim Arbeitsnachweis die Miner den Einschluss, den Ausschluss und die Reihenfolge von Transaktionen kontrollieren. Seit dem Übergang zu Proof-of-Stake durch [The Merge](/roadmap/merge) sind jedoch Validatoren für diese Rollen verantwortlich, und Mining ist kein Bestandteil des Ethereum-Protokolls mehr. Die Methoden zur Wertextraktion existieren allerdings weiterhin, weshalb nun der Begriff "Maximal extrahierbarer Wert" verwendet wird. ## Voraussetzungen {#prerequisites} -Stellen Sie sicher, dass Sie mit [Transaktionen](/developers/docs/transactions/), [Blöcken](/developers/docs/blocks/), [Gas](/developers/docs/gas/) und [Mining](/developers/docs/consensus-mechanisms/pow/mining/) vertraut sind. Eine Vertrautheit mit [dApps](/apps/) und [DeFi](/defi/) ist ebenfalls hilfreich. +Stellen Sie sicher, dass Sie mit [Transaktionen](/developers/docs/transactions/), [Blöcken](/developers/docs/blocks/), [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) und [Gas](/developers/docs/gas/) vertraut sind. Eine Vertrautheit mit [Dapps](/apps/) und [DeFi](/defi/) ist ebenfalls hilfreich. -## MEV-Extrahierung {#mev-extraction} +## MEV-Extraktion {#mev-extraction} -Theoretisch kommt MEV ausschließlich den Minern zugute, da Miner die einzige Partei sind, welche die Ausführung einer profitablen MEV-Gelegenheit garantieren kann (zumindest in der aktuellen Proof-of-Work-Kette; dies wird sich nach [Die Zusammenführung](/roadmap/merge/) ändern). In der Praxis wird jedoch ein großer Teil des MEV von unabhängigen Netzwerkteilnehmern, den sogenannten „Suchenden", extrahiert Die Suchenden lassen komplexe Algorithmen auf Blockchain-Daten laufen, um profitable MEV-Möglichkeiten zu erkennen, und haben Bots, die diese profitablen Transaktionen automatisch an das Netzwerk übermitteln. +Theoretisch entfällt der MEV vollständig auf die Validator, da sie die einzige Partei sind, die die Ausführung einer gewinnträchtigen MEV-Gelegenheit garantieren können. In der Praxis wird jedoch ein großer Teil des MEV von unabhängigen Netzwerkteilnehmern, den sogenannten „Suchenden", extrahiert Die Suchenden lassen komplexe Algorithmen auf Blockchain-Daten laufen, um profitable MEV-Möglichkeiten zu erkennen, und haben Bots, die diese profitablen Transaktionen automatisch an das Netzwerk übermitteln. -Die Miner erhalten ohnehin einen Teil des vollen MEV-Betrags, weil die Suchenden bereit sind, hohe Gasgebühren zu zahlen (die an die Miner gehen), um im Gegenzug die Wahrscheinlichkeit zu erhöhen, dass ihre profitablen Transaktionen in einen Block aufgenommen werden. Unter der Annahme, dass die Suchenden ökonomisch rational handeln, wird die Gasgebühr, die ein Suchender zu zahlen bereit ist, bis zu 100 % seines MEV betragen (denn wenn die Gasgebühr höher wäre, würde der Suchende Geld verlieren). +Validatoren erhalten jedoch auf jeden Fall einen Teil der vollen MEV-Summe, da Suchende bereit sind, hohe Gasgebühren (die an die Validator gehen) zu zahlen, um die Wahrscheinlichkeit zu erhöhen, dass ihre gewinnträchtigen Transaktionen in einen Block aufgenommen werden. Unter der Annahme, dass die Suchenden ökonomisch rational handeln, wird die Gasgebühr, die ein Suchender zu zahlen bereit ist, bis zu 100 % seines MEV betragen (denn wenn die Gasgebühr höher wäre, würde der Suchende Geld verlieren). -Bei einigen stark umkämpften MEV-Möglichkeiten wie [DEX-Arbitrage](#mev-examples-dex-arbitrage) müssen die Suchenden unter Umständen 90 % oder sogar mehr ihrer gesamten MEV-Einnahmen in Form von Gasgebühren an den Miner zahlen, weil so viele Leute denselben profitablen Arbitragehandel betreiben wollen. Denn nur wenn sie das Geschäft mit dem höchsten Gaspreis einreichen, ist gewährleistet, dass ihr Arbitragegeschäft zustande kommt. +Bei einigen stark umkämpften MEV-Gelegenheiten, wie der [DEX-Arbitrage](#mev-examples-dex-arbitrage), müssen Searcher möglicherweise 90 % oder sogar mehr ihrer gesamten MEV-Einnahmen als Gasgebühren an den Validator zahlen, da so viele Leute denselben profitablen Arbitrage-Handel durchführen möchten. Denn nur wenn sie das Geschäft mit dem höchsten Gaspreis einreichen, ist gewährleistet, dass ihr Arbitragegeschäft zustande kommt. -### Gas-Golfen {#mev-extraction-gas-golfing} +### Gas-Golfing {#mev-extraction-gas-golfing} Diese Dynamik hat dazu geführt, dass das „Gas Golfen" - also das Programmieren von Transaktionen so, dass sie möglichst wenig Gas verbrauchen - zu einem Wettbewerbsvorteil geworden ist, weil es den Suchenden ermöglicht, einen höheren Gaspreis festzulegen und gleichzeitig ihre gesamten Gasgebühren konstant zu halten (da Gasgebühren = Gaspreis \* verbrauchtes Gas). -Einige bekannte Gas-Golf-Techniken sind: Verwenden von Adressen, die mit einer langen Reihe von Nullen beginnen (z. B. [0x0000000000C521824EaFf97Eac7B73B084ef9306](https://etherscan.io/address/0x0000000000c521824eaff97eac7b73b084ef9306)), da sie weniger Platz (und damit Gas) zum Speichern benötigen; und das Belassen kleiner [ERC-20](/developers/docs/standards/tokens/erc-20/)-Token-Guthaben in Verträgen, da es mehr Gas kostet, einen Speicher-Slot zu initialisieren (der Fall, wenn das Guthaben gleich 0 ist), als einen Speicherplatz zu aktualisieren. Die Suche nach weiteren Techniken zur Verringerung des Gasverbrauchs ist ein aktiver Research-Bereich unter den Forschern. +Einige bekannte Gas-Golfing-Techniken umfassen: die Verwendung von Adressen, die mit einer langen Reihe von Nullen beginnen (z. B. [0x0000000000C521824EaFf97Eac7B73B084ef9306](https://eth.blockscout.com/address/0x0000000000C521824EaFf97Eac7B73B084ef9306)), da sie weniger Platz (und damit Gas) zum Speichern benötigen; und das Belassen kleiner [ERC-20](/developers/docs/standards/tokens/erc-20/)-Token-Guthaben in Verträgen, da es mehr Gas kostet, einen Speicher-Slot zu initialisieren (der Fall, wenn das Guthaben 0 ist), als einen Speicher-Slot zu aktualisieren. Die Suche nach weiteren Techniken zur Verringerung des Gasverbrauchs ist ein aktiver Research-Bereich unter den Forschern. -### Generalisierte Vorläufer {#mev-extraction-generalized-frontrunners} +### Verallgemeinerte Frontrunner {#mev-extraction-generalized-frontrunners} Anstatt komplexe Algorithmen zu programmieren, um gewinnbringende MEV-Möglichkeiten zu erkennen, lassen einige Suchende generalisierte Vorläufer betreiben. Generalisierte Vorläufer sind Bots, die den Mempool beobachten, um profitable Transaktionen zu erkennen. Der Vorläufer kopiert den Code der potenziell profitablen Transaktion, ersetzt die Adressen durch die Adresse des Vorläufers und führt die Transaktion lokal aus, um zu überprüfen, ob die geänderte Transaktion zu einem Gewinn für die Adresse des Vorläufers führt. Wenn die Transaktion tatsächlich rentabel ist, reicht der Vorläufer die geänderte Transaktion mit der ersetzten Adresse und einem höheren Gaspreis ein als den der Original-Transaktion und erhält so den MEV des ursprünglichen Suchenden. ### Flashbots {#mev-extraction-flashbots} -Flashbots ist ein unabhängiges Projekt, das den Go-Ethereum-Client um einen Dienst erweitert, der es Suchenden ermöglicht, MEV-Transaktionen an Miner zu übermitteln, ohne sie dem öffentlichen Mempool zu offenzulegen. Dadurch wird verhindert, dass Transaktionen von allgemeinen Vorläufern ausgeführt werden. - -Zum jetzigen Zeitpunkt wird ein erheblicher Teil der MEV-Transaktionen über Flashbots abgewickelt, was bedeutet, dass allgemeine Vorläufer nicht mehr so effektiv sind wie früher. +Flashbots ist ein unabhängiges Projekt, das Execution-Clients um einen Dienst erweitert, der Suchenden ermöglicht, MEV-Transaktionen direkt an Validator zu senden, ohne sie dem öffentlichen Mempool offenzulegen. Dadurch wird verhindert, dass Transaktionen von allgemeinen Vorläufern ausgeführt werden. ## MEV-Beispiele {#mev-examples} @@ -44,85 +42,180 @@ Der MEV taucht auf der Blockchain auf mehrere Arten auf. ### DEX-Arbitrage {#mev-examples-dex-arbitrage} -[Decentralized Exchange](/glossary/#dex) (DEX) Arbitrage ist die einfachste und bekannteste MEV-Möglichkeit. Infolgedessen ist sie auch die wettbewerbsfähigste. +Die Arbitrage auf [dezentralen Börsen](/glossary/#dex) (DEX) ist die einfachste und bekannteste MEV-Möglichkeit. Infolgedessen ist sie auch die wettbewerbsfähigste. Das funktioniert so: Wenn zwei DEX einen Token zu zwei unterschiedlichen Preisen anbieten, kann jemand den Token auf dem DEX mit dem niedrigeren Preis kaufen und auf dem DEX mit dem höheren Preis in einer einzigen, atomaren Transaktion verkaufen. Dank der Mechanik der Blockchain ist dies eine echte, risikolose Arbitrage. -[Hier ist ein Beispiel](https://etherscan.io/tx/0x5e1657ef0e9be9bc72efefe59a2528d0d730d478cfc9e6cdd09af9f997bb3ef4) einer profitablen Arbitrage-Transaktion, bei der ein Suchender 1.000 ETH in 1.045 ETH umwandelte, indem er die unterschiedlichen Preise des Paares ETH/DAI bei Uniswap ggü. Sushiswap ausnutzte. +[Hier ist ein Beispiel](https://eth.blockscout.com/tx/0x5e1657ef0e9be9bc72efefe59a2528d0d730d478cfc9e6cdd09af9f997bb3ef4) für eine profitable Arbitrage-Transaktion, bei der ein Searcher 1.000 ETH in 1.045 ETH umwandelte, indem er die unterschiedlichen Preise des ETH/DAI-Paares auf Uniswap im Vergleich zu Sushiswap ausnutzte. ### Liquidationen {#mev-examples-liquidations} Eine weitere bekannte MEV-Möglichkeit sind Leihprotokoll-Liquidationen. -Leihprotokolle wie Maker und Aave funktionieren, indem sie von den Nutzern verlangen, eine Art von Sicherheit zu hinterlegen (z.B. ETH). Die Nutzer können sich dann verschiedene Vermögenswerte und Token von anderen leihen, je nachdem, was sie brauchen (zum Beispiel können sie sich MKR leihen, wenn sie über einen Vorschlag der MakerDAO-Governance abstimmen wollen, oder SUSHI, wenn sie einen Teil der Handelsgebühren auf Sushiswap verdienen wollen), und zwar bis zu einem bestimmten Betrag ihrer hinterlegten Sicherheiten - zum Beispiel 30 % (der genaue Prozentsatz der Leihkraft wird durch das Protokoll festgelegt). Die Nutzer, von denen sie sich die anderen Token leihen, fungieren in diesem Fall als Verleiher. +Kreditprotokolle wie Maker und Aave verlangen von den Nutzern, dass sie eine Sicherheit hinterlegen (z. B. ETH). Diese hinterlegte Sicherheit wird dann genutzt, um sie anderen Nutzern als Kredit auszuzahlen. + +Nutzer können dann je nach Bedarf Vermögenswerte und Token von anderen leihen (z. B. könnten Sie MKR leihen, wenn Sie bei einem MakerDAO-Governance-Vorschlag abstimmen möchten), bis zu einem bestimmten Prozentsatz ihrer hinterlegten Sicherheit. Zum Beispiel kann ein Nutzer, der 100 DAI in das Protokoll einzahlt, wenn die maximale Ausleihquote bei 30 % liegt, Assets im Wert von bis zu 30 DAI ausleihen. Das Protokoll legt den genauen Prozentsatz für die Ausleihmöglichkeit fest. -Da der Wert der Sicherheiten eines Kreditnehmers schwankt, ändert sich auch seine Kreditaufnahmefähigkeit. Wenn der Wert der geliehenen Vermögenswerte aufgrund von Marktschwankungen etwa 30 % des Wertes ihrer Sicherheiten übersteigt (auch hier wird der genaue Prozentsatz durch das Protokoll festgelegt), erlaubt das Protokoll in der Regel jedem, die Sicherheiten zu verwerten und die Kreditgeber sofort zu entschädigen (dies ist vergleichbar mit der Funktionsweise von [Margin Calls](https://www.investopedia.com/terms/m/margincall.asp) im traditionellen Finanzwesen). Im Falle einer Liquidation muss der Kreditnehmer in der Regel eine saftige Liquidationsgebühr zahlen, von der ein Teil an den Liquidator geht - hier kommt der MEV ins Spiel. +Da der Wert der Sicherheiten eines Kreditnehmers schwankt, ändert sich auch seine Kreditaufnahmefähigkeit. Wenn der Wert der geliehenen Vermögenswerte aufgrund von Marktschwankungen beispielsweise 30 % des Wertes ihrer Sicherheiten übersteigt (auch hier wird der genaue Prozentsatz durch das Protokoll bestimmt), erlaubt das Protokoll in der Regel jedem, die Sicherheiten zu liquidieren und die Kreditgeber sofort auszuzahlen (dies ähnelt der Funktionsweise von [Margin Calls](https://www.investopedia.com/terms/m/margincall.asp) im traditionellen Finanzwesen). Im Falle einer Liquidation muss der Kreditnehmer in der Regel eine saftige Liquidationsgebühr zahlen, von der ein Teil an den Liquidator geht - hier kommt der MEV ins Spiel. Die Suchenden konkurrieren darum, die Blockchain-Daten so schnell wie möglich zu analysieren, um festzustellen, welche Kreditnehmer liquidiert werden können, und als Erste eine Liquidationstransaktion einzureichen und die Liquidationsgebühr für sich selbst zu kassieren. -### Der Sandwich-Handel {#mev-examples-sandwich-trading} +### Sandwich-Trading {#mev-examples-sandwich-trading} Der Sandwich-Handel ist eine weitere gängige Methode der MEV-Extraktion. Um ein Sandwich zu finden, wird ein Sucher den Mempool nach großen DEX-Geschäften beobachten. Nehmen wir zum Beispiel an, jemand möchte 10.000 UNI mit DAI auf Uniswap kaufen. Ein Handel dieser Größenordnung wird sich erheblich auf das UNI/DAI-Paar auswirken und den Kurs von UNI gegenüber DAI möglicherweise erheblich ansteigen lassen. -Ein Sucher kann die ungefähre Preisauswirkung dieses großen Handels auf das Paar UNI/DAI berechnen und einen optimalen Kaufauftrag unmittelbar _vor_ dem großen Handel ausführen, indem er UNI billig kauft, und dann einen Verkaufsauftrag unmittelbar _nach_ dem großen Handel ausführen, indem er sie zu dem durch den großen Auftrag erzeugten höheren Preis verkauft. +Ein Searcher kann die ungefähre Preisauswirkung dieses großen Handels auf das UNI/DAI-Paar berechnen und einen optimalen Kaufauftrag unmittelbar _vor_ dem großen Handel ausführen, UNI billig kaufen, und dann einen Verkaufsauftrag unmittelbar _nach_ dem großen Handel ausführen und es zu dem durch den großen Auftrag verursachten höheren Preis verkaufen. -Sandwiching ist jedoch riskanter, da es nicht atomar (im Gegensatz zu DEX-Arbitrage, wie oben beschrieben) und anfällig für einen [Salmonellenangriff](https://github.com/Defi-Cartel/salmonella) ist. +Sandwiching ist jedoch riskanter, da es nicht atomar ist (im Gegensatz zur oben beschriebenen DEX-Arbitrage) und anfällig für einen [Salmonellenangriff](https://github.com/Defi-Cartel/salmonella) ist. -### NFT MEV {#mev-examples-nfts} +### NFT-MEV {#mev-examples-nfts} MEV im NFT-Raum ist ein neu auftretendes Phänomen, das nicht unbedingt profitabel ist. Da NEU-Transaktionen jedoch auf derselben Blockchain stattfinden, die auch von allen anderen Ethereum-Transaktionen genutzt wird, können Suchende auch auf dem NFT-Markt ähnliche Techniken wie bei den traditionellen MEV-Möglichkeiten anwenden. -Wenn es beispielsweise eine beliebte NFT-Abgabe gibt und ein Suchender eine bestimmte NFT oder eine Reihe von NFTs haben möchte, kann er eine Transaktion so programmieren, dass er der erste in der Schlange ist, um die NFT zu kaufen, oder er kann die gesamte Reihe von NFTs in einer einzigen Transaktion kaufen. Oder wenn ein NFT [fälschlicherweise zu einem niedrigen Preis](https://www.theblockcrypto.com/post/113546/mistake-sees-69000-cryptopunk-sold-for-less-than-a-cent) angeboten wird, kann ein Suchender anderen Käufern zuvorkommen und es billig ergattern. +Wenn es beispielsweise eine beliebte NFT-Abgabe gibt und ein Suchender eine bestimmte NFT oder eine Reihe von NFTs haben möchte, kann er eine Transaktion so programmieren, dass er der erste in der Schlange ist, um die NFT zu kaufen, oder er kann die gesamte Reihe von NFTs in einer einzigen Transaktion kaufen. Oder wenn ein NFT [versehentlich zu einem niedrigen Preis gelistet wird](https://www.theblockcrypto.com/post/113546/mistake-sees-69000-cryptopunk-sold-for-less-than-a-cent), kann ein Searcher anderen Käufern zuvorkommen und es günstig ergattern. -Ein prominentes Beispiel für NFT MEV entstand, als ein Sucher 7 Millionen Dollar ausgab, um [jeden einzelnen Cryptopunk zum Mindestpreis zu kaufen](https://etherscan.io/address/0x650dCdEB6ecF05aE3CAF30A70966E2F395d5E9E5). Ein Blockchain-Forscher [erläuterte auf Twitter](https://twitter.com/IvanBogatyy/status/1422232184493121538), wie der Käufer mit einem MEV-Anbieter zusammenarbeitete, um seinen Kauf geheim zu halten. +Ein prominentes Beispiel für NFT-MEV ereignete sich, als ein Searcher 7 Millionen US-Dollar ausgab, um jeden einzelnen Cryptopunk zum Mindestpreis zu [kaufen](https://eth.blockscout.com/address/0x650dCdEB6ecF05aE3CAF30A70966E2F395d5E9E5?tab=txs). Ein Blockchain-Forscher [erläuterte auf Twitter](https://twitter.com/IvanBogatyy/status/1422232184493121538), wie der Käufer mit einem MEV-Anbieter zusammenarbeitete, um seinen Kauf geheim zu halten. -### Der lange Schwanz {#mev-examples-long-tail} +### Der Long Tail {#mev-examples-long-tail} DEX-Arbitrage, Liquidationen und Sandwich-Trading sind allesamt sehr bekannte MEV-Möglichkeiten, die für neue Suchende wahrscheinlich nicht profitabel sein werden. Es gibt jedoch eine ganze Reihe weniger bekannter MEV-Möglichkeiten (NFT MEV ist wohl eine davon). -Suchende, die gerade erst anfangen, können möglicherweise mehr Erfolg haben, wenn sie nach MEV in diesem längeren Schwanz suchen. Die [MEV-Jobbörse](https://github.com/flashbots/mev-job-board) von Flashbot listet einige neue Möglichkeiten auf. +Suchende, die gerade erst anfangen, können möglicherweise mehr Erfolg haben, wenn sie nach MEV in diesem längeren Schwanz suchen. Flashbots' [MEV-Jobbörse](https://github.com/flashbots/mev-job-board) listet einige neue Möglichkeiten auf. ## Auswirkungen von MEV {#effects-of-mev} MEV ist nicht nur schlecht - es gibt sowohl positive als auch negative Folgen von MEV auf Ethereum. -### Das Positive {#effects-of-mev-the-good} +### Die guten Seiten {#effects-of-mev-the-good} Viele DeFi-Projekte sind auf wirtschaftlich rationale Akteure angewiesen, um die Nützlichkeit und Stabilität ihrer Protokolle zu gewährleisten. DEX-Arbitrage stellt zum Beispiel sicher, dass die Nutzer die besten und korrektesten Preise für ihre Token erhalten, und Kreditprotokolle verlassen sich auf schnelle Liquidationen, wenn Kreditnehmer unter die Besicherungsquote fallen, um sicherzustellen, dass die Kreditgeber zurückbezahlt werden. Ohne rationale Suchende, die nach wirtschaftlichen Ineffizienzen suchen und diese beheben und die wirtschaftlichen Anreize der Protokolle nutzen, könnten DeFi-Protokolle und dApps im Allgemeinen nicht so robust sein, wie sie es heute sind. -### Das Negative {#effects-of-mev-the-bad} +### Die schlechten Seiten {#effects-of-mev-the-bad} Auf der Anwendungsebene führen einige Formen des MEV, wie der Sandwich-Handel, zu einer eindeutig schlechteren Erfahrung für die Nutzer. Nutzer, die sich in einem „Sandwich" befinden, müssen mit erhöhter Verzögerung und schlechterer Ausführung ihrer Geschäfte rechnen. Auf der Netzwerkebene führen verallgemeinerte Vorläufer und die von ihnen häufig durchgeführten Gaspreisauktionen (bei denen zwei oder mehr Vorläufer um die Aufnahme ihrer Transaktion in den nächsten Block konkurrieren, indem sie den Gaspreis ihrer eigenen Transaktionen schrittweise erhöhen) zu einer Überlastung des Netzwerks und hohen Gaspreisen für alle anderen, die versuchen, reguläre Transaktionen durchzuführen. -Abgesehen von dem, was _innerhalb_ der Blöcke geschieht, kann MEV auch _zwischen_ den Blöcken schädliche Auswirkungen haben. Wenn der in einem Block verfügbare MEV die Standard-Blockbelohnung deutlich übersteigt, können Miner einen Anreiz haben, Blöcke zu reminen und den MEV für sich selbst einzunehmen, was zu einer Reorganisation der Blockchain und einer Instabilität des Konsenses führt. +Über das Geschehen _innerhalb_ von Blöcken hinaus kann MEV auch _zwischen_ den Blöcken schädliche Auswirkungen haben. Wenn der in einem Block verfügbare MEV die standardmäßige Blockprämie deutlich übersteigt, könnten Validator dazu angereizt werden, Blöcke neu zu organisieren und den MEV für sich selbst zu beanspruchen. Dies führt zu einer Neustrukturierung der Blockchain und zu Instabilität im Konsens. + +Diese Möglichkeit der Blockchain-Reorganisation wurde [bereits auf der Bitcoin-Blockchain untersucht](https://dl.acm.org/doi/10.1145/2976749.2978408). Da sich die Bitcoin-Blockbelohnung halbiert und die Transaktionsgebühren einen immer größeren Teil der Blockbelohnung ausmachen, entstehen Situationen, in denen es für die Miner wirtschaftlich rational wird, auf die Belohnung des nächsten Blocks zu verzichten und stattdessen vergangene Blöcke mit höheren Gebühren zu bearbeiten. Mit dem Wachstum von MEV könnte die gleiche Situation bei Ethereum eintreten und die Integrität der Blockchain bedrohen. + +## Status von MEV {#state-of-mev} + +Die MEV-Förderung stieg Anfang 2021 sprunghaft an, was in den ersten Monaten des Jahres zu extrem hohen Gaspreisen führte. Das Aufkommen von Flashbots' MEV-Relay hat die Effektivität von generalisierten Frontrunnern verringert und Gaspreis-Auktionen offchain verlagert, was die Gaspreise für normale Nutzer senkt. + +Während viele Suchende immer noch gutes Geld mit MEV verdienen, führt die zunehmende Bekanntheit der Möglichkeiten und das wachsende Interesse von mehr und mehr Suchenden, die um dieselbe Gelegenheit konkurrieren, dazu, dass Validator einen immer größeren Anteil der gesamten MEV-Einnahmen einfangen werden. (Denn ähnliche Gasauktionen wie oben beschrieben finden auch bei Flashbots statt, wenn auch privat, und Validator erhalten die daraus resultierenden Gaseinnahmen). MEV gibt es auch nicht nur bei Ethereum, und da die Möglichkeiten bei Ethereum immer wettbewerbsfähiger werden, weichen die Suchenden auf andere Blockchains wie Binance Smart Chain aus, wo ähnliche MEV-Möglichkeiten wie bei Ethereum bestehen, aber weniger Wettbewerb herrscht. + +Andererseits verändert der Übergang von Proof-of-Work zu Proof-of-Stake sowie die laufenden Bemühungen, Ethereum mithilfe von Rollups zu skalieren, die MEV-Landschaft in noch nicht vollständig absehbarer Weise. Es ist noch nicht genau bekannt, wie das Vorhandensein von garantierten Block-Proposern, die kurz im Voraus bekannt sind, die Dynamik der MEV-Extraktion im Vergleich zum probabilistischen Modell in Proof-of-Work verändert, oder wie dies gestört wird, wenn die [Single Secret Leader Election](https://ethresear.ch/t/secret-non-single-leader-election/11789) und die [Technologie der verteilten Validatoren](/staking/dvt/) implementiert werden. Ebenso bleibt abzuwarten, welche MEV-Möglichkeiten bestehen, wenn die meisten Nutzeraktivitäten von Ethereum auf seine Layer-2-Rollups und Shards verlagert werden. + +## MEV in Ethereum Proof-of-Stake (PoS) {#mev-in-ethereum-proof-of-stake} + +Wie bereits erläutert, hat MEV negative Auswirkungen auf das Gesamtnutzererlebnis und die Sicherheit der Konsensschicht. Der Übergang von Ethereum zu einem Proof-of-Stake-Konsens (als "The Merge" bekannt) birgt jedoch potenziell neue MEV-bezogene Risiken: + +### Validator-Zentralisierung {#validator-centralization} + +In der Ära nach dem Merge kommen Validator (die Sicherheitsdepots von 32 ETH hinterlegt haben) zu einem Konsens über die Gültigkeit von Blöcken, die zur Beacon Chain hinzugefügt werden. Da 32 ETH für viele unerreichbar sein könnten, ist der [Beitritt zu einem Staking-Pool](/staking/pools/) möglicherweise eine praktikablere Option. Dennoch ist eine gesunde Verteilung von [Solo-Stakern](/staking/solo/) ideal, da sie die Zentralisierung von Validatoren verringert und die Sicherheit von Ethereum verbessert. + +Allerdings wird angenommen, dass die MEV-Extraktion die Zentralisierung von Validatoren beschleunigen kann. Dies liegt zum Teil daran, dass Validatoren [weniger für das Vorschlagen von Blöcken verdienen](/roadmap/merge/issuance/#how-the-merge-impacts-ETH-supply) als Miner zuvor, und die MEV-Extraktion die [Einnahmen der Validatoren](https://github.com/flashbots/eth2-research/blob/main/notebooks/mev-in-eth2/eth2-mev-calc.ipynb) seit [The Merge](/roadmap/merge/) stark beeinflusst hat. + +Größere Staking-Pools werden wahrscheinlich über mehr Ressourcen verfügen, um notwendige Optimierungen vorzunehmen und so MEV-Möglichkeiten zu nutzen. Je mehr MEV diese Pools extrahieren, desto mehr Ressourcen haben sie, um ihre MEV-Extraktionsfähigkeiten zu verbessern (und den Gesamtumsatz zu steigern), was im Wesentlichen [Skaleneffekte](https://www.investopedia.com/terms/e/economiesofscale.asp#) schafft. + +Solo-Staker könnten aufgrund ihrer begrenzten Ressourcen nicht in der Lage sein, von MEV-Möglichkeiten zu profitieren. Dies könnte den Druck auf unabhängige Validatoren erhöhen, sich mächtigen Staking-Pools anzuschließen, um ihre Einnahmen zu steigern, was die Dezentralisierung bei Ethereum verringern könnte. + +### Genehmigungspflichtige Mempools {#permissioned-mempools} + +Als Reaktion auf Sandwiching- und Frontrunning-Angriffe könnten Trader damit beginnen, zur Wahrung der Transaktions-Privatsphäre Off-Chain-Deals mit Validatoren abzuschließen. Anstatt eine potenzielle MEV-Transaktion an den öffentlichen Mempool zu senden, schickt der Händler sie direkt an den Validator, der sie in einen Block aufnimmt und die Gewinne mit dem Händler teilt. + +„Dark Pools“ sind eine größere Version dieser Vereinbarung und fungieren als kontrollierte, nur auf Einladung zugängliche Mempools, die für Nutzer offen sind, die bereit sind, bestimmte Gebühren zu zahlen. Diese Entwicklung würde Ethereums Prinzipien der uneingeschränkten Zugänglichkeit und Vertrauensfreiheit schwächen und könnte die Blockchain potenziell in einen „Pay-to-Play“-Mechanismus verwandeln, der den Höchstbietenden bevorzugt. + +Berechtigte Mempools würden zudem die in dem vorherigen Abschnitt beschriebenen Risiken der Zentralisierung weiter verstärken. Große Pools, die mehrere Validatoren betreiben, werden voraussichtlich davon profitieren, Transaktionsprivatsphäre für Händler und Nutzer anzubieten, was ihre MEV-Einnahmen erhöhen wird. + +Die Bekämpfung dieser MEV-bezogenen Probleme im post-Merge-Ethereum ist ein zentrales Forschungsgebiet. Bislang wurden zwei Lösungen vorgeschlagen, um die negativen Auswirkungen von MEV auf die Dezentralisierung und Sicherheit von Ethereum nach The Merge zu reduzieren: [**Proposer-Builder Separation (PBS)**](/roadmap/pbs/) und die [**Builder-API**](https://github.com/ethereum/builder-specs). + +### Proposer-Builder-Separation {#proposer-builder-separation} + +In beiden Systemen, Proof-of-Work und Proof-of-Stake, erstellt ein Node, der einen Block baut, diesen zur Aufnahme in die Blockchain für andere am Konsens teilnehmende Nodes vor. Ein neuer Block wird Teil der kanonischen Kette, nachdem ein anderer Miner darauf aufbaut (im PoW) oder er die Zustimmung der Mehrheit der Validator erhält (im PoS). + +Die Kombination der Rollen des Blockproduzenten und des Blockvorschlagenden ist es, die die meisten der zuvor beschriebenen MEV-bezogenen Probleme verursacht. Zum Beispiel erhalten Konsens-Nodes Anreize, Kettenreorganisationen in [Time-Bandit-Angriffen](https://www.mev.wiki/attack-examples/time-bandit-attack) auszulösen, um die MEV-Einnahmen zu maximieren. + +Die [Proposer-Builder-Separation](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) (PBS) wurde entwickelt, um die Auswirkungen von MEV, insbesondere auf der Konsens-Ebene, zu mildern. Ein zentrales Merkmal von PBS ist die Trennung der Rollen des Blockproduzenten und des Blockvorschlagenden. Validatoren sind weiterhin für das Vorschlagen von und Abstimmen über Blöcke verantwortlich, aber eine neue Klasse spezialisierter Entitäten, sogenannte **Block-Builder**, sind mit der Anordnung von Transaktionen und dem Erstellen von Blöcken beauftragt. + +Bei PBS erstellt ein Block-Builder ein Transaktionspaket und platziert ein Gebot für dessen Aufnahme in einen Beacon-Chain-Block (als „execution payload“). Der Validator, der für den Vorschlag des nächsten Blocks ausgewählt wurde, überprüft die verschiedenen Gebote und wählt das Paket mit der höchsten Gebühr aus. PBS schafft im Wesentlichen einen Auktionsmarkt, auf dem Builder mit Validatoren verhandeln, die Blockspace verkaufen. + +Aktuelle PBS-Designs verwenden ein [Commit-Reveal-Schema](https://gitcoin.co/blog/commit-reveal-scheme-on-ethereum/), bei dem Builder nur eine kryptografische Verpflichtung zum Inhalt eines Blocks (Block-Header) zusammen mit ihren Geboten veröffentlichen. Nachdem das höchste Gebot akzeptiert wurde, erstellt der Proposer einen signierten Blockvorschlag, der den Blockheader enthält. Der Block-Builder wird voraussichtlich den vollständigen Block-Body veröffentlichen, nachdem er den signierten Block-Vorschlag gesehen hat, und er muss auch genügend [Attestierungen](/glossary/#attestation) von Validatoren erhalten, bevor er finalisiert wird. + +#### Wie mildert die Trennung von Proposer und Builder (PBS) die Auswirkungen von MEV? {#how-does-pbs-curb-mev-impact} + +Die Trennung von Proposer und Builder im Protokoll reduziert die Auswirkungen von MEV auf den Konsens, indem die MEV-Extraktion aus dem Aufgabenbereich der Validator-Nodes entfernt wird. Stattdessen werden Block-Builders, die spezialisierte Hardware betreiben, zukünftig die MEV-Gelegenheiten nutzen. + +Dies schließt Validator-Nodes jedoch nicht vollständig von MEV-bezogenen Einnahmen aus, da Builder hohe Gebote abgeben müssen, damit ihre Blöcke von den Validatoren akzeptiert werden. Dennoch verringert sich durch die Trennung die Bedrohung durch Time-Bandit-Angriffe, da Validator-Nodes sich nicht mehr direkt auf die Maximierung von MEV-Einnahmen konzentrieren. + +Die Trennung von Proposer und Builder reduziert zudem die Zentralisierungsrisiken durch MEV. Zum Beispiel entfällt durch das Commit-Reveal-Verfahren die Notwendigkeit, dass Builder den Validatoren vertrauen müssen, die MEV-Gelegenheit nicht zu stehlen oder sie anderen Buildern offenzulegen. Dies senkt die Hürde für Solo-Staker, von MEV zu profitieren. Andernfalls würden Builder dazu tendieren, große Pools mit Off-Chain-Reputation zu bevorzugen und mit ihnen Off-Chain-Deals abzuschließen. + +Ebenso müssen Validator keine Builder vertrauen, dass diese Blockinhalte nicht zurückhalten oder ungültige Blöcke veröffentlichen, da die Zahlung unbedingt erfolgt. Die Gebühr für den Validator wird dennoch verarbeitet, selbst wenn der vorgeschlagene Block nicht verfügbar ist oder von anderen Validatoren als ungültig erklärt wird. Im letzteren Fall wird der Block einfach verworfen, was den Block-Buildern zwingt, alle Transaktionsgebühren und MEV-Einnahmen zu verlieren. + +### Builder-API {#builder-api} + +Während die Trennung von Proposer und Builder (PBS) verspricht, die Auswirkungen der MEV-Extraktion zu reduzieren, erfordert ihre Implementierung Änderungen am Konsensprotokoll. Insbesondere müsste die [Fork-Choice](/developers/docs/consensus-mechanisms/pos/#fork-choice)-Regel in der Beacon Chain aktualisiert werden. Die [Builder-API](https://github.com/ethereum/builder-specs) ist eine temporäre Lösung, die darauf abzielt, eine funktionierende Implementierung der Proposer-Builder-Separation bereitzustellen, wenn auch mit höheren Vertrauensannahmen. + +Die Builder-API ist eine modifizierte Version der [Engine-API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md), die von Clients der Konsens-Ebene verwendet wird, um Ausführungsnutzlasten von Clients der Ausführungsebene anzufordern. Wie in der [Spezifikation für ehrliche Validatoren](https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/validator.md) beschrieben, fordern die für das Vorschlagen von Blöcken ausgewählten Validatoren ein Transaktionsbündel von einem verbundenen Ausführungs-Client an, das sie in den vorgeschlagenen Beacon-Chain-Block aufnehmen. + +Die Builder-API fungiert ebenfalls als Middleware zwischen Validatoren und Execution-Layer-Clients; sie unterscheidet sich jedoch dadurch, dass sie es Validatoren auf der Beacon Chain ermöglicht, Blöcke von externen Entitäten zu beziehen (anstatt einen Block lokal mithilfe eines Execution-Clients zu erstellen). + +Im Folgenden finden Sie einen Überblick darüber, wie die Builder-API funktioniert: + +1. Die Builder-API verbindet den Validator mit einem Netzwerk von Block-Buildern, die Execution-Layer-Clients betreiben. Wie bei PBS sind Builder spezialisierte Akteure, die in die ressourcenintensive Erstellung von Blöcken (Block-Building) investieren und unterschiedliche Strategien anwenden, um die Einnahmen aus MEV und Priority Tips zu maximieren. + +2. Ein Validator (der einen Consensus-Layer-Client ausführt) fordert Execution Payloads zusammen mit Geboten vom Netzwerk der Builder an. Die Gebote der Builder werden den Execution Payload Header – eine kryptografische Verpflichtung auf den Inhalt des Payloads – sowie eine Gebühr für den Validator enthalten. + +3. Der Validator überprüft die eingehenden Gebote und wählt den Execution Payload mit der höchsten Gebühr aus. Mithilfe der Builder API erstellt der Validator einen „geblindeten“ Beacon-Block-Vorschlag, der nur seine Signatur und den Execution Payload Header enthält, und sendet diesen an den Builder. + +4. Es wird erwartet, dass der Builder, der die Builder API betreibt, mit dem vollständigen Execution Payload antwortet, sobald er den „geblindeten“ Block-Vorschlag sieht. Dies ermöglicht es dem Validator, einen „signierten“ Beacon-Block zu erstellen, den er im gesamten Netzwerk verbreitet. + +5. Es wird von einem Validator, der die Builder API verwendet, dennoch erwartet, dass er lokal einen Block erstellt, falls der Block-Builder nicht rechtzeitig antwortet, damit ihm die Belohnungen für den Block-Vorschlag nicht entgehen. Der Validator kann jedoch keinen weiteren Block erstellen, weder unter Verwendung der nun aufgedeckten Transaktionen noch eines anderen Satzes, da dies einer _Äquivokation_ (Unterzeichnung zweier Blöcke innerhalb desselben Slots) gleichkäme, was ein slashbares Vergehen ist. + +Eine beispielhafte Implementierung der Builder-API ist [MEV Boost](https://github.com/flashbots/mev-boost), eine Verbesserung des [Flashbots-Auktionsmechanismus](https://docs.flashbots.net/Flashbots-auction/overview), der entwickelt wurde, um die negativen externen Effekte von MEV auf Ethereum einzudämmen. Die Flashbots-Auktion ermöglicht es Validatoren in Proof-of-Stake, die Arbeit des Erstellens profitabler Blöcke an spezialisierte Parteien, sogenannte **Searcher**, auszulagern. +![Ein Diagramm, das den MEV-Fluss im Detail zeigt](./mev.png) + +Searcher suchen nach lukrativen MEV-Möglichkeiten und senden Transaktionsbündel zusammen mit einem [verdeckten Preisgebot](https://en.wikipedia.org/wiki/First-price_sealed-bid_auction) zur Aufnahme in den Block an die Block-Proposer. Der Validator, der mev-geth – eine geforkte Version des go-ethereum (Geth) Clients – verwendet, muss nur das Bündel mit dem höchsten Gewinn auswählen und es als Teil des neuen Blocks einfügen. Um Block-Proposer (Validatoren) vor Spam und ungültigen Transaktionen zu schützen, durchlaufen Transaktionsbündel zur Validierung **Relayer**, bevor sie zum Proposer gelangen. + +MEV Boost behält die gleiche Funktionsweise der ursprünglichen Flashbots-Auktion bei, wenn auch mit neuen Funktionen, die für Ethereums Umstellung auf Proof-of-Stake entwickelt wurden. Searcher finden weiterhin profitable MEV-Transaktionen für die Aufnahme in Blöcke, aber eine neue Klasse von spezialisierten Parteien, sogenannte **Builder**, sind für die Aggregation von Transaktionen und Bündeln in Blöcken verantwortlich. Ein Builder akzeptiert verdeckte Preisgebote von Searchern und führt Optimierungen durch, um die profitabelste Anordnung zu finden. + +Der Relayer ist weiterhin dafür verantwortlich, Transaktionsbündel zu validieren, bevor er sie an den Proposer weitergibt. MEV-Boost führt jedoch **Escrows** ein, die für die Bereitstellung der [Datenverfügbarkeit](/developers/docs/data-availability/) verantwortlich sind, indem sie von Buildern gesendete Block-Bodys und von Validatoren gesendete Block-Header speichern. Hier fragt ein Validator, der mit einem Relay verbunden ist, nach verfügbaren Execution Payloads und nutzt den Anordnungsalgorithmus von MEV Boost, um den Payload Header mit dem höchsten Gebot plus MEV-Tips auszuwählen. + +#### Wie mildert die Builder-API die Auswirkungen von MEV? {#how-does-builder-api-curb-mev-impact} -Diese Möglichkeit der Reorganisation der Blockchain wurde [bereits bei der Bitcoin-Blockchain](https://dl.acm.org/doi/10.1145/2976749.2978408) untersucht. Da sich die Bitcoin-Blockbelohnung halbiert und die Transaktionsgebühren einen immer größeren Teil der Blockbelohnung ausmachen, entstehen Situationen, in denen es für die Miner wirtschaftlich rational wird, auf die Belohnung des nächsten Blocks zu verzichten und stattdessen vergangene Blöcke mit höheren Gebühren zu bearbeiten. Mit dem Wachstum von MEV könnte die gleiche Situation bei Ethereum eintreten und die Integrität der Blockchain bedrohen. +Der Hauptvorteil der Builder-API liegt in ihrem Potenzial, den Zugang zu MEV-Möglichkeiten zu demokratisieren. Die Verwendung von Commit-Reveal-Verfahren beseitigt Vertrauensannahmen und senkt die Einstiegshürden für Validatoren, die von MEV profitieren möchten. Dies sollte den Druck auf Solo-Staker verringern, sich großen Staking-Pools anzuschließen, um die MEV-Gewinne zu steigern. -## Zustand der MEV {#state-of-mev} +Eine flächendeckende Implementierung der Builder-API wird einen größeren Wettbewerb unter den Block-Buildern fördern, was die Zensurresistenz erhöht. Da Validatoren die Gebote von mehreren Buildern prüfen, muss ein Builder mit Zensurabsicht alle anderen, nicht zensierenden Builder überbieten, um erfolgreich zu sein. Dies erhöht die Kosten für die Zensur von Nutzern drastisch und schreckt von dieser Praxis ab. -Die MEV-Förderung stieg Anfang 2021 sprunghaft an, was in den ersten Monaten des Jahres zu extrem hohen Gaspreisen führte. Das Auftauchen von Flashbots MEV-Relais hat die Effektivität von allgemeinen Vorläufern reduziert und die Gaspreisauktionen aus der Kette genommen, was die Gaspreise für normale Nutzer senkt. +Einige Projekte wie MEV Boost nutzen die Builder-API als Teil einer Gesamtstruktur, die darauf ausgelegt ist, bestimmten Akteuren (etwa Tradern, die Frontrunning- und Sandwiching-Angriffe vermeiden wollen) Transaktions-Privatsphäre zu gewährleisten. Dies wird durch die Bereitstellung eines privaten Kommunikationskanals zwischen Nutzern und Block-Buildern erreicht. Im Gegensatz zu den zuvor beschriebenen, berechtigungsbasierten Mempools ist dieser Ansatz aus den folgenden Gründen vorteilhaft: -Während viele Suchende immer noch gutes Geld mit MEV verdienen, werden die Miner mit zunehmender Bekanntheit der Gelegenheiten und immer mehr Suchenden, die um dieselbe Gelegenheit konkurrieren, immer mehr MEV-Einnahmen erzielen (weil die gleiche Art von Gasauktionen, wie sie oben beschrieben wurden, auch in Flashbots stattfinden, wenn auch auf privater Basis, und die Miner die daraus resultierenden Gaseinnahmen erzielen). MEV gibt es auch nicht nur bei Ethereum, und da die Möglichkeiten bei Ethereum immer wettbewerbsfähiger werden, weichen die Suchenden auf andere Blockchains wie Binance Smart Chain aus, wo ähnliche MEV-Möglichkeiten wie bei Ethereum bestehen, aber weniger Wettbewerb herrscht. +1. Die Existenz mehrerer Builder auf dem Markt macht eine Zensur unpraktikabel, was den Nutzern zugutekommt. Im Gegensatz dazu würde die Existenz von zentralisierten und vertrauensbasierten Dark Pools die Macht in den Händen weniger Block-Builder konzentrieren und die Möglichkeit einer Zensur erhöhen. -Mit dem Wachstum und der zunehmenden Beliebtheit von DeFi könnte MEV schon bald die Basisbelohnung eines Ethereum-Blocks deutlich übertreffen. Damit wächst die Möglichkeit, dass egoistische Blöcke zurückbleiben und der Konsens instabil wird. Einige sehen darin eine existenzielle Bedrohung für Ethereum, und die Abschreckung von egoistischem Mining ist ein aktives Forschungsgebiet in der Ethereum-Protokolltheorie. Eine Lösung, die derzeit untersucht wird, ist [MEV-Reward-Smoothing](https://ethresear.ch/t/committee-driven-mev-smoothing/10408). +2. Die Software der Builder-API ist Open-Source, was es jedem ermöglicht, Block-Builder-Dienste anzubieten. Dies bedeutet, dass Nutzer nicht gezwungen sind, einen bestimmten Block-Builder zu verwenden, was die Neutralität und Erlaubnisfreiheit von Ethereum verbessert. Darüber hinaus werden MEV-suchende Trader nicht unbeabsichtigt zur Zentralisierung beitragen, indem sie private Transaktionskanäle nutzen. ## Zugehörige Ressourcen {#related-resources} +- [Flashbots-Dokumentation](https://docs.flashbots.net/) - [Flashbots GitHub](https://github.com/flashbots/pm) +- [mevboost.org](https://www.mevboost.org/) – _Tracker mit Echtzeit-Statistiken für MEV-Boost-Relays und Block-Builder_ -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Was ist Miner-Extractable Value (MEV)?](https://blog.chain.link/what-is-miner-extractable-value-mev/) -- [MEV und ich](https://research.paradigm.xyz/MEV) +- [MEV und ich](https://www.paradigm.xyz/2021/02/mev-and-me) - [Ethereum ist ein dunkler Wald](https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest/) - [Flucht aus dem dunklen Wald](https://samczsun.com/escaping-the-dark-forest/) -- [Flashbots: Vorläufer in der MEV-Krise](https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752) -- [@bertcmillers MEV-Themen](https://twitter.com/bertcmiller/status/1402665992422047747) +- [Flashbots: Frontrunning der MEV-Krise](https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752) +- [@bertcmillers MEV-Threads](https://twitter.com/bertcmiller/status/1402665992422047747) +- [MEV-Boost: Merge-fähige Flashbots-Architektur](https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177) +- [Was ist MEV Boost](https://www.alchemy.com/overviews/mev-boost) +- [Warum mev-boost ausführen?](https://writings.flashbots.net/writings/why-run-mevboost/) +- [Per Anhalter durch die Ethereum-Galaxis](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) diff --git a/public/content/translations/de/developers/docs/networking-layer/index.md b/public/content/translations/de/developers/docs/networking-layer/index.md new file mode 100644 index 00000000000..5920b64b400 --- /dev/null +++ b/public/content/translations/de/developers/docs/networking-layer/index.md @@ -0,0 +1,163 @@ +--- +title: Netzwerkebene +description: Eine Einführung in die Netzwerkschicht von Ethereum. +lang: de +sidebarDepth: 2 +--- + +Ethereum ist ein Peer-to-Peer-Netzwerk mit Tausenden von Knoten, die über standardisierte Protokolle miteinander kommunizieren können müssen. Die „Netzwerkschicht“ ist der Protokollstapel, der es diesen Knoten ermöglicht, einander zu finden und Informationen auszutauschen. Hierzu gehört das „Klatschen“ von Informationen (Eins-zu-viele-Kommunikation) über das Netzwerk sowie der Austausch von Anfragen und Antworten zwischen bestimmten Knoten (Eins-zu-eins-Kommunikation). Jeder Knoten muss bestimmte Netzwerkregeln einhalten, um sicherzustellen, dass er die richtigen Informationen sendet und empfängt. + +Die Client-Software besteht aus zwei Teilen (Ausführungsclients und Konsens-Clients), jeder mit seinem eigenen Netzwerk-Stack. Neben der Kommunikation mit anderen Ethereum-Knoten müssen die Ausführungs- und Konsens-Clients auch untereinander kommunizieren. Auf dieser Seite finden Sie eine einführende Erklärung der Protokolle, die diese Kommunikation ermöglichen. + +Ausführungsclients leiten Transaktionen über das Peer-to-Peer-Netzwerk der Ausführungsebene weiter. Dies erfordert eine verschlüsselte Kommunikation zwischen authentifizierten Peers. Wenn ein Validator ausgewählt wird, um einen Block vorzuschlagen, werden Transaktionen aus dem lokalen Transaktionspool des Knotens über eine lokale RPC Verbindung an Konsens-Clients weitergeleitet, die in Beacon Blöcke verpackt werden. Konsens-Clients werden dann Beacon Blöcke über ihr P2P-Netzwerk verbreiten. Dies erfordert zwei separate P2P-Netzwerke: eines, das Ausführungsclients für Transaktions-Gossip verbindet, und eines, das Konsensclients für Block-Gossip verbindet. + +## Voraussetzungen {#prerequisites} + +Einige Kenntnisse über Ethereum-[Nodes und Clients](/developers/docs/nodes-and-clients/) sind hilfreich, um diese Seite zu verstehen. + +## Die Ausführungsebene {#execution-layer} + +Die Netzwerkprotokolle der Ausführungsschicht sind in zwei Stapel unterteilt: + +- der Discovery-Stack: baut auf UDP auf und ermöglicht es einem neuen Knoten, Peers zu finden, mit denen er sich verbinden kann + +- der Dev P2P-Stack: sitzt auf TCP und ermöglicht Knoten den Informationsaustausch + +Beide Stapel arbeiten parallel. Der Discovery-Stack speist neue Netzwerkteilnehmer in das Netzwerk ein und der Dev P2P-Stack ermöglicht ihre Interaktionen. + +### Entdeckung {#discovery} + +Bei der Erkennung handelt es sich um den Vorgang, andere Knoten im Netzwerk zu finden. Dies wird mithilfe eines kleinen Satzes von Bootnodes gebootstrappt (Nodes, deren Adressen in den Client [fest codiert](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go) sind, damit sie sofort gefunden werden und den Client mit Peers verbinden können). Diese Bootknoten existieren nur, um einer Gruppe von Peers einen neuen Knoten vorzustellen – dies ist ihr einziger Zweck. Sie nehmen nicht an normalen Client-Aufgaben wie der Synchronisierung der Kette teil und werden nur beim allerersten Hochfahren eines Clients verwendet. + +Das für die Interaktionen zwischen Node und Bootnode verwendete Protokoll ist eine modifizierte Form von [Kademlia](https://medium.com/coinmonks/a-brief-overview-of-kademlia-and-its-use-in-various-decentralized-platforms-da08a7f72b8f), die eine [verteilte Hashtabelle](https://en.wikipedia.org/wiki/Distributed_hash_table) verwendet, um Listen von Nodes zu teilen. Jeder Knoten verfügt über eine Version dieser Tabelle, die die für die Verbindung mit seinen nächstgelegenen Peers erforderlichen Informationen enthält. Diese „Nähe“ ist nicht geografisch – die Entfernung wird durch die Ähnlichkeit der Knoten-ID definiert. Aus Sicherheitsgründen wird die Tabelle jedes Knotens regelmäßig aktualisiert. Im Entdeckungsprotokoll [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5) können Nodes zum Beispiel auch „Anzeigen“ versenden, die die vom Client unterstützten Unterprotokolle anzeigen. Dadurch können Peers über die Protokolle verhandeln, die sie beide zur Kommunikation verwenden können. + +Die Entdeckung beginnt mit einer Partie PING PONG. Ein erfolgreicher PING-l PONG „bindet“ den neuen Knoten an einen Bootknoten. Die erste Nachricht, die einen Bootnode auf die Existenz eines neuen Node aufmerksam macht, der in das Netzwerk eintritt, ist ein `PING`. Dieser `PING` enthält gehashte Informationen über den neuen Node, den Bootnode und einen Ablauf-Zeitstempel. Der Bootnode empfängt den `PING` und gibt einen `PONG` zurück, der den `PING`-Hash enthält. Wenn die `PING`- und `PONG`-Hashes übereinstimmen, wird die Verbindung zwischen dem neuen Node und dem Bootnode verifiziert und es wird gesagt, dass sie "verbunden" sind. + +Sobald sie verbunden sind, kann der neue Node eine `FIND-NEIGHBOURS`-Anfrage an den Bootnode senden. Die vom Bootknoten zurückgegebenen Daten enthalten eine Liste von Peers, mit denen der neue Knoten eine Verbindung herstellen kann. Wenn die Nodes nicht verbunden sind, schlägt die `FIND-NEIGHBOURS`-Anfrage fehl, sodass der neue Node nicht in das Netzwerk eintreten kann. + +Sobald der neue Knoten eine Liste der Nachbarn vom Bootknoten erhält, beginnt er mit jedem von ihnen einen PING PONG Austausch. Erfolgreiche PING PONG verbinden den neuen Knoten mit seinen Nachbarn und ermöglichen so den Nachrichtenaustausch. + +``` +Client starten --> mit Bootnode verbinden --> an Bootnode binden --> Nachbarn finden --> an Nachbarn binden +``` + +Ausführungs-Clients verwenden derzeit das Entdeckungsprotokoll [Discv4](https://github.com/ethereum/devp2p/blob/master/discv4.md) und es gibt aktive Bestrebungen, auf das Protokoll [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5) zu migrieren. + +#### ENR: Ethereum Node Records {#enr} + +Der [Ethereum Node Record (ENR)](/developers/docs/networking-layer/network-addresses/) ist ein Objekt, das drei grundlegende Elemente enthält: eine Signatur (Hash des Inhalts des Records, der nach einem vereinbarten Identitätsschema erstellt wurde), eine Sequenznummer, die Änderungen am Record verfolgt, und eine beliebige Liste von Schlüssel-Wert-Paaren. Dies ist ein zukunftssicheres Format, das einen einfacheren Austausch von Identifizierungsinformationen zwischen neuen Peers ermöglicht und das bevorzugte Format für [Netzwerkadressen](/developers/docs/networking-layer/network-addresses) für Ethereum-Nodes ist. + +#### Warum basiert die Erkennung auf UDP? {#why-udp} + +UDP unterstützt keine Fehlerprüfung, kein erneutes Senden fehlgeschlagener Pakete oder dynamisches Öffnen und Schließen von Verbindungen. Stattdessen sendet es einfach einen kontinuierlichen Informationsstrom an ein Ziel, unabhängig davon, ob dieser erfolgreich empfangen wurde. Diese minimale Funktionalität führt auch zu einem minimalen Overhead, wodurch diese Art der Verbindung sehr schnell wird. Für die Erkennung, bei der ein Knoten lediglich seine Anwesenheit bekannt geben möchte, um dann eine formelle Verbindung mit einem Peer herzustellen, ist UDP ausreichend. Für den Rest des Netzwerk-Stacks ist UDP jedoch nicht geeignet. Der Informationsaustausch zwischen Knoten ist recht komplex und erfordert daher ein Protokoll mit umfassenderen Funktionen, das erneutes Senden, Fehlerprüfung usw. unterstützt. Der mit TCP verbundene zusätzliche Overhead ist die zusätzliche Funktionalität wert. Daher läuft der Großteil des P2P-Stacks über TCP. + +### DevP2P {#devp2p} + +Entwickler P2P selbst ist ein ganzer Stapel von Protokollen, die Ethereum implementiert, um das Peer-to-Peer-Netzwerk aufzubauen und zu pflegen. Nachdem neue Nodes dem Netzwerk beitreten, werden ihre Interaktionen durch Protokolle im [DevP2P](https://github.com/ethereum/devp2p)-Stack geregelt. Diese basieren alle auf TCP und umfassen das RLPx Transportprotokoll, das Draht Protokoll und mehrere Unterprotokolle. [RLPx](https://github.com/ethereum/devp2p/blob/master/rlpx.md) ist das Protokoll, das die Initiierung, Authentifizierung und Aufrechterhaltung von Sitzungen zwischen Nodes regelt. RLPx codiert Nachrichten mithilfe von RLP (Recursive Length Prefix), einer sehr platzsparenden Methode zum Codieren von Daten in eine minimale Struktur zum Senden zwischen Knoten. + +Eine RLPx Sitzung zwischen zwei Knoten beginnt mit einem ersten kryptografischen Handshake. Dabei sendet der Knoten eine Authentifizierungsnachricht, die dann vom Peer überprüft wird. Nach erfolgreicher Überprüfung generiert der Peer eine Authentifizierungsbestätigungsnachricht, die an den Initiator knoten zurückgesendet wird. Dies ist ein Schlüsselaustauschprozess, der es den Knoten ermöglicht, privat und sicher zu kommunizieren. Ein erfolgreicher kryptografischer Handshake veranlasst dann beide Knoten, sich gegenseitig eine „Hallo“-Nachricht „über die Leitung“ zu senden. Das Draht-Protokoll wird durch einen erfolgreichen Austausch von Hallo Nachrichten initiiert. + +Die Begrüßungsnachrichten enthalten: + +- Protokollversion +- Kunden-ID +- Hafen +- Knoten ID +- Liste der unterstützten Unterprotokolle + +Dies sind die für eine erfolgreiche Interaktion erforderlichen Informationen, da sie definieren, welche Funktionen zwischen beiden Knoten geteilt werden, und die Kommunikation konfigurieren. Es gibt einen Prozess der Unterprotokollverhandlung, bei dem die Listen der von jedem Knoten unterstützten Unterprotokolle verglichen werden und diejenigen, die beiden Knoten gemeinsam sind, in der Sitzung verwendet werden können. + +Neben den Hallo-Nachrichten kann das Draht-Protokoll auch eine "Trennen" Nachricht senden, die einen Peer warnt, dass die Verbindung geschlossen wird. Das Draht-Protokoll umfasst auch PING und PONG Nachrichten, die regelmäßig gesendet werden, um eine Sitzung offen zuhalten. Der RLPx und Draht-Protokollaustausch legt daher die Grundlagen der Kommunikation zwischen den Knoten fest und bietet das Gerüst für den Austausch nützlicher Informationen gemäß einem bestimmten Unterprotokoll. + +### Unterprotokolle {#sub-protocols} + +#### Wire-Protokoll {#wire-protocol} + +Sobald die Peers verbunden sind und eine RLPx Sitzung gestartet wurde, definiert das Draht Protokoll, wie die Peers kommunizieren. Ursprünglich definierte das Draht-Protokoll drei Hauptaufgaben: Kettensynchronisierung, Blockausbreitung und Transaktionsaustausch. Als Ethereum jedoch auf Proof-of-Stake umstellte, wurden Blockausbreitung und Kettensynchronisierung Teil der Konsensebene. Der Transaktionsaustausch liegt weiterhin in der Verantwortung der Ausführungskunden. Unter Transaktionsaustausch versteht man den Austausch ausstehender Transaktionen zwischen Knoten, sodass Blockersteller einige davon für die Aufnahme in den nächsten Block auswählen können. Detaillierte Informationen zu diesen Aufgaben sind [hier](https://github.com/ethereum/devp2p/blob/master/caps/eth.md) verfügbar. Clients, die diese Unterprotokolle unterstützen, stellen sie über die [JSON-RPC](/developers/docs/apis/json-rpc/) zur Verfügung. + +#### les (leichtes Ethereum-Unterprotokoll) {#les} + +Dies ist ein minimales Protokoll zum Synchronisieren von Light-Clients. Traditionell wurde dieses Protokoll selten verwendet, da vollständige Knoten erforderlich sind, um Daten an Light-Clients zu liefern, ohne dass hierfür Anreize bestehen. Das Standardverhalten von Ausführungsclients besteht nicht darin, leichte Client daten über Dateien bereitzustellen. Weitere Informationen sind in der les-[Spezifikation](https://github.com/ethereum/devp2p/blob/master/caps/les.md) verfügbar. + +#### Snap {#snap} + +Das [Snap-Protokoll](https://github.com/ethereum/devp2p/blob/master/caps/snap.md#ethereum-snapshot-protocol-snap) ist eine optionale Erweiterung, die es Peers ermöglicht, Snapshots der letzten Zustände auszutauschen, sodass Peers Konto- und Speicherdaten verifizieren können, ohne dazwischenliegende Merkle-Trie-Nodes herunterladen zu müssen. + +#### Wit (Witness-Protokoll) {#wit} + +Das [Witness-Protokoll](https://github.com/ethereum/devp2p/blob/master/caps/wit.md#ethereum-witness-protocol-wit) ist eine optionale Erweiterung, die den Austausch von Zustands-Witnesses zwischen Peers ermöglicht und dabei hilft, Clients mit der Spitze der Chain zu synchronisieren. + +#### Whisper {#whisper} + +Flüstern war ein Protokoll, das darauf abzielte, sichere Nachrichten zwischen Peers zu übermitteln, ohne Informationen in die Blockchain zu schreiben. Es war Teil des DevP2P Draht Protokolls, ist aber mittlerweile veraltet. Es gibt andere [verwandte Projekte](https://wakunetwork.com/) mit ähnlichen Zielen. + +## Die Konsens-Ebene {#consensus-layer} + +Die Konsens-Clients nehmen an einem separaten Peer-to-Peer-Netzwerk mit einer anderen Spezifikation teil. Konsens-Clients müssen am Blockklatsch teilnehmen, damit sie neue Blöcke von Peers erhalten und diese senden können, wenn sie an der Reihe sind, Blockvorschläge zu machen. Ähnlich wie bei der Ausführungsschicht ist hierfür zunächst ein Erkennungsprotokoll erforderlich, damit ein Knoten Peers finden und sichere Sitzungen zum Austausch von Blöcken, Bescheinigungen usw. herstellen kann. + +### Entdeckung {#consensus-discovery} + +Ähnlich wie die Ausführungs-Clients verwenden Konsens-Clients [discv5](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-discovery-domain-discv5) über UDP, um Peers zu finden. Die Implementierung von discv5 auf der Konsens-Ebene unterscheidet sich von der der Ausführungs-Clients nur dadurch, dass sie einen Adapter enthält, der discv5 mit einem [libP2P](https://libp2p.io/)-Stack verbindet, wodurch DevP2P veraltet ist. Die RLP Sitzungen der Ausführungsschicht werden zugunsten des Noise Secure Channel Handshake von vlib P2P verworfen. + +### ENRs {#consensus-enr} + +Der ENR für Konsens-Nodes enthält den öffentlichen Schlüssel des Node, die IP-Adresse, UDP- und TCP-Ports sowie zwei konsensspezifische Felder: das Attestierungs-Subnetz-Bitfeld und den `eth2`-Schlüssel. Ersteres erleichtert es Knoten, Peers zu finden, die an bestimmten Konsens Tratsch Subnetzwerken teilnehmen. Der `eth2`-Schlüssel enthält Informationen darüber, welche Ethereum-Fork-Version der Node verwendet, und stellt so sicher, dass die Peers sich mit dem richtigen Ethereum verbinden. + +### libP2P {#libp2p} + +Der Lib P2P Stack unterstützt die gesamte Kommunikation nach der Erkennung. Clients können gemäß der Definition in ihrer ENR über IPv4 und/oder IPv6 wählen und lauschen. Die Protokolle auf der lib P2P Schicht können in die Domänen Gossip und Req/Resp unterteilt werden. + +### Gossip {#gossip} + +Der Klatschbereich umfasst alle Informationen, die sich schnell im gesamten Netzwerk verbreiten müssen. Hierzu zählen Beacon Blöcke, Beweise, Bescheinigungen, Ausgänge und Schrägstriche. Dies wird mithilfe von libP2P gossipsub v1 übertragen und basiert auf verschiedenen Metadaten, die lokal an jedem Knoten gespeichert werden, einschließlich der maximalen Größe der zu empfangenden und zu übertragenden Gossip Nutzdaten. Detaillierte Informationen über die Gossip-Domäne sind [hier](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub) verfügbar. + +### Anfrage-Antwort {#request-response} + +Die Anforderungs-Antwort-Domäne enthält Protokolle für Clients, die bestimmte Informationen von ihren Peers anfordern. Beispiele hierfür sind das Anfordern bestimmter Beacon Blöcke, die bestimmten Root-Hashes entsprechen oder innerhalb eines Slot-Bereichs liegen. Die Antworten werden immer als bissig komprimierte SSZ codierte Bytes zurückgegeben. + +## Warum bevorzugt der Konsens Client SSZ gegenüber RLP? {#ssz-vs-rlp} + +SSZ steht für einfache Serialisierung. Es verwendet feste Offsets, die das Dekodieren einzelner Teile einer kodierten Nachricht erleichtern, ohne die gesamte Struktur dekodieren zu müssen. Dies ist für den Konsens-Client sehr nützlich, da er bestimmte Informationen effizient aus kodierten Nachrichten extrahieren kann. Es ist außerdem speziell für die Integration mit Merkle Protokollen konzipiert, mit entsprechenden Effizienzsteigerungen für die Merkleisieru. Da alle Hashes in der Konsensschicht Merkle Wurzeln sind, führt dies zu einer erheblichen Verbesserung. SSZ garantiert außerdem eindeutige Wertedarstellungen. + +## Verbinden der Ausführungs- und Konsens-Clients {#connecting-clients} + +Sowohl Konsens als auch Ausführungsclients laufen parallel. Sie müssen verbunden sein, damit der Konsens Clients dem Ausführungsclient Anweisungen erteilen und der Ausführungsclient Transaktionsbündel an den Konsens Clients übergeben kann, um sie in Beacon Blöcke aufzunehmen. Die Kommunikation zwischen den beiden Clients kann über eine lokale RPC Verbindung erfolgen. Eine API, die als ['Engine-API'](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) bekannt ist, definiert die Anweisungen, die zwischen den beiden Clients gesendet werden. Da beide Clients hinter einer einzigen Netzwerkidentität sitzen, teilen sie sich einen ENR (Ethereum-Knotendatensatz), der für jeden Client einen separaten Schlüssel enthält (Eth1-Schlüssel und Eth2-Schlüssel). + +Unten sehen Sie eine Zusammenfassung des Kontrollflusses, wobei der relevante Netzwerkstapel in Klammern steht. + +### Wenn der Konsens-Client kein Blockproduzent ist: {#when-consensus-client-is-not-block-producer} + +- Der Konsens-Client empfängt einen Block über das Block Tratsch Protokoll (Konsens P2P) +- Der Konsens-Client validiert den Block vorab, d. h. stellt sicher, dass er von einem gültigen Absender mit korrekten Metadaten stammt. +- Die Transaktionen im Block werden als Ausführungsnutzlast an die Ausführungsschicht gesendet (lokale RPC Verbindung) +- Die Ausführungsebene führt die Transaktionen aus und validiert den Zustand im Block-Header (d. h. prüft, ob die Hashes übereinstimmen). +- Die Ausführungsebene übergibt die Verbindung zurück an die Konsensebene. Der Block gilt nun als validiert (lokale RPC Verbindung) +- Die Konsensschicht fügt dem Kopf ihrer eigenen Blockchain einen Block hinzu und bestätigt ihn, indem sie die Bestätigung über das Netzwerk sendet (Konsens P2P) + +### Wenn der Konsens-Client Blockproduzent ist: {#when-consensus-client-is-block-producer} + +- Der Konsens Client erhält die Benachrichtigung, dass er der nächste Blockproduzent ist (Konsens P2P) +- Die Konsens-Ebene ruft die Methode `create block` im Ausführungs-Client auf (lokales RPC). +- Die Ausführungsschicht greift auf den Transaktion Mempool zu, der durch das Transaktion Tratsch Protokoll gefüllt wurde (Ausführung p2p) +- Der Ausführungsclient bündelt Transaktionen in einem Block, führt die Transaktionen aus und generiert einen Block-Hash +- Der Konsens-Client holt sich die Transaktionen und den Block-Hash vom Ausführungs-Client und fügt sie dem Beacon Block hinzu (lokales RPC) +- Der Konsens-Client überträgt den Block über das Block Tratsch Protokoll (Konsens P2P) +- Andere Clients erhalten den vorgeschlagenen Block über das Block Tratsch Protokoll und validieren ihn wie oben beschrieben (Konsens P2P) + +Sobald der Block von genügend Validierung bestätigt wurde, wird er dem Kopf der Kette hinzugefügt, gerechtfertigt und schließlich abgeschlossen. + +![](cons_client_net_layer.png) +![](exe_client_net_layer.png) + +Schema der Netzwerkebene für Konsens- und Ausführungs-Clients, von [ethresear.ch](https://ethresear.ch/t/eth1-eth2-client-relationship/7248) + +## Weiterführende Lektüre {#further-reading} + +[DevP2P](https://github.com/ethereum/devp2p) +[LibP2p](https://github.com/libp2p/specs) +[Netzwerkspezifikationen der Konsens-Ebene](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure) +[kademlia zu discv5](https://vac.dev/kademlia-to-discv5) +[kademlia-Paper](https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf) +[Einführung in Ethereum P2P](https://p2p.paris/en/talks/intro-ethereum-networking/) +[eth1/eth2-Beziehung](http://ethresear.ch/t/eth1-eth2-client-relationship/7248) +[Video mit Details zu Merge und eth2-Client](https://www.youtube.com/watch?v=zNIrIninMgg) diff --git a/public/content/translations/de/developers/docs/networking-layer/network-addresses/index.md b/public/content/translations/de/developers/docs/networking-layer/network-addresses/index.md new file mode 100644 index 00000000000..cfcf8b36275 --- /dev/null +++ b/public/content/translations/de/developers/docs/networking-layer/network-addresses/index.md @@ -0,0 +1,39 @@ +--- +title: Netzwerkadressen +description: Eine Einführung in Netzwerkadressen. +lang: de +sidebarDepth: 2 +--- + +Ethereum-Knoten müssen sich mit einigen grundlegenden Informationen identifizieren, um eine Verbindung zu Peers herzustellen. Um sicherzustellen, dass jeder potenzielle Peer diese Informationen interpretieren kann, werden sie in einem von drei standardisierten Formaten weitergeleitet, die jeder Ethereum-Knoten verstehen kann: Multiaddr, Enode oder Ethereum Node Records (ENRs). ENRS sind der aktuelle Standard für Ethereum Netzwerkadressen + +## Voraussetzungen {#prerequisites} + +Zum Verständnis dieser Seite sind gewisse Kenntnisse der [Netzwerkschicht](/developers/docs/networking-layer/) von Ethereum erforderlich. + +## Multiaddr {#multiaddr} + +Das ursprüngliche Ethereum-Knotenadressformat war „Multiaddr“ (kurz für „Multi-Adressen“). Multiaddr ist ein universelles Format, das für Peer-to-Peer-Netzwerke entwickelt wurde. Adressen werden als Schlüssel Wert Paare dargestellt, wobei Schlüssel und Werte durch einen Schrägstrich getrennt sind. Beispielsweise sieht die Multiaddr für einen Knoten mit der IPv4-Adresse `192.168.22.27`, der auf dem TCP-Port `33000` lauscht, folgendermaßen aus: + +/ip4/192.168.22.27/tcp/33000 + +Für einen Ethereum-Knoten enthält die Multiadr die Knoten-ID (einen Hash ihres öffentlichen Schlüssels): + +/ip4/192.168.22.27/tcp/33000/p2p/5t7Nv7dG2d6ffbvAiewVsEwWweU3LdebSqX2y1bPrW8br + +## Enode {#enode} + +Ein Enode ist eine Möglichkeit, einen Ethereum-Knoten mithilfe eines URL-Adressformats zu identifizieren. Die hexadezimale Knoten-ID ist im Benutzer namenteil der URL codiert und durch ein @-Zeichen vom Host getrennt. Der Hostname kann nur als IP-Adresse angegeben werden, DNS-Namen sind nicht zulässig. Der Port im Abschnitt „Hostname“ ist der TCP-Abhörport. Wenn sich die TCP- und UDP-Ports (Discovery) unterscheiden, wird der UDP Port als Abfrageparameter "diskportieren" angegeben. + +Im folgenden Beispiel beschreibt die Knoten-URL einen Knoten mit der IP-Adresse `10.3.58.6`, dem TCP-Port `30303` und dem UDP-Erkennungsport `30301`. + +enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@10.3.58.6:30303?discport=30301 + +## Ethereum-Knotenaufzeichnungen (ENRs) {#enr} + +Ethereum Node Records (ENRs) sind ein standardisiertes Format für Netzwerkadressen auf Ethereum. Sie ersetzen multiaddr und Enodes. Diese sind besonders nützlich, da sie einen größeren Informationsaustausch zwischen Knoten ermöglichen. Der ENR enthält eine Signatur, eine Sequenznummer und Felder, die das Identitätsschema detailliert beschreiben, das zum Generieren und Validieren von Signaturen verwendet wird. Der ENR kann auch mit beliebigen Daten gefüllt werden, die als Schlüssel-Wert-Paare organisiert sind. Diese Schlüssel-Wert-Paare enthalten die IP-Adresse des Knotens und Informationen zu den Unterprotokollen, die der Knoten verwenden kann. Konsens-Clients verwenden eine [spezifische ENR-Struktur](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure), um Boot-Knoten zu identifizieren, und enthalten außerdem ein `eth2`-Feld mit Informationen über den aktuellen Ethereum-Fork und das Attestierungs-Gossip-Subnetz (dies verbindet den Knoten mit einer bestimmten Gruppe von Peers, deren Attestierungen zusammengefasst werden). + +## Weiterführende Lektüre {#further-reading} + +- [EIP-778: Ethereum-Knotenaufzeichnungen (ENR)](https://eips.ethereum.org/EIPS/eip-778) +- [LibP2P: Multiaddr-Enode-ENR?!](https://consensys.net/diligence/blog/2020/09/libp2p-multiaddr-enode-enr/) diff --git a/public/content/translations/de/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/de/developers/docs/networking-layer/portal-network/index.md new file mode 100644 index 00000000000..cfb59858864 --- /dev/null +++ b/public/content/translations/de/developers/docs/networking-layer/portal-network/index.md @@ -0,0 +1,89 @@ +--- +title: Das Portal-Netzwerk +description: Ein Überblick über das Portal-Netzwerk – ein in der Entwicklung befindliches Netzwerk, das für die Unterstützung von Clients mit geringen Ressourcen konzipiert ist. +lang: de +--- + +Ethereum ist ein Netzwerk aus Computern, auf denen Ethereum-Client-Software läuft. Jeder dieser Computer wird als „Node“ bezeichnet. Die Client-Software ermöglicht es einem Node, Daten im Ethereum-Netzwerk zu senden und zu empfangen, und verifiziert die Daten anhand der Regeln des Ethereum-Protokolls. Nodes speichern große Mengen historischer Daten auf ihrem Festplattenspeicher und ergänzen diese, sobald sie neue Informationspakete – sogenannte Blöcke – von anderen Nodes im Netzwerk empfangen. Dies ist notwendig, um ständig zu überprüfen, dass die Informationen eines Nodes mit dem Rest des Netzwerks konsistent sind. Dies hat zur Folge, dass der Betrieb eines Nodes viel Speicherplatz beanspruchen kann. Manche Node-Operationen können ebenfalls viel RAM benötigen. + +Um dieses Speicherplatzproblem zu umgehen, wurden „Light“-Nodes entwickelt, die Informationen von Full Nodes anfordern, anstatt sie alle selbst zu speichern. Das bedeutet jedoch, dass der Light Node die Informationen nicht unabhängig verifiziert und stattdessen einem anderen Node vertrauen muss. Es bedeutet auch, dass Full Nodes zusätzliche Arbeit leisten müssen, um diese Light Nodes zu bedienen. + +Das Portal-Netzwerk ist ein neues Netzwerkdesign für Ethereum, das darauf abzielt, das Problem der Datenverfügbarkeit für „Light“-Nodes zu lösen, ohne auf Full Nodes vertrauen oder diese zusätzlich belasten zu müssen, indem die notwendigen Daten in kleinen Teilen über das Netzwerk verteilt werden. + +Mehr über [Nodes und Clients](/developers/docs/nodes-and-clients/) + +## Warum brauchen wir das Portal-Netzwerk? {#why-do-we-need-portal-network} + +Ethereum-Nodes speichern ihre eigene vollständige oder teilweise Kopie der Ethereum-Blockchain. Diese lokale Kopie wird verwendet, um Transaktionen zu validieren und sicherzustellen, dass der Node der korrekten Chain folgt. Diese lokal gespeicherten Daten ermöglichen es Nodes, unabhängig zu verifizieren, dass eingehende Daten gültig und korrekt sind, ohne einer anderen Instanz vertrauen zu müssen. + +Diese lokale Kopie der Blockchain und die zugehörigen State- und Belegdaten nehmen viel Platz auf der Festplatte des Nodes ein. Für den Betrieb eines Nodes, der [Geth](https://geth.ethereum.org) zusammen mit einem Konsens-Client nutzt, wird zum Beispiel eine 2-TB-Festplatte empfohlen. Bei Verwendung von Snap Sync, das nur Kettendaten aus einem relativ aktuellen Satz von Blöcken speichert, belegt Geth normalerweise etwa 650 GB Festplattenspeicher, wächst aber um etwa 14 GB/Woche (Sie können den Node regelmäßig auf 650 GB bereinigen). + +Das heißt, dass der Node-Betrieb teuer sein kann, weil ein großer Teil des Speicherplatzes für Ethereum dediziert werden muss. Es gibt mehrere Lösungen für dieses Problem in der Ethereum-Roadmap, darunter der [Ablauf der Historie](/roadmap/statelessness/#history-expiry), der [Ablauf des Zustands](/roadmap/statelessness/#state-expiry) und die [Zustandslosigkeit](/roadmap/statelessness/). Bis zur Implementierung dieser Lösungen werden jedoch wahrscheinlich noch einige Jahre vergehen. Es gibt auch [Light-Nodes](/developers/docs/nodes-and-clients/light-clients/), die keine eigene Kopie der Kettendaten speichern; sie fordern die benötigten Daten von Full Nodes an. Das bedeutet jedoch, dass Light-Nodes darauf vertrauen müssen, dass Full Nodes ehrliche Daten liefern, und es belastet auch die Full Nodes, die die von den Light-Nodes benötigten Daten bereitstellen müssen. + +Das Portal-Netzwerk zielt darauf ab, Light-Nodes eine alternative Möglichkeit zur Datenbeschaffung zu bieten, die weder Vertrauen in Full Nodes erfordert noch deren Arbeitslast wesentlich erhöht. Um dies zu erreichen, wird ein neues Verfahren für den Datenaustausch zwischen Ethereum-Nodes eingeführt. + +## Wie funktioniert das Portal-Netzwerk? {#how-does-portal-network-work} + +Für Ethereum-Nodes gelten strikte Protokolle, die festlegen, wie die Kommunikation untereinander abläuft. Ausführungs-Clients kommunizieren über eine Reihe von Subprotokollen, die als [DevP2P](/developers/docs/networking-layer/#devp2p) bekannt sind, während Konsens-Clients einen anderen Protokoll-Stack namens [libP2P](/developers/docs/networking-layer/#libp2p) verwenden. Sie legen fest, welche Datenarten zwischen den Nodes ausgetauscht werden können. + +![devP2P und libP2P](portal-network-devp2p-libp2p.png) + +Nodes können auch bestimmte Daten über die [JSON-RPC-API](/developers/docs/apis/json-rpc/) bereitstellen. Auf diese Weise tauschen Apps und Wallets Informationen mit Ethereum-Nodes aus. Jedoch eignet sich keines dieser Protokolle optimal für die Datenversorgung von Light-Clients. + +Aktuell können Light-Clients keine gezielten Kettendaten über DevP2P oder libP2P abfragen, weil diese Protokolle lediglich für die Synchronisation der Chain und die Verbreitung von Blöcken und Transaktionen konzipiert wurden. Light-Clients wollen diese Informationen nicht herunterladen, da sie sonst nicht mehr „light“ wären. + +Die JSON-RPC-API ist ebenfalls keine ideale Wahl für Datenanfragen von Light-Clients, da sie auf einer Verbindung zu einem bestimmten Full Node oder einem zentralisierten RPC-Anbieter beruht, der die Daten bereitstellen kann. Das bedeutet, der Light-Client muss auf die Ehrlichkeit des jeweiligen Nodes/Anbieters vertrauen. Gleichzeitig muss der Full Node potenziell viele Anfragen von vielen Light-Clients bearbeiten, was seinen Bandbreitenbedarf erhöht. + +Das Portal-Netzwerk verfolgt den Ansatz, die Architektur von Grund auf neu zu konzipieren. Der Fokus liegt dabei auf einem schlanken Betrieb, unabhängig von den Design-Einschränkungen bestehender Ethereum-Clients. + +Die Kernidee des Portal-Netzwerks ist es, die besten Elemente des aktuellen Netzwerk-Stacks zu übernehmen. Informationen, die von Light-Clients benötigt werden, wie historische Daten und die Identität des aktuellen Chain-Heads, werden über ein leichtes dezentrales Peer-to-Peer-Netzwerk im DevP2P-Stil bereitgestellt, das eine [DHT](https://en.wikipedia.org/wiki/Distributed_hash_table) (ähnlich wie Bittorrent) verwendet. + +Das Konzept besteht darin, jedem Node nur kleine Teilstücke der gesamten Ethereum-Historie und bestimmte Aufgaben zu übertragen. Zur Beantwortung von Anfragen werden gezielt die Nodes gesucht, welche die spezifischen Daten vorhalten, um diese anschließend von dort zu beziehen. + +Damit wird das herkömmliche Modell umgekehrt: Anstatt einen einzelnen Node mit dem Filtern und der Bereitstellung großer Datenmengen zu beauftragen, durchsuchen Light-Nodes zügig ein umfassendes Netzwerk, in dem jeder Node nur geringe Datenmengen verarbeitet. + +Das Ziel ist es, einem dezentralen Netzwerk von leichtgewichtigen Portal-Clients zu ermöglichen: + +- den Head der Chain zu verfolgen +- aktuelle und historische Kettendaten zu synchronisieren +- Zustandsdaten abzurufen +- Transaktionen zu versenden +- Transaktionen mit der [EVM](/developers/docs/evm/) auszuführen + +Die Vorteile dieser Netzwerkarchitektur lauten: + +- geringere Abhängigkeit von zentralisierten Anbietern +- Reduzierung der Internet-Bandbreitennutzung +- Minimierter oder gänzlich entfallender Synchronisierungsaufwand +- Zugänglich für Geräte mit begrenzten Ressourcen (<1 GB RAM, <100 MB Festplattenspeicher, 1 CPU) + +Die nachstehende Tabelle zeigt die Funktionen bestehender Clients, die vom Portal-Netzwerk bereitgestellt werden können, sodass Benutzer auf diese Funktionen auf Geräten mit sehr geringen Ressourcen zugreifen können. + +### Die Portal-Netzwerke + +| Beacon Light Client | State-Netzwerk | Transaktionsklatsch | History-Netzwerk | +| ------------------- | ----------------------------- | ------------------- | ---------------- | +| Beacon Chain Light | Account- und Contract-Storage | Lightweight-Mempool | Header | +| Protokolldaten | | | Block-Bodies | +| | | | Belege | + +## Client-Diversität als Standard {#client-diversity-as-default} + +Die Entwickler des Portal-Netzwerks trafen auch die Design-Entscheidung, von Anfang an vier separate Portal-Netzwerk-Clients zu entwickeln. + +Folgende Clients existieren für das Portal-Netzwerk: + +- [Trin](https://github.com/ethereum/trin): geschrieben in Rust +- [Fluffy](https://fluffy.guide): geschrieben in Nim +- [Ultralight](https://github.com/ethereumjs/ultralight): geschrieben in Typescript +- [Shisui](https://github.com/zen-eth/shisui): geschrieben in Go + +Mehrere unabhängige Client-Implementierungen erhöhen die Ausfallsicherheit und Dezentralisierung des Ethereum-Netzwerks. + +Wenn bei einem Client Probleme oder Schwachstellen auftreten, können andere Clients reibungslos weiterarbeiten, wodurch ein Single Point of Failure verhindert wird. Darüber hinaus fördern vielfältige Client-Implementierungen Innovation und Wettbewerb, was zu Verbesserungen führt und das Risiko einer Monokultur innerhalb des Ökosystems verringert. + +## Weiterführende Lektüre {#further-reading} + +- [Das Portal-Netzwerk (Piper Merriam auf der Devcon Bogota)](https://www.youtube.com/watch?v=0stc9jnQLXA). +- [Der Discord des Portal-Netzwerks](https://discord.gg/CFFnmE7Hbs) +- [Die Website des Portal-Netzwerks](https://www.ethportal.net/) diff --git a/public/content/translations/de/developers/docs/networks/index.md b/public/content/translations/de/developers/docs/networks/index.md index 583edd737f4..3bc8ccb1db0 100644 --- a/public/content/translations/de/developers/docs/networks/index.md +++ b/public/content/translations/de/developers/docs/networks/index.md @@ -10,7 +10,7 @@ Ihr Ethereum-Konto funktioniert in den verschiedenen Netzwerken, aber Ihr Kontos ## Voraussetzungen {#prerequisites} -Sie sollten die [Grundlagen von Ethereum](/developers/docs/intro-to-ethereum/) verstehen, bevor Sie sich über die verschiedenen Netzwerke informieren, denn die Testnetzwerke bieten Ihnen eine billige, sichere Version von Ethereum, mit der Sie Dinge ausprobieren können. +Sie sollten die [Grundlagen von Ethereum](/developers/docs/intro-to-ethereum/) verstehen, bevor Sie sich über die verschiedenen Netzwerke informieren, da die Testnets Ihnen eine günstige, sichere Version von Ethereum zum Ausprobieren bieten. ## Öffentliche Netzwerke {#public-networks} @@ -22,32 +22,27 @@ Mainnet ist die primäre öffentliche Ethereum-Produktions-Blockchain, bei der T Wenn Menschen und Börsen ETH-Preise diskutieren, sprechen sie über Mainnet ETH. -### Ethereum Testnetze {#ethereum-testnets} +### Ethereum-Testnets {#ethereum-testnets} -Neben dem Mainnet gibt es öffentliche Testnetze. Diese werden von Protokollentwicklern oder Smart-Contract-Entwicklern verwendet, um sowohl Protokoll-Upgrades als auch potenzielle Smart Contracts in einer produktionsähnlichen Umgebung zu testen, bevor sie auf das Mainnet deployed werden. Stellen Sie sich das als Analogie zu Produktions- und Staging-Servern vor. +Zusätzlich zum Mainnet gibt es öffentliche Testnetze. Dabei handelt es sich um Netzwerke, die von Protokollentwicklern oder Smart-Contract-Entwicklern eingesetzt werden, um sowohl Protokoll-Upgrades als auch potenzielle Smart Contracts in einer produktionsähnlichen Umgebung zu testen, bevor sie ins Mainnet gelangen. Stelle dir dies als Analog zur Produktion im Vergleich zu Staging-Servern vor. -Sie sollten jeden Contract-Code, den Sie schreiben, auf einem Testnet testen, bevor Sie ihn auf dem Mainnet deployen. Unter den dApps, die mit bestehenden Smart Contracts integriert sind, haben die meisten Projekte Kopien auf Testnetzen deployed. +Sie sollten jeden Contract-Code, den Sie schreiben, in einem Testnet testen, bevor Sie ihn im Mainnet einsetzen. dApps, die mit bestehenden Smart Contracts integriert werden, haben Kopien der meisten Projekte in Testnets bereitgestellt. -Die meisten Testnetze begannen mit einem berechtigten Proof-of-Authority-Konsensmechanismus. Das bedeutet, dass eine kleine Anzahl von Nodes ausgewählt wird, um Transaktionen zu validieren und neue Blöcke zu erstellen – wobei sie ihre Identität in diesem Prozess einsetzen. Alternativ verfügen einige Testnetze über einen offenen Proof-of-Stake-Konsensmechanismus, bei dem jeder das Validieren testen kann, genau wie beim Ethereum Mainnet. +Die meisten Testnets begannen mit einem berechtigten Proof-of-Authority-Konsensmechanismus. Dies bedeutet, dass eine kleine Anzahl von Nodes ausgewählt wird, um Transaktionen zu validieren und neue Blöcke zu erstellen – und ihre Identität im Prozess zu hinterlegen. Alternativ dazu bieten einige Testnets einen offenen Proof-of-Stake-Konsensmechanismus, bei dem jeder testweise einen Valitador laufen lassen kann, genau wie beim Ethereum-Mainnet. -ETH auf Testnetzen soll keinen realen Wert haben; es wurden jedoch Märkte für bestimmte Arten von Testnet-ETH geschaffen, die knapp oder schwer zu erhalten geworden sind. Da Sie ETH benötigen, um tatsächlich mit Ethereum zu interagieren (selbst auf Testnetzen), erhalten die meisten Menschen Testnet-ETH kostenlos von Faucets. Die meisten Faucets sind Webanwendungen, in die Sie eine Adresse eingeben können, an die Sie ETH senden möchten. +ETH in Testnets soll keinen wirklichen Wert haben. Es wurden jedoch Märkte für bestimmte Arten von Testnet-ETH geschaffen, die knapp oder schwer zu bekommen sind. Da Sie ETH benötigen, um tatsächlich mit Ethereum zu interagieren (sogar auf Testnets), erhalten die meisten Nutzer Testnet-ETH kostenlos von Faucets. Die meisten Faucets sind Webapplikationen, bei denen Sie eine Adresse eingeben können, an die die ETH gesendet werden sollen. #### Welches Testnet soll ich benutzen? -Die beiden öffentlichen Testnetze, die Client-Entwickler derzeit warten, sind Sepolia und Hoodi. Sepolia ist ein Netzwerk für Contract- und Anwendungsentwickler, um ihre Anwendungen zu testen. Das Hoodi-Netzwerk ermöglicht es Protokollentwicklern, Netzwerk-Upgrades zu testen, und Stakern, das Validieren zu testen. +Die beiden öffentlichen Testnets, die von Client-Entwicklern derzeit gepflegt werden, sind Sepolia und Hoodi. Sepolia ist ein Netz für Smart Contract- und Anwendungsentwickler zum Testen ihrer Anwendungen. Das Hoodi-Netzwerk ermöglicht Protokollentwicklern das Testen von Netzwerk-Upgrades und Stakern das Testen des Betriebs von Validatoren. #### Sepolia {#sepolia} -**Sepolia ist das empfohlene Standard-Testnet für die Anwendungsentwicklung**. -Das Sepolia-Netzwerk verwendet einen berechtigten Validatorsatz. Es ist relativ neu, was bedeutet, dass sein Zustand und seine Historie beide recht klein sind. Das bedeutet, dass das Netzwerk schnell synchronisiert und dass das Betreiben eines Nodes weniger Speicherplatz erfordert. Dies ist nützlich für Benutzer, die schnell einen Node starten und direkt mit dem Netzwerk interagieren möchten. - -- Geschlossener Validatorsatz, kontrolliert von Client- und Testteams -- Neues Testnet, weniger Anwendungen deployed als bei anderen Testnetzen -- Schnelle Synchronisation und minimaler Speicherplatzbedarf für den Betrieb eines Nodes +**Sepolia ist das empfohlene Standard-Testnet für die Anwendungsentwicklung**. Das Sepolia-Netzwerk verwendet einen genehmigten Validatorensatz, der von Client- und Test-Teams kontrolliert wird. ##### Ressourcen -- [Website](https://sepolia.dev/) +- [Webseite](https://sepolia.dev/) - [GitHub](https://github.com/eth-clients/sepolia) - [Otterscan](https://sepolia.otterscan.io/) - [Etherscan](https://sepolia.etherscan.io) @@ -55,70 +50,125 @@ Das Sepolia-Netzwerk verwendet einen berechtigten Validatorsatz. Es ist relativ ##### Faucets -- [QuickNode Sepolia Faucet](https://faucet.quicknode.com/drip) +- [Alchemy Sepolia Faucet](https://www.alchemy.com/faucets/ethereum-sepolia) +- [Chain Platform Sepolia Faucet](https://faucet.chainplatform.co/faucets/ethereum-sepolia/) +- [Chainstack Sepolia Faucet](https://faucet.chainstack.com/sepolia-testnet-faucet) +- [Ethereum Ecosystem Faucet](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) +- [ethfaucet.com Sepolia Faucet](https://ethfaucet.com/networks/ethereum) +- [Google Cloud Web3 Sepolia Faucet](https://cloud.google.com/application/web3/faucet/ethereum/sepolia) - [Grabteeth](https://grabteeth.xyz/) -- [PoW faucet](https://sepolia-faucet.pk910.de/) -- [Coinbase Wallet Faucet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) -- [Alchemy Sepolia faucet](https://sepoliafaucet.com/) -- [Infura Sepolia faucet](https://www.infura.io/faucet) -- [Chainstack Sepolia faucet](https://faucet.chainstack.com/sepolia-faucet) -- [Ethereum Ecosystem faucet](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) - +- [Infura Sepolia Faucet](https://www.infura.io/faucet) +- [PoW Faucet](https://sepolia-faucet.pk910.de/) +- [QuickNode Sepolia Faucet](https://faucet.quicknode.com/ethereum/sepolia) #### Hoodi {#hoodi} -Hoodi ist ein Testnet zum Testen von Validierung und Staking. Das Hoodi-Netzwerk ist offen für Benutzer, die einen Testnet-Validator betreiben möchten. Staker, die Protokoll-Upgrades testen möchten, bevor sie auf dem Mainnet deployed werden, sollten daher Hoodi verwenden. +Hoodi ist ein Testnet zum Testen des Validierens und Stakens. Das Hoodi-Netzwerk ist offen für Benutzer, die einen Testnet-Validator betreiben möchten. Staker, die Protokoll-Upgrades testen möchten, bevor sie im Mainnet eingesetzt werden, sollten daher Hoodi verwenden. -- Offener Validatorsatz, Staker können Netzwerk-Upgrades testen -- Großer Zustand, nützlich für das Testen komplexer Smart-Contract-Interaktionen -- Längere Synchronisationszeit und mehr Speicherplatz für den Betrieb eines Nodes erforderlich +- Offene Validatoren-Sets ermöglichen es Stakern, Netzwerk-Upgrades zu testen, bevor sie live gehen +- Großer Zustand, nützlich zum Testen komplexer Smart-Contract-Interaktionen +- Längere Synchronisationsdauer und erfordert mehr Speicherplatz, um einen Node zu betreiben ##### Ressourcen -- [Website](https://hoodi.ethpandaops.io/) +- [Webseite](https://hoodi.ethpandaops.io/) - [GitHub](https://github.com/eth-clients/hoodi) - [Explorer](https://explorer.hoodi.ethpandaops.io/) - [Checkpoint Sync](https://checkpoint-sync.hoodi.ethpandaops.io/) +- [Otterscan](https://hoodi.otterscan.io/) +- [Etherscan](https://hoodi.etherscan.io/) ##### Faucets +- [Chain Platform Hoodi Faucet](https://faucet.chainplatform.co/faucets/ethereum-hoodi/) - [Hoodi Faucet](https://hoodi.ethpandaops.io/) +- [PoW Faucet](https://hoodi-faucet.pk910.de/) + +#### Ephemery {#ephemery} + +Ephemer ist eine einzigartige Art von Testnetz, das jeden Monat vollständig zurückgesetzt wird. Die Ausführung und der Konsens zustand kehren alle 28 Tage zum Genesis-Zustand zurück, was bedeutet, dass alles, was im Testnetz geschieht, vergänglich ist. Dies macht es ideal für kurzfristige Tests, schnelles Nöte-Bootstrapping und „Hello World“-Anwendungen, die keine Dauerhaftigkeit erfordern. + +- Immer aktueller Stand, kurzfristige Tests von Validatoren und Apps +- Enthält nur grundlegende Verträge +- Offener Validation-Satz und einfacher Zugriff auf große Geldbeträge +- Geringste Anforderungen an Knoten und schnellste Synchronisierung, durchschnittlich <5 GB + +##### Ressourcen + +- [Webseite](https://ephemery.dev/) +- [Github](https://github.com/ephemery-testnet/ephemery-resources) +- [Community-Chat](https://matrix.to/#/#staker-testnet:matrix.org) +- [Blockscout](https://explorer.ephemery.dev/) +- [Otterscan](https://otter.bordel.wtf/) +- [Beacon-Explorer](https://beaconlight.ephemery.dev/) +- [Checkpoint Sync](https://checkpoint-sync.ephemery.ethpandaops.io) +- [Launchpad](https://launchpad.ephemery.dev/) -Um einen Validator auf dem Hoodi-Testnet zu starten, verwenden Sie [Hoodi launchpad](https://hoodi.launchpad.ethereum.org/en/). +#### Faucets -### Layer-2-Testnetze {#layer-2-testnets} +- [Bordel Faucet](https://faucet.bordel.wtf/) +- [Pk910 PoW Faucet](https://ephemery-faucet.pk910.de/) -[Layer 2 (L2)](/layer-2/) ist ein Sammelbegriff zur Beschreibung einer bestimmten Gruppe von Ethereum-Skalierungslösungen. Ein Layer 2 ist eine separate Blockchain, die Ethereum erweitert und die Sicherheitsgarantien von Ethereum erbt. Layer-2-Testnetze sind normalerweise eng mit öffentlichen Ethereum-Testnetzen verbunden. +#### Holesky (veraltet) {#holesky} + +Das Holesky-Testnet wird im September 2025 eingestellt. Staking-Betreiber und Infrastruktur-Anbieter sollten stattdessen Hoodi für Validator-Tests verwenden. + +- [Ankündigung der Abschaltung des Holesky-Testnets](https://blog.ethereum.org/2025/09/01/holesky-shutdown-announcement) – _EF-Blog, 1. September 2025_ +- [Updates zu den Testnets Holesky und Hoodi](https://blog.ethereum.org/en/2025/03/18/hoodi-holesky) – _EF-Blog, 18. März 2025_ + +### Layer-2-Testnets {#layer-2-testnets} + +[Layer 2 (L2)](/layer-2/) ist ein Sammelbegriff für eine bestimmte Reihe von Ethereum-Skalierungslösungen. Ein Layer-2 ist eine separate Blockchain, die Ethereum erweitert und die Sicherheitsgarantien von Ethereum erbt. Layer-2-Testnets sind in der Regel eng mit öffentlichen Ethereum-Testnets gekoppelt. #### Arbitrum Sepolia {#arbitrum-sepolia} Ein Testnet für [Arbitrum](https://arbitrum.io/). +##### Ressourcen + +- [Etherscan](https://sepolia.arbiscan.io/) +- [Blockscout](https://sepolia-explorer.arbitrum.io/) + ##### Faucets -- [Chainlink faucet](https://faucets.chain.link/arbitrum-sepolia) -- [Alchemy faucet](https://www.alchemy.com/faucets/arbitrum-sepolia) +- [Alchemy Arbitrum Sepolia Faucet](https://www.alchemy.com/faucets/arbitrum-sepolia) +- [Chainlink Arbitrum Sepolia Faucet](https://faucets.chain.link/arbitrum-sepolia) +- [ethfaucet.com Arbitrum Sepolia Faucet](https://ethfaucet.com/networks/arbitrum) +- [QuickNode Arbitrum Sepolia Faucet](https://faucet.quicknode.com/arbitrum/sepolia) #### Optimistic Sepolia {#optimistic-sepolia} Ein Testnet für [Optimism](https://www.optimism.io/). +##### Ressourcen + +- [Etherscan](https://sepolia-optimistic.etherscan.io/) +- [Blockscout](https://optimism-sepolia.blockscout.com/) + ##### Faucets -- [Chainlink faucet](https://faucets.chain.link/optimism-sepolia) -- [Alchemy faucet](https://www.alchemy.com/faucets/optimism-sepolia) +- [Alchemy Faucet](https://www.alchemy.com/faucets/optimism-sepolia) +- [Chainlink Faucet](https://faucets.chain.link/optimism-sepolia) +- [ethfaucet.com Optimism Sepolia Faucet](https://ethfaucet.com/networks/optimism) +- [Testnet Faucet](https://docs.optimism.io/builders/tools/build/faucets) #### Starknet Sepolia {#starknet-sepolia} Ein Testnet für [Starknet](https://www.starknet.io). +##### Ressourcen + +- [Starkscan](https://sepolia.starkscan.co/) + ##### Faucets -- [Alchemy faucet](https://www.alchemy.com/faucets/starknet-sepolia) +- [Alchemy Faucet](https://www.alchemy.com/faucets/starknet-sepolia) +- [Blast Starknet Sepolia Faucet](https://blastapi.io/faucets/starknet-sepolia-eth) +- [Starknet Faucet](https://starknet-faucet.vercel.app/) ## Private Netzwerke {#private-networks} -Ein Ethereum-Netzwerk ist ein privates Netzwerk, wenn seine Knoten nicht mit einem öffentlichen Netzwerk verbunden sind (z. B. mit Mainnet oder einem Testnet). In diesem Zusammenhang bedeutet privat nur reserviert oder isoliert statt geschützt oder sicher. +Ein Ethereum-Netzwerk ist ein privates Netzwerk, wenn seine Nodes nicht an ein öffentliches Netzwerk angeschlossen sind (z. B. Mainnet oder ein Testnet). In diesem Zusammenhang bedeutet privat nur reserviert oder isoliert statt geschützt oder sicher. ### Entwicklungsnetzwerke {#development-networks} @@ -126,18 +176,41 @@ Um eine Ethereum-Anwendung zu entwickeln, ist es ratsam, sie in einem privaten N Es gibt Projekte und Tools, die dabei hilfreich sind. Erfahren Sie mehr über [Entwicklungsnetzwerke](/developers/docs/development-networks/). -### Konsortium-Netzwerke {#consortium-networks} +### Konsortialnetzwerke {#consortium-networks} -Der Konsensprozess wird von einer vordefinierten Gruppe von Nodes gesteuert, die vertrauenswürdig sind. Beispielsweise ein privates Netzwerk bekannter akademischer Institutionen, die jeweils eine einzelne Node stellen, sowie Blöcke werden mithilfe einer Schwelle von Unterzeichnern innerhalb des Netzwerks validiert. +Der Konsensprozess wird von einer vordefinierten Gruppe von Knoten gesteuert, die vertrauenswürdig sind. Beispielsweise ein privates Netzwerk bekannter akademischer Institutionen, die jeweils eine einzelne Node stellen, sowie Blöcke werden mithilfe einer Schwelle von Unterzeichnern innerhalb des Netzwerks validiert. Wenn ein öffentliches Ethereum-Netzwerk wie das öffentliche Internet ist, dann ist ein Konsortialnetzwerk wie ein privates Intranet. -## Verwandte Tools {#related-tools} +## Warum sind Ethereum-Testnets nach U-Bahn-Stationen benannt? {#why-naming} + +Viele Ethereum-Testnets sind nach realen U-Bahn- oder Bahnhöfen benannt. Diese Namensgebungstradition begann schon früh und spiegelt die globalen Städte wider, in denen Mitwirkende gelebt oder gearbeitet haben. Sie ist symbolisch, einprägsam und praktisch. So wie Testnets vom Ethereum-Mainnet isoliert sind, verlaufen auch U-Bahn-Linien getrennt vom oberirdischen Verkehr. + +### Häufig verwendete und veraltete Testnets {#common-and-legacy-testnets} + +- **Sepolia** – Ein an die U-Bahn angebundenes Viertel in Athen, Griechenland. Wird derzeit für Tests von Smart Contracts und Dapps verwendet. +- **Hoodi** – Benannt nach der U-Bahn-Station Hoodi in Bengaluru, Indien. Wird für Validator- und Protokoll-Upgrade-Tests verwendet. +- **Goerli** _(veraltet)_ – Benannt nach dem Görlitzer Bahnhof in Berlin, Deutschland. +- **Rinkeby** _(veraltet)_ – Benannt nach einem Vorort von Stockholm mit einer U-Bahn-Station. +- **Ropsten** _(veraltet)_ – Bezieht sich auf ein Gebiet und ein ehemaliges Fähr-/U-Bahn-Terminal in Stockholm. +- **Kovan** _(veraltet)_ – Benannt nach einer MRT-Station in Singapur. +- **Morden** _(veraltet)_ – Benannt nach einer Station der Londoner U-Bahn. Das erste öffentliche Testnet von Ethereum. + +### Andere spezialisierte Testnets {#other-testnets} + +Einige Testnets wurden für kurzfristige oder upgrade-spezifische Tests erstellt und sind nicht unbedingt nach U-Bahnen benannt: + +- **Holesky** _(veraltet)_ – Benannt nach dem Bahnhof Holešovice in Prag. Wurde für Validator-Tests verwendet; veraltet ab 2025. +- **Kiln**, **Zhejiang**, **Shandong**, **Prater**, **Pyrmont**, **Olympic** _(alle veraltet)_ und **Ephemery** – Speziell für Upgrade-Simulationen wie „Die Zusammenführung“, „Shanghai“ oder Validator-Experimente entwickelt. Einige Namen sind eher regional oder thematisch als U-Bahn-basiert. + +Die Verwendung von Namen von U-Bahn-Stationen hilft Entwicklern, Testnets schnell zu identifizieren und sich daran zu erinnern, ohne sich auf numerische Chain-IDs verlassen zu müssen. Es spiegelt auch die Kultur von Ethereum wider: praktisch, global und auf den Menschen ausgerichtet. + +## Zugehörige Werkzeuge {#related-tools} -- [Chain-Liste](https://chainlist.org/) _Liste der EVM-Netzwerke, um Wallets und Anbieter mit der entsprechenden Chain-ID und Netzwerk-ID zu verbinden_ -- [EVM-basierte Chains](https://github.com/ethereum-lists/chains) _GitHub Repo der Chain-Metadaten, die die Chain-Liste_ unterstützen +- [Chainlist](https://chainlist.org/) _Liste von EVM-Netzwerken, um Wallets und Anbieter mit der entsprechenden Chain-ID und Netzwerk-ID zu verbinden_ +- [EVM-basierte Chains](https://github.com/ethereum-lists/chains) _GitHub-Repo mit Chain-Metadaten, das Chainlist unterstützt_ -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Vorschlag: vorhersehbarer Ethereum-Testnet-Lebenszyklus](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) +- [Vorschlag: Vorhersehbarer Lebenszyklus von Ethereum-Testnets](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) - [Die Entwicklung der Ethereum-Testnets](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md index 336f79d73a6..5f482659143 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/archive-nodes/index.md @@ -9,21 +9,21 @@ Ein Archivierungsknoten ist eine Instanz eines Ethereum-Clients, die für den Au ## Voraussetzungen {#prerequisites} -Sie sollten das Konzept eines [Ethereum-Knotens](/developers/docs/nodes-and-clients/), [seines Aufbaus](/developers/docs/nodes-and-clients/node-architecture/), [seiner Synchronisierungsstrategien](/developers/docs/nodes-and-clients/#sync-modes) und wie man ihn [betreibt](/developers/docs/apis/json-rpc/) und [nutzt](/developers/docs/nodes-and-clients/run-a-node/), verstehen. +Sie sollten das Konzept eines [Ethereum-Nodes](/developers/docs/nodes-and-clients/), [seine Architektur](/developers/docs/nodes-and-clients/node-architecture/), [Synchronisierungsstrategien](/developers/docs/nodes-and-clients/#sync-modes) sowie die Praktiken verstehen, wie man sie [betreibt](/developers/docs/nodes-and-clients/run-a-node/) und [verwendet](/developers/docs/apis/json-rpc/). ## Was ist ein Archivierungsknoten -Um die Bedeutung eines Archivierungsknotens zu verstehen, sollten wir zunächst das Konzept des Zustand klären. Ethereum kann als _Transaktionsbasierte Zustandsmaschine_ bezeichnet werden. Er besteht aus Konten und Anwendungen, die Transaktion ausführen, die ihren Zustand ändern. Die globalen Daten mit Informationen über jeden Account und Vertrag, wird in einer Trie-Datenbank gespeichert, die sich Zustand nennt. Dies wird verwaltet durch den Client der Ausführungsebene und beinhaltet: +Um die Bedeutung eines Archivierungsknotens zu verstehen, sollten wir zunächst das Konzept des Zustand klären. Ethereum kann als _transaktionsbasierte Zustandsmaschine_ bezeichnet werden. Er besteht aus Konten und Anwendungen, die Transaktion ausführen, die ihren Zustand ändern. Die globalen Daten mit Informationen über jeden Account und Vertrag, wird in einer Trie-Datenbank gespeichert, die sich Zustand nennt. Dies wird verwaltet durch den Client der Ausführungsebene und beinhaltet: - Guthaben und Nonce eines Kontos - Vertragscode und Speicher -- Konsensbezogene Daten, z. B. Staking-Einzahlungsvertrag +- Konsensbezogene Daten, z. B. Staking Deposit Contract -Um mit dem Netzwerk interagieren sowie neue Blöcke produzieren und verifizieren zu können, müssen Ethereum-Clients mit den neuesten Änderungen (der Spitze der Blockchain) und daher mit dem aktuellen Zustand Schritt halten. Ein auf der Ausführungsebene bestehender Client, der als vollständiger Knoten konfiguriert ist, verifiziert und folgt dem neuesten Zustand des Netzwerks, speichert jedoch nur einige der letzten Zustände, z. B. den Zustand, der mit den letzten 128 Blöcken verbunden wird. Dadurch kann er mit Umlagerungen der Blockchain umgehen und schnellen Zugriff auf die letzten Daten bereitstellen. Den letzten Zustand brauchen alle Clients, um eingehende Transaktionen verifizieren und das Netzwerk nutzen zu können. +Um mit dem Netzwerk interagieren sowie neue Blöcke produzieren und verifizieren zu können, müssen Ethereum-Clients mit den neuesten Änderungen (der Spitze der Blockchain) und daher mit dem aktuellen Zustand Schritt halten. Ein als Full-Node konfigurierter Client der Ausführungsebene verifiziert und folgt dem neuesten Zustand des Netzwerks, speichert aber nur die letzten paar Zustände zwischen, z. B. den Zustand der letzten 128 Blöcke, sodass er Chain-Reorganisationen handhaben und schnellen Zugriff auf aktuelle Daten ermöglichen kann. Den letzten Zustand brauchen alle Clients, um eingehende Transaktionen verifizieren und das Netzwerk nutzen zu können. Man kann sich diesen Zustand als vorübergehenden Schnappschuss des Netzwerks an einem bestimmten Block und das Archiv als eine Wiederholung vom Verlauf des Netzwerks vorstellen. -Vergangene Zustände können sicher entfernt werden, da sie nicht für das Betreiben des Netzwerks erforderlich sind und es für die Clients unnötig wäre, veraltete Daten zu behalten. Zustände, die vor irgendeinem „letzten“ Block (z. B. 128 Blocks vor der Spitze) existiert haben, werden praktisch weggeworfen. Vollständige Knoten behalten nur vergangene Daten der Blockchain (Blöcke und Transaktionen) und gelegentliche vergangene Schnappschüsse, die sie nutzen können, um ältere Zustände bei Bedarf wiederherzustellen. Dies erfolgt, indem sie die letzten Transaktionen im EVM erneut ausführen, was rechnerisch angefordert werden kann, wenn der erwünschte Zustand weit vom nächsten Schnappschuss entfernt ist. +Vergangene Zustände können sicher entfernt werden, da sie nicht für das Betreiben des Netzwerks erforderlich sind und es für die Clients unnötig wäre, veraltete Daten zu behalten. Zustände, die vor einem kürzlich erstellten Block existierten (z. B. 128 Blöcke vor dem Head), werden praktisch verworfen. Vollständige Knoten behalten nur vergangene Daten der Blockchain (Blöcke und Transaktionen) und gelegentliche vergangene Schnappschüsse, die sie nutzen können, um ältere Zustände bei Bedarf wiederherzustellen. Dies erfolgt, indem sie die letzten Transaktionen im EVM erneut ausführen, was rechnerisch angefordert werden kann, wenn der erwünschte Zustand weit vom nächsten Schnappschuss entfernt ist. Dies bedeutet jedoch, dass der Zugang zu einem vergangenen Zustand eines vollständigen Knotens viel Rechenleistung erfordert. Der Klient muss möglicherweise alle vergangenen Transaktionen ausführen, um einen historischen Zustand seit Anfang zu berechnen. Archivierungsknoten lösen dies, indem sie nicht nur die letzten, sondern jeden einzelnen Zustand nach dem Erzeugen eines Blocks speichern. Es findet quasi einen Kompromiss, wobei mehr Speicherplatz erforderlich ist. @@ -35,10 +35,10 @@ Die normale Nutzung von Ethereum, wie das Senden von Transaktionen, das Bereitst Der größte Vorteil eines Zustandsarchivs ist der schnelle Zugang zu Abfragen über vergangene Zustände. Ein Archivierungsknoten würde zum Beispiel direkt Ergebnisse auf Abfragen wie die Folgenden liefern: -- _Was war der ETH-Kontostand von Account 0x1337... an Block 15537393?_ +- _Wie hoch war das ETH-Guthaben des Kontos 0x1337... bei Block 15537393?_ - _Was war der Kontostand vom Token 0x in Vertrag 0x an Block 1920000?_ -Wie oben erklärt, müsste ein vollständiger Node diese Daten über die Ausführung von EVM generieren, was die CPU belastet und viel Zeit benötigt. Archivierungsknoten greifen darauf direkt über den Speicher zu und können direkt Antworten liefern. Diese Eigenschaft ist für bestimmte Teile der Infrastruktur nützlich, wie zum Beispiel: +Wie oben erklärt, müsste ein vollständiger Node diese Daten über die Ausführung von EVM generieren, was die CPU belastet und viel Zeit benötigt. Archiv-Nodes greifen auf der Festplatte darauf zu und liefern sofort Antworten. Dies ist eine nützliche Funktion für bestimmte Teile der Infrastruktur, zum Beispiel: - Serviceanbieter wie Block-Explorer - Forscher @@ -46,35 +46,36 @@ Wie oben erklärt, müsste ein vollständiger Node diese Daten über die Ausfüh - Dapp-Entwickler - Prüfung und Einhaltung von Regeln -Es gibt einige kostenlose [Anbieter](/developers/docs/nodes-and-clients/nodes-as-a-service/), die auch Zugang zu vergangenen Daten liefern. Da es anspruchsvoller ist, einen Archivierungsknoten zu betreiben, ist dieser Zugang oft limitiert und funktioniert nur für gelegentlichen Zugriff. Wenn Ihr Projekt durchgängigen Zugriff auf vergangene Daten benötigt, sollten Sie sich überlegen, selber einen Archivierungsknoten zu betreiben. +Es gibt verschiedene kostenlose [Dienste](/developers/docs/nodes-and-clients/nodes-as-a-service/), die ebenfalls Zugriff auf historische Daten ermöglichen. Da es anspruchsvoller ist, einen Archivierungsknoten zu betreiben, ist dieser Zugang oft limitiert und funktioniert nur für gelegentlichen Zugriff. Wenn Ihr Projekt durchgängigen Zugriff auf vergangene Daten benötigt, sollten Sie sich überlegen, selber einen Archivierungsknoten zu betreiben. ## Implementierung und Nutzung Archivierungsknoten bedeutet in diesem Kontext, dass dem Nutzer, dem Clients der Ausführungsebene gegenüberstehen, Daten zur Verfügung gestellt werden, während sie die Zustands-Datenbank verwalten und JSON-RPC Endpunkte bereitstellen. Konfigurationsoptionen, Synchronisierungszeit und die Größe der Datenbank können je nach Client variieren. Weitere Details finden Sie in der Client-Dokumentation. -Bevor Sie ihren eigenen Archivierungsknoten starten, sollten Sie die Unterschiede zwischen den Clients und vor allem den verschiedenen [Hardwareanforderungen](/developers/docs/nodes-and-clients/run-a-node/#requirements) kennen. Die meisten Clients sind nicht für diese Funktion optimiert und ihre Archive benötigen über 12 TB Speicherplatz. Zum Vergleich: Implementierungen wie Erigon können dieselben Daten in weniger als 3 TB speichern, was sie zur effektivsten Art zum Betreiben eines Archivierungsknotens macht. +Bevor Sie Ihren eigenen Archiv-Node starten, informieren Sie sich über die Unterschiede zwischen den Clients und insbesondere über die verschiedenen [Hardware-Anforderungen](/developers/docs/nodes-and-clients/run-a-node/#requirements). Die meisten Clients sind nicht für diese Funktion optimiert und ihre Archive benötigen mehr als 12 TB Speicherplatz. Zum Vergleich: Implementierungen wie Erigon können dieselben Daten in weniger als 3 TB speichern, was sie zur effektivsten Art zum Betreiben eines Archivierungsknotens macht. ## Empfohlene Verfahren -Abgesehen von den generellen [Empfehlungen zum Betreiben einer Node](/developers/docs/nodes-and-clients/run-a-node/) kann eine Archivierungs-Node höhere Anforderungen an Hardware und Wartung stellen. In Anbetracht von Erigons [Schlüsselfunktionen](https://github.com/ledgerwatch/erigon#key-features) ist der praktischste Ansatz, die [Erigon](/developers/docs/nodes-and-clients/#erigon)-Client-Implementation zu verwenden. +Abgesehen von den allgemeinen [Empfehlungen für den Betrieb eines Nodes](/developers/docs/nodes-and-clients/run-a-node/) kann ein Archiv-Node höhere Anforderungen an Hardware und Wartung stellen. In Anbetracht der [Hauptmerkmale](https://github.com/ledgerwatch/erigon#key-features) von Erigon ist der praktischste Ansatz die Verwendung der [Erigon](/developers/docs/nodes-and-clients/#erigon) Client-Implementierung. ### Hardware -Versichern Sie sich immer, dass ihre Hardware alle Voraussetzungen für einen gegebenen Modus in der Dokumentation des Clients erfüllt. Die größte Voraussetzung für Archivierungsknoten ist dabei der Speicherplatz. Je nach Client variiert dieser von 3 TB bis 12 TB. Obwohl HDD als eine bessere Lösung für große Datenmengen gesehen werden kann, wird eine SSD für das kontinuierliche Synchronisieren und Aktualisieren der Blockchain-Spitze benötigt. [SATA](https://www.cleverfiles.com/help/sata-hard-drive.html)-Datenträger sind ausreichend, jedoch sollten sie von zuverlässiger Qualität, also mindestens [TLC](https://blog.synology.com/tlc-vs-qlc-ssds-what-are-the-differences) sein. Festplatten können in einen Desktop Computer oder einen Server mit genügend Slots eingebaut werden. Diese speziellen Geräte sind ideal, um Knoten mit hoher Verfügbarkeit zu betreiben. Es ist durchaus möglich, Archivierungsknoten auf einem Laptop zu betreiben. Die Portabilität erfordert jedoch zusätzliche Kosten. +Versichern Sie sich immer, dass ihre Hardware alle Voraussetzungen für einen gegebenen Modus in der Dokumentation des Clients erfüllt. +Die größte Voraussetzung für Archivierungsknoten ist dabei der Speicherplatz. Je nach Client variiert dieser von 3 TB bis 12 TB. Obwohl HDD als eine bessere Lösung für große Datenmengen gesehen werden kann, wird eine SSD für das kontinuierliche Synchronisieren und Aktualisieren der Blockchain-Spitze benötigt. [SATA](https://www.cleverfiles.com/help/sata-hard-drive.html)-Laufwerke sind gut genug, aber es sollte eine zuverlässige Qualität sein, mindestens [TLC](https://blog.synology.com/tlc-vs-qlc-ssds-what-are-the-differences). Festplatten können in einen Desktop Computer oder einen Server mit genügend Slots eingebaut werden. Diese speziellen Geräte sind ideal, um Knoten mit hoher Verfügbarkeit zu betreiben. Es ist durchaus möglich, Archivierungsknoten auf einem Laptop zu betreiben. Die Portabilität erfordert jedoch zusätzliche Kosten. -Alle Daten müssen in einen einzigen Speicherort passen, deshalb müssen Festplatten beispielsweise mit [RAID0](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_0) oder LVM zusammengelegt werden. Es könnte sich auch lohnen, [ZFS](https://en.wikipedia.org/wiki/ZFS) zu nutzen, da es „Kopieren beim Schreiben“ (Copy-on-write) unterstützt. Dadurch wird sicherstellt, dass Daten korrekt auf die Festplatten geschrieben werden, ohne dass geringfügige Fehler entstehen. +Alle Daten müssen auf ein einziges Volume passen, daher müssen die Festplatten verbunden werden, z. B. mit [RAID0](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_0) oder LVM. Es könnte sich auch lohnen, [ZFS](https://en.wikipedia.org/wiki/ZFS) zu verwenden, da es „Copy-on-Write“ unterstützt, was sicherstellt, dass Daten ohne Fehler auf niedriger Ebene korrekt auf die Festplatte geschrieben werden. -Für mehr Stabilität und Sicherheit bei der Prävention gegen die Beschädigung der Datenbanken, besonders in einer professionellen Einrichtung, sollten sie sich überlegen [ECC Speicher](https://en.wikipedia.org/wiki/ECC_memory) zu verwenden, sollte Ihr System dies unterstützen. Die Größe des RAM sollte genauso groß wie für einen vollständigen Knoten sein. Mehr RAM kann jedoch dazu beitragen, die Synchronisierung zu beschleunigen. +Für mehr Stabilität und Sicherheit zur Vermeidung versehentlicher Datenbankbeschädigungen, insbesondere in einer professionellen Umgebung, sollten Sie die Verwendung von [ECC-Speicher](https://en.wikipedia.org/wiki/ECC_memory) in Betracht ziehen, falls Ihr System dies unterstützt. Die Größe des RAM sollte genauso groß wie für einen vollständigen Knoten sein. Mehr RAM kann jedoch dazu beitragen, die Synchronisierung zu beschleunigen. Während der ersten Synchronisierung führen Clients im Archivierungsmodus jede Transaktion seit der Genesis aus. Die Ausführungsgeschwindigkeit ist vor allem limitiert durch die CPU, daher kann eine schnellere CPU dazu beitragen, die erste Synchronisierung zu beschleunigen. Bei einem durchschnittlichen Computer kann die erste Synchronisierung bis zu einem Monat dauern. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Ethereum vollständiger Knoten vs Archivierungsknoten](https://www.quicknode.com/guides/infrastructure/ethereum-full-node-vs-archive-node) - _QuickNode, September 2022_ -- [Building Your Own Ethereum Archive Node](https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09) - _Thomas Jay Rush, August 2021_ -- [How to set up Erigon, Erigon’s RPC and TrueBlocks (scrape and API) as services](https://magnushansson.xyz/blog_posts/crypto_defi/2022-01-10-Erigon-Trueblocks) _– Magnus Hansson, aktualisiert September 2022_ +- [Ethereum Full-Node vs. Archiv-Node](https://www.quicknode.com/guides/infrastructure/ethereum-full-node-vs-archive-node) – _QuickNode, September 2022_ +- [Erstellen eines eigenen Ethereum Archiv-Nodes](https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09) - _Thomas Jay Rush, August 2021_ +- [Einrichtung von Erigon, Erigons RPC und TrueBlocks (Scrape und API) als Dienste](https://magnushansson.xyz/blog_posts/crypto_defi/2022-01-10-Erigon-Trueblocks) _– Magnus Hansson, aktualisiert September 2022_ ## Verwandte Themen {#related-topics} -- [Knotenpunkte und Clients](/developers/docs/nodes-and-clients/) -- [Einen Knoten betreiben](/developers/docs/nodes-and-clients/run-a-node/) +- [Nodes und Clients](/developers/docs/nodes-and-clients/) +- [Einen Node betreiben](/developers/docs/nodes-and-clients/run-a-node/) diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/bootnodes/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/bootnodes/index.md index 38c121bb83e..ffbb4432a25 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/bootnodes/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/bootnodes/index.md @@ -6,19 +6,19 @@ lang: de Wenn ein neuer Knoten dem Ethereum-Netzwerk beitritt, muss er sich mit anderen Knoten, sich sich bereits im Netzwerk befinden, verbinden, damit er neue Peers finden kann. Diese Eintrittspunkte in das Ethereum-Netzwerk werden Bootnodes genannt. Clients haben häufig eine Liste von Bootnodes fest einkodiert. Diese Bootnodes werden normalerweise vom Ethereum Foundation Entwicklerteam oder den Client-Teams betrieben. Beachten Sie dabei, dass Bootnodes nicht dasselbe wie statische Knoten sind. Statische Knoten werden immer wieder aufgerufen, während Bootnodes nur aufgerufen werden, wenn es genug Peers zum Verbinden gibt. Der Knoten muss zudem neue komplexere Verbindungen aufbauen. -## Verbinden mit einem Bootnode {#connect-to-a-bootnode} +## Mit einem Bootnode verbinden {#connect-to-a-bootnode} -Die meisten Clients verfügen über eine integrierte Liste von Bootnodes. Aber möglicherweise möchten Sie auch Ihren eigenen Bootnode betreiben, oder einen nutzen, der nicht Teil der fest einkodierten Liste des Clients ist. In diesem Fall können Sie sie spezifizieren, wenn Sie ihren Client wie folgt starten (Beispiel gilt für Geth, bitte überprüfen Sie die Dokumentation Ihres Clients): +Die meisten Clients verfügen über eine integrierte Liste von Bootnodes, aber Sie können auch einen eigenen Bootnode betreiben oder einen verwenden, der nicht Teil der fest einkodierten Liste des Clients ist. In diesem Fall können Sie sie spezifizieren, wenn Sie ihren Client wie folgt starten (Beispiel gilt für Geth, bitte überprüfen Sie die Dokumentation Ihres Clients): ``` geth --bootnodes "enode://@:" ``` -## Betrieb eines Bootnodes {#run-a-bootnode} +## Einen Bootnode betreiben {#run-a-bootnode} -Bootnodes sind vollständige Knoten, die nicht hinter einem NAT ([Network Address Translation](https://www.geeksforgeeks.org/network-address-translation-nat/)) stehen. Jeder vollständige Knoten kann als Bootnode wirken, solange er öffentlich zugänglich ist. +Bootnodes sind vollständige Nodes, die sich nicht hinter einem NAT ([Netzwerkadressübersetzung](https://www.geeksforgeeks.org/network-address-translation-nat/)) befinden. Jeder vollständige Knoten kann als Bootnode wirken, solange er öffentlich zugänglich ist. -Wenn Sie einen Knoten starten, sollte er sich in Ihren ["Enode"](/developers/docs/networking-layer/network-addresses/#enode) einloggen. Dieser ist ein öffentlicher Identifikator, den andere nutzen können, um sich mit Ihrem Knoten zu verbinden. +Wenn Sie einen Node starten, sollte dieser Ihre [enode](/developers/docs/networking-layer/network-addresses/#enode) protokollieren. Dies ist eine öffentliche Kennung, die andere verwenden können, um sich mit Ihrem Node zu verbinden. Der Enode wird normalerweise bei jedem Neustart neu generiert, schauen Sie sich daher die Dokumentation Ihres Clients an. Dort erfahren Sie, wie man einen beständigen Enode für Ihren Bootnode erzeugt. @@ -26,6 +26,6 @@ Ein guter Bootnode benötigt möglichst viele Peers, die an ihm andocken können ## Verfügbare Bootnodes {#available-bootnodes} -Eine Liste bereits verfügbarer Bootnodes in go-Ethereum finden Sie [hier](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go#L23). Diese Bootnodes werden von der Ethereum Foundation und dem go-Ethereum Team gewartet. +Eine Liste der integrierten Bootnodes in go-ethereum finden Sie [hier](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go#L23). Diese Bootnodes werden von der Ethereum Foundation und dem go-Ethereum Team gewartet. Es gibt weitere Listen von Bootnodes, die von Freiwilligen gepflegt werden. Stellen Sie sicher, dass Sie immer mindestens einen offiziellen Bootnode verwenden, da Sie sonst Opfer eines Eclipse-Angriffs werden könnten. diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md index 4e951c30925..b2109e4bb72 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/client-diversity/index.md @@ -9,101 +9,124 @@ Das Verhalten eines Ethereum-Knotens wird durch die von ihm ausgeführte Client- ## Voraussetzungen {#prerequisites} -Wenn Sie noch nicht wissen, was Nodes und Clients sind, lesen Sie [Nodes und Clients](/developers/docs/nodes-and-clients/). [Ausführungs-](/glossary/#execution-layer) und [Konsensebenen](/glossary/#consensus-layer) sind im Glossar definiert. +Wenn Sie noch nicht verstehen, was Nodes und Clients sind, lesen Sie den Artikel über [Nodes und Clients](/developers/docs/nodes-and-clients/). Die [Ausführungs-](/glossary/#execution-layer) und [Konsens-](/glossary/#consensus-layer)Ebenen sind im Glossar definiert. ## Warum gibt es mehrere Clients? {#why-multiple-clients} -Es gibt mehrere, unabhängig voneinander entwickelte und gewartete Clients, weil die Client-Vielfalt das Netzwerk widerstandsfähiger gegen Angriffe und Fehler macht. Mehrere Clients sind die einzigartige Stärke von Ethereum – andere Blockchains verlassen sich auf die Unfehlbarkeit eines einzigen Clients. Es reicht jedoch nicht aus, einfach mehrere Clients zur Verfügung zu haben, sie müssen von der Community angenommen werden und die Anzahl der aktiven Knoten muss relativ gleichmäßig auf sie verteilt sein. +Es gibt mehrere, unabhängig voneinander entwickelte und gewartete Clients, weil die Client-Vielfalt das Netzwerk widerstandsfähiger gegen Angriffe und Fehler macht. Mehrere Clients sind die einzigartige Stärke von Ethereum – andere Blockchains verlassen sich auf die Unfehlbarkeit eines einzigen Clients. Es reicht jedoch nicht aus, einfach mehrere Clients zur Verfügung zu haben. Sie müssen von der Community angenommen werden und die Anzahl der aktiven Nodes muss relativ gleichmäßig auf sie verteilt sein. ## Warum ist die Client-Vielfalt wichtig? {#client-diversity-importance} Viele unabhängig voneinander entwickelte und gewartete Clients sind für die Sicherheit eines dezentralen Netzwerks unerlässlich. Lassen Sie uns die Gründe dafür untersuchen. -### Fehler {#bugs} +### Bugs {#bugs} Ein Fehler in einem einzelnen Client stellt ein geringeres Risiko für das Netzwerk dar, wenn er nur eine Minderheit der Ethereum-Knoten repräsentiert. Bei einer annähernd gleichmäßigen Verteilung der Knoten auf viele Clients ist die Wahrscheinlichkeit, dass die meisten Clients von einem gemeinsamen Problem betroffen sind, gering. Das Netzwerk ist daher robuster. -### Verteidigung gegen Angriffe {#resilience} +### Widerstandsfähigkeit gegen Angriffe {#resilience} -Die Client-Vielfalt bietet auch eine gewisse Widerstandsfähigkeit gegen Angriffe. Ein Angriff, bei dem [ein bestimmter Client in einen bestimmten Bereich der Chain gelockt wird](https://twitter.com/vdWijden/status/1437712249926393858), dürfte zum Besipiel kaum erfolgreich sein, da andere Clients wahrscheinlich nicht auf die gleiche Weise ausgenutzt werden können und die kanonische Chain nicht beschädigt wird. Eine geringe Client-Vielfalt erhöht das Risiko, das mit einem Hack auf den dominanten Client verbunden ist. Die Client-Vielfalt hat sich bereits als wichtiger Schutz gegen böswillige Angriffe auf das Netzwerk erwiesen. So war beispielsweise der Denial-of-Service-Angriff von Shanghai im Jahr 2016 möglich, weil es den Angreifern gelang, den dominanten Client (Geth) dazu zu bringen, einen „Slow Disk I/O-Vorgang“ zehntausende Male pro Block auszuführen. Da auch alternative Clients online waren, die diese Schwachstelle nicht aufwiesen, konnte Ethereum dem Angriff widerstehen und weiterarbeiten, während die Schwachstelle in Geth behoben wurde. +Die Client-Vielfalt bietet auch eine gewisse Widerstandsfähigkeit gegen Angriffe. Ein Angriff beispielsweise, der [einen bestimmten Client dazu verleitet](https://twitter.com/vdWijden/status/1437712249926393858), auf einen bestimmten Zweig der Chain zu wechseln, wird wahrscheinlich nicht erfolgreich sein, da andere Clients wahrscheinlich nicht auf dieselbe Weise ausnutzbar sind und die kanonische Chain unbeschädigt bleibt. Eine geringe Client-Vielfalt erhöht das Risiko, das mit einem Hack auf den dominanten Client verbunden ist. Die Client-Vielfalt hat sich bereits als wichtiger Schutz gegen böswillige Angriffe auf das Netzwerk erwiesen. So war beispielsweise der Denial-of-Service-Angriff von Shanghai im Jahr 2016 möglich, weil es den Angreifern gelang, den dominanten Client (Geth) dazu zu bringen, einen „Slow Disk I/O-Vorgang“ zehntausende Male pro Block auszuführen. Da auch alternative Clients online waren, die diese Schwachstelle nicht aufwiesen, konnte Ethereum dem Angriff widerstehen und weiterarbeiten, während die Schwachstelle in Geth behoben wurde. -### Finalität von Proof-of-stake {#finality} +### Proof-of-Stake-Endgültigkeit {#finality} Ein Fehler in einem Konsensclient mit mehr als 33 % der Ethereum-Knoten könnte verhindern, dass die Konsensebene finalisieren kann. Das bedeutet, dass die Nutzer nicht darauf vertrauen können, dass Transaktionen nicht irgendwann rückgängig gemacht oder geändert werden. Dies wäre für viele der auf Ethereum aufbauenden Anwendungen, insbesondere DeFi, sehr problematisch. - Schlimmer noch, ein kritischer Fehler in einem Client mit einer Zweidrittelmehrheit könnte dazu führen, dass die Chain nicht korrekt geteilt und finalisiert wird. Dies wiederum würde dazu führen, dass eine große Anzahl von Validatoren auf einer ungültigen Chain stecken bleibt. Wenn sie sich der korrekten Chain wieder anschließen möchten, müssen diese Validatoren mit Slashing oder einem langsamen und teuren freiwilligen Rückzug und Reaktivierung rechnen. Das Ausmaß eines Slashings skaliert mit der Anzahl der schuldigen Knoten, wobei maximal eine Zweidrittelmehrheit geslashed werden kann (32 ETH). + Schlimmer noch: Ein kritischer Bug in einem Client mit Zweidrittelmehrheit könnte dazu führen, dass die Chain falsch geteilt und finalisiert wird. Dies wiederum würde dazu führen, dass eine große Anzahl von Validatoren auf einer ungültigen Chain stecken bleibt. Wenn sie sich der korrekten Chain wieder anschließen möchten, müssen diese Validatoren mit Slashing oder einem langsamen und teuren freiwilligen Rückzug und Reaktivierung rechnen. Das Ausmaß eines Slashings skaliert mit der Anzahl der schuldigen Knoten, wobei maximal eine Zweidrittelmehrheit geslashed werden kann (32 ETH). Obwohl dies unwahrscheinliche Szenarien sind, kann das Ethereum-Ökosystem das Risiko mindern, indem es die Verteilung der Clients auf die aktiven Knoten ausgleicht. Im Idealfall würde kein Konsensclient jemals einen Anteil von 33 % an der Gesamtzahl der Nodes erreichen. -### Gemeinsame Verantwortung {#responsibility} +### Geteilte Verantwortung {#responsibility} Bei Mehrheitsclients fallen außerdem Personalkosten an. Ein kleines Entwicklungsteam wird dadurch stärker belastet und trägt mehr Verantwortung. Je geringer die Client-Vielfalt ist, desto größer ist die Last der Verantwortung für die Entwickler, die den Mehrheitsclient pflegen. Die Verteilung dieser Verantwortung auf mehrere Teams ist vorteilhaft für die Sicherheit des Knoten-Netzwerks und für das Personalnetzwerk von Ethereum. ## Aktuelle Client-Vielfalt {#current-client-diversity} -![Ein Tortendiagramm, das die Client-Vielfalt zeigt](./client-diversity.png) _Diagramm-Daten von [ethernodes.org](https://ethernodes.org) und [clientdiversity.org](https://clientdiversity.org/)_ +### Ausführungs-Clients {#execution-clients-breakdown} -Die beiden Tortendiagramme oben zeigen Momentaufnahmen der aktuellen Client-Vielfalt für die Ausführungs- und die Konsensschicht (zum Zeitpunkt der Erstellung im Januar 2022). Die Ausführungsebene wird überwiegend von [Geth](https://geth.ethereum.org/) dominiert, mit [Open Ethereum](https://openethereum.github.io/) an zweiter mit weitem Abstand, [Erigon](https://github.com/ledgerwatch/erigon) an dritter und [Nethermind](https://nethermind.io/) an vierter Stelle, wobei andere Clients weniger als 1 % des Netzwerks ausmachen. Der am häufigsten verwendete Client auf der Konsensschicht - [Prysm](https://prysmaticlabs.com/#projects) - ist nicht so dominant wie Geth, macht aber immer noch über 60 % des Netzwerks aus. [Lighthouse](https://lighthouse.sigmaprime.io/) und [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) machen ca. 20 % bzw. ca. 14 % aus. Andere Clients werden nur selten verwendet. + -Die Daten der Ausführungsebene wurden am 23.01.2022 von [Ethernodes](https://ethernodes.org) bezogen. Die Daten für Konsensclients stammen von [Michael Sproul](https://github.com/sigp/blockprint). Die Daten der Konsensclients sind schwieriger zu beschaffen, da die Clients der Konsensschicht nicht immer eindeutige Spuren hinterlassen, anhand derer sie identifiziert werden können. Die Daten wurden mit einem Klassifizierungsalgorithmus generiert, der manchmal einige der Minderheitenclients vertauscht (siehe [hier](https://twitter.com/sproulM_/status/1440512518242197516) für weitere Einzelheiten). Im obigen Diagramm werden diese mehrdeutigen Klassifizierungen mit einem Entweder-Oder-Label behandelt (z. B. Nimbus/Teku). Nichtsdestotrotz ist es klar, dass die Mehrheit des Netzwerks Prysm verwendet. Bei den Daten handelt es sich um eine Momentaufnahme über einen festen Satz von Blöcken (in diesem Fall Beacon-Blöcke in den Slots 2048001 bis 2164916), und die Dominanz von Prysm war zeitweise höher, über 68 %. Obwohl es sich nur um Momentaufnahmen handelt, vermitteln die Werte im Diagramm einen guten allgemeinen Eindruck vom aktuellen Stand der Client-Vielfalt. +### Konsens-Clients {#consensus-clients-breakdown} -Aktuelle Daten zur Client-Vielfalt für die Konsensebene sind jetzt unter [clientdiversity.org](https://clientdiversity.org/) verfügbar. + -## Ausführungsebene {#execution-layer} - -Bisher hat sich die Diskussion über die Client-Vielfalt hauptsächlich auf die Konsensschicht konzentriert. Auf den Ausführungsclient [Geth](https://geth.ethereum.org) entfallen jedoch derzeit rund 85 % aller Knoten. Dieser Prozentsatz ist aus denselben Gründen problematisch wie bei den Konsensclients. Zum Beispiel könnte ein Fehler in Geth, der die Transaktionsabwicklung oder die Konstruktion der Ausführungsnutzlast betrifft, dazu führen, dass Konsensclients problematische oder fehlerhafte Transaktionen abschließen. Daher wäre Ethereum sicherer mit einer gleichmäßigeren Verteilung der Ausführungsclients, idealerweise mit keinem Client, der mehr als 33 % des Netzwerks repräsentiert. - -## Verwenden eines Minderheitenclients {#use-minority-client} +Dieses Diagramm ist möglicherweise veraltet – aktuelle Informationen finden Sie auf [ethernodes.org](https://ethernodes.org) und [clientdiversity.org](https://clientdiversity.org). -Um die Client-Vielfalt zu verbessern, müssen nicht nur einzelne Nutzer Minderheitenclients wählen, sondern auch Mining-/Validatoren-Pools und Institutionen wie die großen dApps und Börsen, um ihre Clients zu wechseln. Allerdings können alle Nutzer ihren Teil dazu beitragen, das derzeitige Ungleichgewicht auszugleichen und die Nutzung der gesamten verfügbaren Ethereum-Software zu forcieren. Nach der Zusammenführung müssen alle Knotenbetreiber einen Ausführungsclient und einen Konsensclient betreiben. Die Wahl von Kombinationen der unten vorgeschlagenen Clients wird dazu beitragen, die Client-Vielfalt zu erhöhen. +Die beiden Tortendiagramme oben zeigen Momentaufnahmen der aktuellen Client-Vielfalt für die Ausführungs- und Konsensebene (Stand: Oktober 2025). Die Client-Vielfalt hat sich im Laufe der Jahre verbessert, und auf der Ausführungsebene hat die Dominanz von [Geth](https://geth.ethereum.org/) abgenommen. [Nethermind](https://www.nethermind.io/nethermind-client) liegt knapp an zweiter Stelle, [Besu](https://besu.hyperledger.org/) an dritter und [Erigon](https://github.com/ledgerwatch/erigon) an vierter Stelle, während andere Clients weniger als 3 % des Netzwerks ausmachen. Der am häufigsten verwendete Client auf der Konsensebene – [Lighthouse](https://lighthouse.sigmaprime.io/) – liegt nur knapp vor dem am zweithäufigsten verwendeten. [Prysm](https://prysmaticlabs.com/#projects) und [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) machen ~31 % bzw. ~14 % aus, und andere Clients werden selten verwendet. -### Ausführungs-Clients {#execution-clients} +Die Daten der Ausführungsebene wurden am 26. Okt. 2025 von [supermajority.info](https://supermajority.info/) bezogen. Die Daten für Konsens-Clients stammen von [Michael Sproul](https://github.com/sigp/blockprint). Die Daten der Konsensclients sind schwieriger zu beschaffen, da die Clients der Konsensschicht nicht immer eindeutige Spuren hinterlassen, anhand derer sie identifiziert werden können. Die Daten wurden mit einem Klassifizierungsalgorithmus generiert, der manchmal einige der Minderheits-Clients verwechselt (weitere Details finden Sie [hier](https://twitter.com/sproulM_/status/1440512518242197516)). Im obigen Diagramm werden diese mehrdeutigen Klassifizierungen mit einem Entweder-Oder-Label behandelt (z. B. Nimbus/Teku). Nichtsdestotrotz ist es klar, dass die Mehrheit des Netzwerks Prysm verwendet. Obwohl es sich nur um Momentaufnahmen handelt, vermitteln die Werte im Diagramm einen guten allgemeinen Eindruck vom aktuellen Stand der Client-Vielfalt. -[Besu](https://www.hyperledger.org/use/besu) +Aktuelle Daten zur Client-Vielfalt für die Konsensebene sind jetzt auf [clientdiversity.org](https://clientdiversity.org/) verfügbar. -[Nethermind](https://downloads.nethermind.io/) +## Ausführungsebene {#execution-layer} -[Erigon](https://github.com/ledgerwatch/erigon) +Bisher hat sich die Diskussion über die Client-Vielfalt hauptsächlich auf die Konsensschicht konzentriert. Allerdings macht der Ausführungs-Client [Geth](https://geth.ethereum.org) derzeit etwa 85 % aller Nodes aus. Dieser Prozentsatz ist aus denselben Gründen problematisch wie bei den Konsensclients. Zum Beispiel könnte ein Fehler in Geth, der die Transaktionsabwicklung oder die Konstruktion der Ausführungsnutzlast betrifft, dazu führen, dass Konsensclients problematische oder fehlerhafte Transaktionen abschließen. Daher wäre Ethereum sicherer mit einer gleichmäßigeren Verteilung der Ausführungsclients, idealerweise mit keinem Client, der mehr als 33 % des Netzwerks repräsentiert. -[Go-Ethereum](https://geth.ethereum.org/) +## Verwenden Sie einen Minderheits-Client {#use-minority-client} -### Konsens-Clients {#consensus-clients} +Um die Kundenvielfalt zu berücksichtigen, müssen nicht nur einzelne Benutzer Minderheitskunden auswählen – auch Validierungs pools und Institutionen wie die großen Dapp und Börsen müssen ihre Kunden wechseln. Allerdings können alle Nutzer ihren Teil dazu beitragen, das derzeitige Ungleichgewicht auszugleichen und die Nutzung der gesamten verfügbaren Ethereum-Software zu forcieren. Nach der Zusammenführung müssen alle Knotenbetreiber einen Ausführungsclient und einen Konsensclient betreiben. Die Wahl von Kombinationen der unten vorgeschlagenen Clients wird dazu beitragen, die Client-Vielfalt zu erhöhen. -[Nimbus](https://nimbus.team/) - -[Lighthouse](https://github.com/sigp/lighthouse) +### Ausführungs-Clients {#execution-clients} -[Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) +- [Besu](https://www.hyperledger.org/use/besu) +- [Nethermind](https://downloads.nethermind.io/) +- [Erigon](https://github.com/ledgerwatch/erigon) +- [Go-Ethereum](https://geth.ethereum.org/) +- [Reth](https://reth.rs/) -[Lodestar](https://github.com/ChainSafe/lodestar) +### Konsens-Clients {#consensus-clients} -[Prysm](https://prysm.offchainlabs.com/docs/) +- [Nimbus](https://nimbus.team/) +- [Lighthouse](https://github.com/sigp/lighthouse) +- [Teku](https://consensys.io/teku) +- [Lodestar](https://github.com/ChainSafe/lodestar) +- [Prysm](https://prysm.offchainlabs.com/docs/) +- [Grandine](https://docs.grandine.io/) -Technisch versierte Nutzer können dazu beitragen, diesen Prozess zu beschleunigen, indem sie mehr Anleitungen und Dokumentationen für Minderheitenclients schreiben und ihre Kollegen, die Knoten betreiben, ermutigen, von den dominanten Clients wegzugehen. Anleitungen für den Wechsel zu einem Minderheitskonsensclient finden Sie auf [clientdiversity.org](https://clientdiversity.org/). +Technisch versierte Nutzer können dazu beitragen, diesen Prozess zu beschleunigen, indem sie mehr Anleitungen und Dokumentationen für Minderheitenclients schreiben und ihre Kollegen, die Knoten betreiben, ermutigen, von den dominanten Clients wegzugehen. Anleitungen für den Wechsel zu einem Minderheits-Konsens-Client sind auf [clientdiversity.org](https://clientdiversity.org/) verfügbar. -## Dashboards für Client-Vielfalt {#client-diversity-dashboards} +## Dashboards zur Client-Vielfalt {#client-diversity-dashboards} Verschiedene Dashboards geben Echtzeit-Statistiken zur Client-Vielfalt für die Ausführungs- und Konsensebene. **Konsensebene:** - [Rated.network](https://www.rated.network/) -- [clientdiversity.org](https://clientdiversity.org/) **Ausführungsebene:** +- [clientdiversity.org](https://clientdiversity.org/) + +**Ausführungsebene:** - [supermajority.info](https://supermajority.info//) - [Ethernodes](https://ethernodes.org/) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Client-Vielfalt auf der Konsensebene von Ethereum](https://mirror.xyz/jmcook.eth/S7ONEka_0RgtKTZ3-dakPmAHQNPvuj15nh0YGKPFriA) -- [Ethereum-Zusammenführung: Führen Sie den Mehrheitsclient auf eigene Gefahr aus!](https://dankradfeist.de/ethereum/2022/03/24/run-the-majority-client-at-your-own-peril.html) – _Dankrad Fiest, 24. März 2022_ -- [Bedeutung der Client-Vielfalt](https://our.status.im/the-importance-of-client-diversity/) -- [Liste der Ethereum-Knotendienste](https://ethereumnodes.com/) -- [Die „Fünf Gründe“ für das Problem der Client-Vielfalt](https://notes.ethereum.org/@afhGjrKfTKmksTOtqhB9RQ/BJGj7uh08) -- [Ethereum-Vielfalt und wie man sie löst (YouTube)](https://www.youtube.com/watch?v=1hZgCaiqwfU) +- [Ethereum-Merge: Betreiben Sie den Mehrheits-Client auf eigene Gefahr!](https://dankradfeist.de/ethereum/2022/03/24/run-the-majority-client-at-your-own-peril.html) – _Dankrad Fiest, 24. März 2022_ +- [Die Bedeutung der Client-Vielfalt](https://our.status.im/the-importance-of-client-diversity/) +- [Liste von Ethereum-Node-Diensten](https://ethereumnodes.com/) +- [Das „Fünf-Warum-Problem“ der Client-Vielfalt](https://notes.ethereum.org/@afhGjrKfTKmksTOtqhB9RQ/BJGj7uh08) +- [Ethereum-Vielfalt und wie sie erreicht werden kann (YouTube)](https://www.youtube.com/watch?v=1hZgCaiqwfU) - [clientdiversity.org](https://clientdiversity.org/) ## Verwandte Themen {#related-topics} -- [Einen Ethereum-Knoten betreiben](/run-a-node/) -- [Knotenpunkte und Clients](/developers/docs/nodes-and-clients/) +- [Einen Ethereum-Node betreiben](/run-a-node/) +- [Nodes und Clients](/developers/docs/nodes-and-clients/) diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/index.md index d3b5832abe1..53574a4a8de 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/index.md @@ -1,5 +1,5 @@ --- -title: Nodes und Clients +title: Knotenpunkte (Nodes) und Anwendungen (Clients) description: Eine Übersicht über Ethereum-Nodes und Client-Software, wie eine Node eingerichtet wird und warum Sie dies tun sollten. lang: de sidebarDepth: 2 @@ -9,9 +9,9 @@ Ethereum ist ein verteiltes Netzwerk von Computern (bekannt als Nodes), auf dene ## Voraussetzungen {#prerequisites} -Sie sollten das Konzept eines Peer-to-Peer-Netzwerks und die [Grundlagen der EVM](/developers/docs/evm/) verstehen, bevor Sie tiefer eintauchen und Ihre eigene Instanz eines Ethereum-Clients starten. Lesen Sie unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/). +Sie sollten das Konzept eines Peer-to-Peer-Netzwerks und die [Grundlagen der EVM](/developers/docs/evm/) verstehen, bevor Sie tiefer eintauchen und Ihre eigene Instanz eines Ethereum-Clients starten. Werfen Sie einen Blick auf unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/). -Wenn Ihnen das Thema Nodes neu ist, empfehlen wir Ihnen, zunächst unsere benutzerfreundliche Einführung zum [Betreiben eines Ethereum-Nodes](/run-a-node) zu lesen. +Wenn das Thema Nodes für Sie neu ist, empfehlen wir Ihnen, sich zuerst unsere benutzerfreundliche Einführung zum [Betreiben eines Ethereum-Nodes](/run-a-node) anzusehen. ## Was sind Nodes und Clients? {#what-are-nodes-and-clients} @@ -20,67 +20,71 @@ Ein „Node“ ist jede Instanz von Ethereum-Client-Software, die mit anderen Co - Der Ausführungsclient (auch als Execution Engine, EL-Client oder früher Eth1-Client bekannt) empfängt neue Transaktionen, die im Netzwerk übertragen werden, führt sie im EVM aus und verwaltet den aktuellen Zustand und die Datenbank aller aktuellen Ethereum-Daten. - Der Konsensclient (auch als Beacon-Node, CL-Client oder früher Eth2-Client bekannt) implementiert den Proof-of-Stake-Konsensalgorithmus, der es dem Netzwerk ermöglicht, basierend auf validierten Daten des Ausführungsclients eine Einigung zu erzielen. Darüber hinaus gibt es einen dritten Teil der Software, den so genannten „Validator“, der dem Konsensclient hinzugefügt werden kann und es einem Knoten ermöglicht, sich an der Sicherung des Netzwerks zu beteiligen. -Diese Clients arbeiten zusammen, um den aktuellen Stand der Ethereum Chain zu verfolgen und den Nutzern die Interaktion mit dem Ethereum-Netzwerk zu ermöglichen. Das modulare Design, bei dem mehrere Softwarekomponenten zusammenarbeiten, wird als [eingekapselte Komplexität](https://vitalik.eth.limo/general/2022/02/28/complexity.html) bezeichnet. Dieser Ansatz erleichterte die nahtlose Ausführung [der Zusammenführung](/roadmap/merge), macht die Wartung und Entwicklung von Client-Software einfacher und ermöglicht die Wiederverwendung einzelner Clients, beispielsweise im [Layer-2-Ökosystem](/layer-2/). +Diese Clients arbeiten zusammen, um den aktuellen Stand der Ethereum Chain zu verfolgen und den Nutzern die Interaktion mit dem Ethereum-Netzwerk zu ermöglichen. Das modulare Design, bei dem mehrere Softwarekomponenten zusammenarbeiten, wird als [eingekapselte Komplexität](https://vitalik.eth.limo/general/2022/02/28/complexity.html) bezeichnet. Dieser Ansatz machte es einfacher, [Die Zusammenführung](/roadmap/merge) nahtlos auszuführen, erleichtert die Wartung und Entwicklung von Client-Software und ermöglicht die Wiederverwendung einzelner Clients, beispielsweise im [Layer-2-Ökosystem](/layer-2/). -![Gekoppelte Ausführungs und Konsensclients](./eth1eth2client.png) Vereinfachtes Diagramm eines gekoppelten Ausführungs- und Konsensclients. +![Gekoppelte Ausführungs- und Konsens-Clients](./eth1eth2client.png) +Vereinfachtes Diagramm eines gekoppelten Ausführungs- und Konsens-Clients. ### Client-Diversität {#client-diversity} -Sowohl [Ausführungsclients](/developers/docs/nodes-and-clients/#execution-clients) als auch [Konsensclients](/developers/docs/nodes-and-clients/#consensus-clients) existieren in einer Vielzahl von Programmiersprachen, die von verschiedenen Teams entwickelt wurden. +Sowohl [Ausführungs-Klienten](/developers/docs/nodes-and-clients/#execution-clients) als auch [Konsens-Clients](/developers/docs/nodes-and-clients/#consensus-clients) existieren in einer Vielzahl von Programmiersprachen, die von verschiedenen Teams entwickelt wurden. -Wenn mehrere Client-Implementierungen vorhanden sind, kann das Netzwerk gestärkt werden, indem die Abhängigkeit von einer einzigen Codebasis verringert wird. Das ideale Ziel besteht darin, Vielfalt zu erreichen, ohne dass ein einziger Client das Netzwerk dominiert, um somit potenzielle Einzelstellen von Fehlerquellen zu eliminieren. Die Vielfalt der Sprachen lädt auch eine breitere Entwicklergemeinschaft ein und ermöglicht es ihnen, Integrationen in ihrer bevorzugten Sprache zu erstellen. +Wenn mehrere Client-Implementierungen vorhanden sind, kann das Netzwerk gestärkt werden, indem die Abhängigkeit von einer einzigen Codebasis verringert wird. Das ideale Ziel besteht darin, Vielfalt zu erreichen, ohne dass ein einziger Client das Netzwerk dominiert, um somit potenzielle Einzelstellen von Fehlerquellen zu eliminieren. +Die Vielfalt der Sprachen lädt auch eine breitere Entwicklergemeinschaft ein und ermöglicht es ihnen, Integrationen in ihrer bevorzugten Sprache zu erstellen. -Erfahren Sie mehr über [Client-Vielfalt](/developers/docs/nodes-and-clients/client-diversity/). +Erfahren Sie mehr über [Client-Diversität](/developers/docs/nodes-and-clients/client-diversity/). Diese Implementierungen haben gemeinsam, dass sie alle einer einzigen Spezifikation folgen. Spezifikationen legen fest, wie das Ethereum-Netzwerk und die Blockchain funktionieren. Jedes technische Detail ist definiert, und die Spezifikationen können wie folgt gefunden werden: -- Ursprünglich wurde das [Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) erstellt -- [Ausführungsspezifikationen](https://github.com/ethereum/execution-specs/) -- [Konsensspezifikationen](https://github.com/ethereum/consensus-specs) -- [EIPs](https://eips.ethereum.org/), die bei verschiedenen [Netzwerk-Upgrades](/ethereum-forks/) implementiert wurden +- Ursprünglich das [Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) +- [Ausführungs-Spezifikationen](https://github.com/ethereum/execution-specs/) +- [Konsens-Spezifikationen](https://github.com/ethereum/consensus-specs) +- [EIPs](https://eips.ethereum.org/), die in verschiedenen [Netzwerk-Upgrades](/ethereum-forks/) implementiert wurden -### Verfolgung von Knoten im Netzwerk {#network-overview} +### Tracking von Nodes im Netzwerk {#network-overview} Es gibt mehrere Tracker, die einen Echtzeit-Überblick über die Knoten im Ethereum-Netzwerk bieten. Beachten Sie, dass diese Crawler aufgrund der Natur dezentraler Netzwerke nur einen begrenzten Überblick über das Netzwerk bieten können und möglicherweise unterschiedliche Ergebnisse melden. -- [Karte der Knotenpunkte](https://etherscan.io/nodetracker) von Etherscan +- [Karte der Nodes](https://etherscan.io/nodetracker) von Etherscan - [Ethernodes](https://ethernodes.org/) von Bitfly -- [Nodewatch](https://www.nodewatch.io/) von Chainsafe, Crawler für Konsensknoten -- [Monitoreth](https://monitoreth.io/) – von MigaLabs, ein Netzwerküberwachungstool für verteilte Netzwerke +- [Nodewatch](https://www.nodewatch.io/) von Chainsafe, crawlt Konsens-Nodes +- [Monitoreth](https://monitoreth.io/) – von MigaLabs, ein verteiltes Netzwerküberwachungstool +- [Wöchentliche Netzwerkzustandsberichte](https://probelab.io) – von ProbeLab, unter Verwendung des [Nebula-Crawlers](https://github.com/dennis-tra/nebula) und anderer Tools ## Node-Typen {#node-types} -Wenn Sie [Ihren eigenen Knoten betreiben möchten](/developers/docs/nodes-and-clients/run-a-node/), sollten Sie verstehen, dass es verschiedene Arten von Knoten gibt, die Daten unterschiedlich konsumieren. Die Clients können drei verschiedene Arten von Knoten ausführen: leichte, vollständige und Archivknoten. Es gibt auch Optionen für verschiedene Synchronisierungsstrategien, die eine schnellere Synchronisierungszeit ermöglichen. Die Synchronisierung bezieht sich darauf, wie schnell sie die aktuellsten Informationen über Ethereums Zustand erhalten kann. +Wenn Sie [Ihre eigene Node betreiben](/developers/docs/nodes-and-clients/run-a-node/) möchten, sollten Sie verstehen, dass es verschiedene Node-Typen gibt, die Daten unterschiedlich verbrauchen. Die Clients können drei verschiedene Arten von Knoten ausführen: leichte, vollständige und Archivknoten. Es gibt auch Optionen für verschiedene Synchronisierungsstrategien, die eine schnellere Synchronisierungszeit ermöglichen. Die Synchronisierung bezieht sich darauf, wie schnell sie die aktuellsten Informationen über Ethereums Zustand erhalten kann. -### Vollständige Knoten {#full-node} +### Full Node {#full-node} -Vollständige Knoten führen eine Block-für-Block-Validierung der Blockchain durch, einschließlich des Herunterladens und Verifizierens des Block-Inhalts und der Statusdaten für jeden Block. Es gibt verschiedene Klassen von vollständigen Knoten – einige beginnen mit dem Genesis-Block und verifizieren jeden einzelnen Block in der gesamten Geschichte der Blockchain. Andere beginnen ihre Verifizierung bei einem neueren Block, den sie für gültig halten (z. B. Geths „Snap Sync“). Unabhängig davon, wo die Verifizierung beginnt, behalten vollständige Knoten nur eine lokale Kopie relativ aktueller Daten (in der Regel die jüngsten 128 Blöcke), so dass ältere Daten gelöscht werden können, um Speicherplatz zu sparen. Ältere Daten können wiederhergestellt werden, wenn sie benötigt werden. +Vollständige Knoten führen eine Block-für-Block-Validierung der Blockchain durch, einschließlich des Herunterladens und Verifizierens des Block-Inhalts und der Statusdaten für jeden Block. Es gibt verschiedene Klassen von Full Nodes – einige beginnen mit dem Genesis-Block und verifizieren jeden einzelnen Block in der gesamten Geschichte der Blockchain. Andere beginnen ihre Verifizierung bei einem neueren Block, den sie für gültig halten (z. B. Geths „Snap Sync“). Unabhängig davon, wo die Verifizierung beginnt, behalten Full Nodes nur eine lokale Kopie relativ aktueller Daten (in der Regel die letzten 128 Blöcke), sodass ältere Daten gelöscht werden können, um Speicherplatz zu sparen. Ältere Daten können wiederhergestellt werden, wenn sie benötigt werden. - Speichert die vollständigen Blockchain-Daten (obwohl diese regelmäßig „geprunt“ werden, so dass ein vollständiger Knoten nicht alle Zustandsdaten bis zurück zur Genesis speichert) - Beteiligt sich an der Blockprüfung, überprüft alle Blöcke und Zustände. - Alle Status können entweder aus dem lokalen Speicher abgerufen oder von einem Full Node aus „Snapshots“ neu generiert werden. - Bedient das Netzwerk und liefert Daten auf Anfrage. -### Archivierungsnode {#archive-node} +### Archiv-Node {#archive-node} Archivierungsnodes sind Full Nodes, die jeden Block seit Genesis verifizieren und niemals irgendwelche heruntergeladenen Daten löschen. -- Speichert alles im Full Node und baut zusätzlich ein Archiv von vergangenen Zuständen auf. Sie werden wird benötigt, wenn Sie z. B. einen Kontostand im Block #4.000.000 abfragen oder einfach und zuverlässig Ihre eigenen Transaktionen testen möchten, ohne sie mithilfe von Tracing zu schürfen. +- Speichert alles im Full Node und baut zusätzlich ein Archiv von vergangenen Zuständen auf. Dies ist erforderlich, wenn Sie beispielsweise den Kontostand bei Block Nr. 4.000.000 abfragen oder Ihre eigenen Transaktionen einfach und zuverlässig testen möchten, ohne sie mithilfe von Tracing zu validieren. - Diese Daten werden in Einheiten von Terabytes dargestellt, was die Archivierungsknoten für den Durchschnittsnutzer weniger attraktiv macht, jedoch für Dienste wie Blockexplorer, Wallet-Anbieter und Chain-Analytics nützlich sein kann. Das Synchronisieren von Clients in jedem anderen Modus als dem Archiv führt zu reduzierten (pruned) Blockchain-Daten. Das bedeutet, es gibt kein Archiv mit allen vergangenen Zuständen, der vollständige Node ist jedoch in der Lage, diese bei Bedarf zu erstellen. -Erfahren Sie mehr über [Archivierungsnodes](/developers/docs/nodes-and-clients/archive-nodes). +Erfahren Sie mehr über [Archiv-Nodes](/developers/docs/nodes-and-clients/archive-nodes). -### Leichte Nodes {#light-node} +### Light Node {#light-node} -Anstatt jeden Block herunterzuladen, laden Light Nodes nur Block-Header herunter. Diese Header enthalten zusammenfassende Informationen über den Inhalt der Blöcke. Alle anderen Informationen, die der leichte Node benötigt, werden von einem Full Node angefordert. Der leichte Node kann dann die empfangenen Daten unabhängig mit den Zustandswurzeln in den Block-Headern abgleichen. Leichte Nodes ermöglichen es Nutzern, am Ethereum-Netzwerk teilzunehmen, ohne die leistungsstarke Hardware oder hohe Bandbreite zu benötigen, die für den Betrieb von Full Nodes erforderlich sind. Irgendwann könnten leichte Nodes auf Mobiltelefonen oder eingebetteten Geräten laufen. Leichte Nodes nehmen nicht am Konsens teil (d.h. sie können nicht minen/validieren), sie können jedoch auf die Ethereum-Blockchain mit denselben Funktionen und Sicherheitsgarantien zugreifen wie ein Full Node. +Anstatt jeden Block herunterzuladen, laden Light Nodes nur Block-Header herunter. Diese Header enthalten zusammenfassende Informationen über den Inhalt der Blöcke. Alle anderen Informationen, die der leichte Node benötigt, werden von einem Full Node angefordert. Der leichte Node kann dann die empfangenen Daten unabhängig mit den Zustandswurzeln in den Block-Headern abgleichen. Leichte Nodes ermöglichen es Nutzern, am Ethereum-Netzwerk teilzunehmen, ohne die leistungsstarke Hardware oder hohe Bandbreite zu benötigen, die für den Betrieb von Full Nodes erforderlich sind. Irgendwann könnten leichte Nodes auf Mobiltelefonen oder eingebetteten Geräten laufen. Light Nodes nehmen nicht am Konsens teil (d. h. sie können keine Validatoren sein), aber sie können mit der gleichen Funktionalität und den gleichen Sicherheitsgarantien wie ein Full Node auf die Ethereum-Blockchain zugreifen. -Leichte Clients sind ein Bereich, in dem Ethereum aktiv entwickelt wird. Es wird erwartet, dass wir bald neue leichte Clients für die Konsens- und Ausführungsebene entwickeln werden. Es gibt potenziell auch Wege, leichte Client-Daten über das [Gossip-Netzwerk](https://www.ethportal.net/) bereitzustellen. Dies ist vorteilhaft, da das Gossip-Netzwerk ein Netzwerk von leichten Nodes unterstützen könnte, ohne dass Full Nodes zur Bedienung von Anfragen erforderlich sind. +Leichte Clients sind ein Bereich, in dem Ethereum aktiv entwickelt wird. Es wird erwartet, dass wir bald neue leichte Clients für die Konsens- und Ausführungsebene entwickeln werden. +Es gibt auch potenzielle Wege, um Light-Client-Daten über das [Gossip-Netzwerk](https://www.ethportal.net/) bereitzustellen. Dies ist vorteilhaft, da das Gossip-Netzwerk ein Netzwerk von leichten Nodes unterstützen könnte, ohne dass Full Nodes zur Bedienung von Anfragen erforderlich sind. -Ethereum unterstützt noch keine große Population von leichten Nodes, jedoch ist die Unterstützung von leichten Nodes ein Bereich, der sich in naher Zukunft voraussichtlich schnell entwickeln wird. Insbesondere Clients wie [Nimbus](https://nimbus.team/), [Helios](https://github.com/a16z/helios) und [LodeStar](https://lodestar.chainsafe.io/) sind derzeit stark auf leichte Nodes ausgerichtet. +Ethereum unterstützt noch keine große Population von leichten Nodes, jedoch ist die Unterstützung von leichten Nodes ein Bereich, der sich in naher Zukunft voraussichtlich schnell entwickeln wird. Insbesondere Clients wie [Nimbus](https://nimbus.team/), [Helios](https://github.com/a16z/helios) und [LodeStar](https://lodestar.chainsafe.io/) konzentrieren sich derzeit stark auf Light Nodes. -## Warum sollte ich einen Ethereum-Node betreiben? {#why-should-i-run-an-ethereum-node} +## Warum sollte ich einen Ethereum-Node betreiben? Warum sollte ich einen Ethereum-Node betreiben? {#why-should-i-run-an-ethereum-node} Der Betrieb eines eigenen Knotens ermöglicht es Ihnen, Ethereum auf private, autarke und vertrauenswürdige Weise zu nutzen und gleichzeitig das Netz zu unterstützen, da es so robuster und dezentraler wird. @@ -89,57 +93,57 @@ Der Betrieb eines eigenen Knotens ermöglicht es Ihnen, Ethereum auf private, au Der Betrieb eines eigenen Knotens erlaubt es Ihnen, Ethereum auf private, autarke und vertrauenswürdige Weise zu nutzen. Sie müssen dem Netzwerk nicht vertrauen, da Sie die Daten mit Ihrem Client selbst überprüfen können. „Nicht vertrauen, überprüfen“ ist ein beliebtes Mantra der Blockchain. - Ihr Node überprüft alle Transaktionen und Blöcke selbstständig anhand der Konsensregeln. Das bedeutet, dass Sie sich nicht auf andere Nodes im Netzwerk verlassen oder ihnen vollständig vertrauen müssen. -- Sie können ein Ethereum-Wallet mit Ihrem eigenen Knoten verwenden. Sie können dApps sicherer und privater nutzen, da Sie Ihre Adressen und Guthaben nicht an Vermittler weitergeben müssen. Alles kann mit Ihrem eigenen Client überprüft werden. [MetaMask](https://metamask.io), [Frame](https://frame.sh/) und [viele andere Wallets](/wallets/find-wallet/) bieten einen RPC-Import, der es ihnen ermöglicht, Ihren Node zu nutzen. +- Sie können ein Ethereum-Wallet mit Ihrem eigenen Knoten verwenden. Sie können dApps sicherer und privater nutzen, da Sie Ihre Adressen und Guthaben nicht an Vermittler weitergeben müssen. Alles kann mit Ihrem eigenen Client überprüft werden. [MetaMask](https://metamask.io), [Frame](https://frame.sh/) und [viele andere Wallets](/wallets/find-wallet/) bieten RPC-Import an, der es ihnen ermöglicht, Ihre Node zu verwenden. - Sie können andere Dienste betreiben und selbst hosten, die auf Daten von Ethereum angewiesen sind. Das kann zum Beispiel ein Beacon-Chain-Validator, Software wie Layer 2, Infrastruktur, Block-Explorer, Zahlungsprozessoren usw. sein. - Sie können Ihre eigenen benutzerdefinierten [RPC-Endpunkte](/developers/docs/apis/json-rpc/) bereitstellen. Sie könnten diese Endpunkte sogar öffentlich anbieten, um der Community zu helfen, große zentrale Anbieter zu vermeiden. -- Sie können sich mit Ihrem Knoten über **Interprozesskommunikation (IPC)** verbinden oder den Knoten umschreiben, um Ihr Programm als Plugin zu laden. Dies garantiert eine niedrige Latenzzeit, was sehr hilfreich ist, z. B. bei der Verarbeitung großer Datenmengen mit web3-Bibliotheken oder wenn Sie Ihre Transaktionen so schnell wie möglich ersetzen müssen (z. B. Frontrunning). -- Sie können ETH direkt einsetzen, um das Netzwerk zu sichern und Prämien zu verdienen. Siehe [Solo-Staking](/staking/solo/) für den Einstieg. +- Sie können sich über **Interprozesskommunikation (IPC)** mit Ihrer Node verbinden oder die Node umschreiben, um Ihr Programm als Plugin zu laden. Dies gewährt eine niedrige Latenz, was sehr hilft, z. B. bei der Verarbeitung großer Datenmengen mit Web3-Bibliotheken oder wenn Sie Ihre Transaktionen so schnell wie möglich ersetzen müssen (d. h. Frontrunning). +- Sie können ETH direkt einsetzen, um das Netzwerk zu sichern und Prämien zu verdienen. Siehe [Solo-Staking](/staking/solo/), um loszulegen. -![So greifen Sie über Ihre Anwendung und Nodes auf Ethereum zu](./nodes.png) +![Wie Sie über Ihre Anwendung und Nodes auf Ethereum zugreifen](./nodes.png) -### Vorteile des Netzwerks {#network-benefits} +### Vorteile für das Netzwerk {#network-benefits} Eine Vielzahl von Nodes ist wichtig für die Gesundheit, Sicherheit und operative Belastbarkeit von Ethereum. - Full Nodes setzen die Konsensregeln durch, sodass sie nicht dazu verleitet werden können, Blöcke zu akzeptieren, die nicht den Regeln entsprechen. Dies sorgt für zusätzliche Sicherheit im Netzwerk, denn wenn alle Knoten leichte Nodes wären, die keine vollständige Verifizierung durchführen, könnten Validatoren das Netzwerk angreifen. -- Im Falle eines Angriffs, der die kryptoökonomischen Verteidigungsmechanismen von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/#what-is-pos) überwindet, kann eine „soziale Wiederherstellung“ durch Full Nodes erfolgen, die sich dafür entscheiden, der „ehrlichen“ Chain zu folgen. +- Im Falle eines Angriffs, der die kryptoökonomischen Abwehrmechanismen von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/#what-is-pos) überwindet, kann eine soziale Wiederherstellung durch Full Nodes durchgeführt werden, die sich dafür entscheiden, der ehrlichen Chain zu folgen. - Mehr Knoten im Netzwerk führen zu einem vielfältigeren und robusteren Netzwerk, dem ultimativen Ziel der Dezentralisierung, das ein zensurresistentes und zuverlässiges System ermöglicht. -- Full Nodes bieten den Zugang zu Blockchain-Daten für leichte Clients, die darauf angewiesen sind. Light Nodes speichern nicht die gesamte Blockchain, sondern verifizieren die Daten über die [Zustandswurzeln in den Block-Headern](/developers/docs/blocks/#block-anatomy). Sie können bei Bedarf weitere Informationen von Full Nodes anfordern. +- Full Nodes bieten den Zugang zu Blockchain-Daten für leichte Clients, die darauf angewiesen sind. Light Nodes speichern nicht die gesamte Blockchain, sondern verifizieren Daten über die [State Roots in den Block-Headern](/developers/docs/blocks/#block-anatomy). Sie können bei Bedarf weitere Informationen von Full Nodes anfordern. Wenn Sie einen Full Node betreiben, profitiert das gesamte Ethereum-Netzwerk davon, auch wenn Sie keinen Validator betreiben. -## Betreiben eines eigenen Nodes {#running-your-own-node} +## Eigene Node betreiben {#running-your-own-node} Haben Sie Interesse, Ihren eigenen Ethereum-Client zu betreiben? -Eine anfängerfreundliche Einführung finden Sie auf unserer Seite [Betreiben eines Knotens](/run-a-node). +Für eine einsteigerfreundliche Einführung besuchen Sie unsere Seite [Node betreiben](/run-a-node), um mehr zu erfahren. -Wenn Sie eher ein technisch erfahrener Benutzer sind, finden Sie hier weitere Details und Optionen, wie Sie [Ihren eigenen Knoten einrichten können](/developers/docs/nodes-and-clients/run-a-node/). +Wenn Sie ein eher technischer Benutzer sind, finden Sie weitere Details und Optionen, wie Sie [Ihre eigene Node aufsetzen](/developers/docs/nodes-and-clients/run-a-node/) können. ## Alternativen {#alternatives} -Die Einrichtung eines eigenen Knotens kann Sie Zeit und Ressourcen kosten, aber Sie müssen nicht immer eine eigene Instanz betreiben. In diesem Fall können Sie sich an einen externen API-Anbieter wenden. Einen Überblick zur Verwendung dieser Dienste finden Sie unter [Nodes als Dienstleistung](/developers/docs/nodes-and-clients/nodes-as-a-service/). +Die Einrichtung eines eigenen Knotens kann Sie Zeit und Ressourcen kosten, aber Sie müssen nicht immer eine eigene Instanz betreiben. In diesem Fall können Sie sich an einen externen API-Anbieter wenden. Für einen Überblick über die Nutzung dieser Dienste, schauen Sie sich [Nodes as a Service](/developers/docs/nodes-and-clients/nodes-as-a-service/) an. Wenn jemand in Ihrer Community einen Ethereum-Knoten mit öffentlichen APIs betreiben, können Sie Ihre Wallet in einen Community-Knoten über Custom RPC einbinden, um Ihre Privatsphäre besser zu schützen als bei der zufälligen Auswahl eines vertrauenswürdigen Dritten. Wenn Sie andererseits einen Client betreiben, können Sie ihn mit Ihren Freunden teilen, die eventuell Bedarf haben. -## Ausführende Clients {#execution-clients} +## Ausführungs-Clients {#execution-clients} -Die Ethereum-Community unterhält mehrere quelloffene Ausführungsclients (früher als „Eth1-Clients“ oder einfach „Ethereum-Clients“ bezeichnet), die von verschiedenen Teams in unterschiedlichen Programmiersprachen entwickelt wurden. Dadurch wird das Netz stärker und [vielfältiger](/developers/docs/nodes-and-clients/client-diversity/). Das ideale Ziel ist es, Vielfalt zu erreichen, ohne dass ein Client dominiert, um jede Art von einzelnen Ausfallpunkten zu reduzieren. +Die Ethereum-Community unterhält mehrere quelloffene Ausführungsclients (früher als „Eth1-Clients“ oder einfach „Ethereum-Clients“ bezeichnet), die von verschiedenen Teams in unterschiedlichen Programmiersprachen entwickelt wurden. Dies macht das Netzwerk stärker und [vielfältiger](/developers/docs/nodes-and-clients/client-diversity/). Das ideale Ziel ist es, Vielfalt zu erreichen, ohne dass ein Client dominiert, um jede Art von einzelnen Ausfallpunkten zu reduzieren. -Diese Tabelle gibt einen Überblick über die verschiedenen Clients. Sie alle bestehen [Client-Tests](https://github.com/ethereum/tests) und werden aktiv gewartet, um mit Netzwerk-Upgrades auf dem neuesten Stand zu bleiben. +Diese Tabelle gibt einen Überblick über die verschiedenen Clients. Alle bestehen [Client-Tests](https://github.com/ethereum/tests) und werden aktiv gewartet, um mit Netzwerk-Upgrades auf dem neuesten Stand zu bleiben. -| Client | Sprache | Betriebssystem | Netzwerke | Synchronisationsstrategien | Zustandsreduzierung | -| ------------------------------------------------------------------------ | ---------- | --------------------- | ------------------------- | ----------------------------------------------------------------------------------- | ------------------- | -| [Geth](https://geth.ethereum.org/) | Go | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Momentaufnahme](#snap-sync), [komplett](#full-sync) | Archiv, Reduziert | -| [Nethermind](https://www.nethermind.io/) | C#, .NET | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Momentaufnahme](#snap-sync) (ohne Bereitstellung), schnell, [komplett](#full-sync) | Archive, Pruned | -| [Besu](https://besu.hyperledger.org/en/stable/) | Java | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Momentaufnahme](#snap-sync), [schnell](#fast-sync), [komplett](#full-sync) | Archive, Pruned | -| [Erigon](https://github.com/ledgerwatch/erigon) | Go | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Full](#full-sync) | Archive, Pruned | -| [Reth](https://reth.rs/) | Rust | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Full](#full-sync) | Archiv, Reduziert | -| [EthereumJS](https://github.com/ethereumjs/ethereumjs-monorepo) _(Beta)_ | TypeScript | Linux, Windows, MacOS | Sepolia, Holesky | [Full](#full-sync) | Reduziert | +| Client | Sprache | Betriebssysteme | Netzwerke | Synchronisationsstrategien | Zustandsreduzierung | +| ------------------------------------------------------------------------------------------- | ------------------------ | --------------------- | ------------------------- | ----------------------------------------------------------------------------------------------- | ------------------- | +| [Geth](https://geth.ethereum.org/) | Go | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Snap](#snap-sync), [Vollständig](#full-sync) | Archiv, Reduziert | +| [Nethermind](https://www.nethermind.io/) | C#, .NET | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Snap](#snap-sync) (ohne Bereitstellung), Schnell, [Vollständig](#full-sync) | Archiv, Reduziert | +| [Besu](https://besu.hyperledger.org/en/stable/) | Java | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Snap](#snap-sync), [Schnell](#fast-sync), [Vollständig](#full-sync) | Archiv, Reduziert | +| [Erigon](https://github.com/ledgerwatch/erigon) | Go | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Vollständig](#full-sync) | Archiv, Reduziert | +| [Reth](https://reth.rs/) | Rust | Linux, Windows, MacOS | Mainnet, Sepolia, Holesky | [Vollständig](#full-sync) | Archiv, Reduziert | +| [EthereumJS](https://github.com/ethereumjs/ethereumjs-monorepo) _(Beta)_ | TypeScript | Linux, Windows, MacOS | Sepolia, Holesky | [Vollständig](#full-sync) | Reduziert | -Weitere Informationen zu unterstützten Netzwerken finden Sie unter [Ethereum-Netzwerke](/developers/docs/networks/). +Für mehr Informationen zu unterstützten Netzwerken, lesen Sie [Ethereum-Netzwerke](/developers/docs/networks/). Jeder Client bietet einzigartige Anwendungsfälle und Vorteile, daher sollten Sie einen basierend auf Ihren eigenen Präferenzen wählen. Die Client-Vielfalt ermöglicht die Fokussierung der Implementierungen auf verschiedene Funktionen und Benutzergruppen. Sie können einen Client basierend auf Funktionen, Support, Programmiersprache oder Lizenzen auswählen. @@ -147,7 +151,7 @@ Jeder Client bietet einzigartige Anwendungsfälle und Vorteile, daher sollten Si Hyperledger Besu ist ein Ethereum-Client auf Unternehmensebene für öffentliche und private Netzwerke. Er bietet alle Funktionen des Ethereum-Mainnets, von Tracing bis GraphQL, bietet ein umfangreiches Monitoring und wird von ConsenSys unterstützt, sowohl in offenen Community-Kanälen als auch durch kommerzielle SLA für Unternehmen. Er ist in Java geschrieben und durch Apache 2.0 lizenziert. -Die umfangreiche [Dokumentation](https://besu.hyperledger.org/en/stable/) von Besu führt Sie durch alle Details der Funktionen und Einstellungen. +Die umfangreiche [Dokumentation](https://besu.hyperledger.org/en/stable/) von Besu wird Sie durch alle Details zu seinen Funktionen und Setups führen. ### Erigon {#erigon} @@ -157,7 +161,7 @@ Erigon, früher bekannt als Turbo-Geth, begann als eine Abspaltung von Go Ethere Go Ethereum (kurz Geth) ist eine der ursprünglichen Implementierungen des Ethereum-Protokolls. Derzeit ist es der am weitesten verbreitete Client mit der größten Benutzerbasis und der größten Vielfalt an Tools für Benutzer und Entwickler. Es ist in Go geschrieben, vollständig Open Source und unter der GNU LGPL v3 lizenziert. -Erfahren Sie mehr über Geth in der [Dokumentation](https://geth.ethereum.org/docs/). +Erfahren Sie mehr über Geth in seiner [Dokumentation](https://geth.ethereum.org/docs/). ### Nethermind {#nethermind} @@ -167,7 +171,7 @@ Nethermind ist eine Ethereum-Implementierung, die mit dem C# .NET Tech-Stack ers - Zustandszugriff, - Netzwerkfunktionen und umfangreiche Features wie Prometheus-/Grafana-Dashboards, Unterstützung für Protokollierung auf Unternehmensebene mit Seq, JSON-RPC-Nachverfolgung und Analyse-Plug-ins. -Nethermind bietet außerdem eine [detaillierte Dokumentation](https://docs.nethermind.io), starke Entwicklerunterstützung, eine Online-Community und Support rund um die Uhr für Premiumnutzer. +Nethermind hat auch eine [detaillierte Dokumentation](https://docs.nethermind.io), starken Entwickler-Support, eine Online-Community und 24/7-Support für Premium-Benutzer. ### Reth {#reth} @@ -175,7 +179,7 @@ Reth (kurz für Rust Ethereum) ist eine Ethereum-Full-Node-Implementierung, die Reth ist einsatzbereit und für die Verwendung in geschäftskritischen Umgebungen wie Staking- oder Hochverfügbarkeitsdiensten geeignet. Es zeigt eine gute Bilanz in Anwendungsfällen auf, bei denen hohe Leistung mit großen Spielräumen erforderlich ist, wie z. B. RPC, MEV, Indizierung, Simulationen und P2P-Aktivitäten. -Erfahren Sie mehr mit dem [Reth Book](https://reth.rs/) oder dem [Reth-GitHub-Repository](https://github.com/paradigmxyz/reth?tab=readme-ov-file#reth). +Erfahren Sie mehr im [Reth Book](https://reth.rs/) oder im [Reth GitHub-Repo](https://github.com/paradigmxyz/reth?tab=readme-ov-file#reth). ### In Entwicklung {#execution-in-development} @@ -185,58 +189,58 @@ Diese Clients befinden sich noch in einer frühen Entwicklungsphase und sind der Der EthereumJS Execution Client (EthereumJS) ist in TypeScript geschrieben und besteht aus mehreren Paketen. Dazu gehören grundlegende Ethereum-Basiskomponenten wie die Klassen Block, Transaktion und Merkle-Patricia Trie sowie zentrale Client-Komponenten wie eine Implementierung der Ethereum Virtual Machine (EVM), eine Blockchain-Klasse und der DevP2P-Netzwerk-Stack. -Um mehr dazu zu erfahren, lesen Sie die entsprechende [Dokumentation](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master) +Erfahren Sie mehr darüber, indem Sie die [Dokumentation](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master) lesen. ## Konsens-Clients {#consensus-clients} -Es gibt mehrere Konsensclients (früher als „Eth2“-Clients bekannt), die dazu da sind, die [Konsens-Upgrades](/roadmap/beacon-chain/) zu unterstützen. Sie sind für die gesamte konsensbezogene Logik verantwortlich, einschließlich des Fork-Choice-Algorithmus, der Verarbeitung von Attestierungen und der Verwaltung von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos)-Prämien und Strafen. +Es gibt mehrere Konsens-Clients (früher als „Eth2“-Clients bekannt), um die [Konsens-Upgrades](/roadmap/beacon-chain/) zu unterstützen. Sie sind für die gesamte konsensbezogene Logik verantwortlich, einschließlich des Fork-Choice-Algorithmus, der Verarbeitung von Attestierungen und der Verwaltung von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos)-Belohnungen und -Strafen. -| Client | Sprache | Betriebssysteme | Netzwerke | -| ------------------------------------------------------------- | ---------- | --------------------- | ------------------------------------------------------------------- | -| [Lighthouse](https://lighthouse.sigmaprime.io/) | Rust | Linux, Windows, MacOS | Beacon Chain, Goerli, Pyrmont, Sepolia, Ropsten und weitere | -| [Lodestar](https://lodestar.chainsafe.io/) | TypeScript | Linux, Windows, MacOS | Beacon Chain, Goerli, Sepolia, Ropsten und weitere | -| [Nimbus](https://nimbus.team/) | Nim | Linux, Windows, MacOS | Beacon Chain, Goerli, Sepolia, Ropsten und weitere | -| [Prysm](https://prysm.offchainlabs.com/docs/) | Los | Linux, Windows, MacOS | Beacon Chain, Gnosis, Goerli, Pyrmont, Sepolia, Ropsten und weitere | -| [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) | Java | Linux, Windows, MacOS | Beacon Chain, Gnosis, Goerli, Sepolia, Ropsten und weitere | -| [Grandine](https://docs.grandine.io/) (Beta) | Rust | Linux, Windows, MacOS | Beacon Chain, Goerli, Sepolia und mehr | +| Client | Sprache | Betriebssysteme | Netzwerke | +| ------------------------------------------------------------- | ---------- | --------------------- | -------------------------------------------------------- | +| [Lighthouse](https://lighthouse.sigmaprime.io/) | Rust | Linux, Windows, MacOS | Beacon Chain, Holesky, Pyrmont, Sepolia und mehr | +| [Lodestar](https://lodestar.chainsafe.io/) | TypeScript | Linux, Windows, MacOS | Beacon Chain, Holesky, Sepolia und mehr | +| [Nimbus](https://nimbus.team/) | Nim | Linux, Windows, MacOS | Beacon Chain, Holesky, Sepolia und mehr | +| [Prysm](https://prysm.offchainlabs.com/docs/) | Go | Linux, Windows, MacOS | Beacon Chain, Gnosis, Holesky, Pyrmont, Sepolia und mehr | +| [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) | Java | Linux, Windows, MacOS | Beacon Chain, Gnosis, Holesky, Sepolia und mehr | +| [Grandine](https://docs.grandine.io/) | Rust | Linux, Windows, MacOS | Beacon Chain, Holesky, Sepolia und mehr | ### Lighthouse {#lighthouse} Lighthouse ist eine Konsens-Client-Implementierung, die in Rust unter der Apache-2.0-Lizenz geschrieben ist. Sie wird von Sigma Prime gewartet und ist seit der Entstehung der Beacon Chain stabil und produktionsbereit. Lighthouse wird von verschiedenen Unternehmen, Staking-Pools und Einzelpersonen genutzt. Es soll sicher, leistungsfähig und interoperabel in einer Vielzahl von Umgebungen sein – von Desktop-PCs bis hin zu anspruchsvollen automatisierten Implementierungen. -Die Dokumentation ist im [Lighthouse Book](https://lighthouse-book.sigmaprime.io/) zu finden +Die Dokumentation finden Sie im [Lighthouse Book](https://lighthouse-book.sigmaprime.io/) ### Lodestar {#lodestar} Lodestar ist eine produktionsbereite Konsens-Client-Implementierung, die in Typescript unter der LGPL-3.0-Lizenz geschrieben wurde. Sie wird von ChainSafe Systems gewartet und ist der neueste der Konsensus-Clients für Solo-Staker, Entwickler und Forscher. Lodestar besteht aus einem Beacon-Knoten und einem Validator-Client, die auf JavaScript-Implementierungen von Ethereum-Protokollen basieren. Lodestar zielt darauf ab, die Benutzerfreundlichkeit von Ethereum mit leichten Clients zu verbessern, die Zugänglichkeit für eine größere Gruppe von Entwicklern zu erweitern und weiter zur Vielfalt des Ökosystems beizutragen. -Weitere Informationen finden Sie auf unserer [Lodestar-Website](https://lodestar.chainsafe.io/) +Weitere Informationen finden Sie auf der [Lodestar-Website](https://lodestar.chainsafe.io/) ### Nimbus {#nimbus} Nimbus ist eine Konsens-Client-Implementierung, geschrieben in Nim unter der Apache-2.0-Lizenz. Sie ist ein produktionsbereiter Client und wird von Solo-Stakern und Staking-Pools verwendet. Nimbus ist auf Ressourceneffizienz ausgelegt, so dass er auf ressourcenbeschränkten Geräten und in der Unternehmensinfrastruktur gleichermaßen leicht ausgeführt werden kann, ohne dass die Stabilität oder die Prämien-Leistung beeinträchtigt wird. Ein geringerer Ressourcenbedarf bedeutet, dass der Client eine größere Sicherheitsmarge hat, wenn das Netzwerk unter Belastung steht. -Erfahren Sie mehr in den [Nimbus-Docs](https://nimbus.guide/) +Erfahren Sie mehr in den [Nimbus-Dokumenten](https://nimbus.guide/) ### Prysm {#prysm} Prysm ist ein vollwertiger, open-source Konsensclient, der in Go unter der GPL-3.0-Lizenz geschrieben wurde. Er verfügt über eine optionale Webapp-UI und legt großen Wert auf Benutzerfreundlichkeit, Dokumentation und Konfigurierbarkeit sowohl für Stake-at-Home- als auch für institutionelle Benutzer. -Besuchen Sie die [Prysm-Docs](https://prysm.offchainlabs.com/docs/), um mehr zu erfahren. +Besuchen Sie die [Prysm-Dokumente](https://prysm.offchainlabs.com/docs/), um mehr zu erfahren. ### Teku {#teku} Teku ist einer der ursprünglichen Clients der Beacon Chain-Genesis. Neben den üblichen Zielen (Sicherheit, Robustheit, Stabilität, Benutzerfreundlichkeit, Leistung) zielt Teku speziell darauf ab, alle verschiedenen Konsensclient-Standards vollständig zu erfüllen. -Teku bietet sehr flexible Einsatzmöglichkeiten. Der Beacon Node und der Validator-Client können zusammen als ein ein Prozess ausgeführt werden, was für Solo-Staker äußerst praktisch ist. Die Nodes können aber auch separat für anspruchsvolle Staking-Operationen ausgeführt werden. Darüber hinaus ist Teku vollständig kompatibel mit [Web3Signer](https://github.com/ConsenSys/web3signer/) für die Sicherheit der Signierschlüssel und Slashing-Schutz. +Teku bietet sehr flexible Einsatzmöglichkeiten. Der Beacon Node und der Validator-Client können zusammen als ein ein Prozess ausgeführt werden, was für Solo-Staker äußerst praktisch ist. Die Nodes können aber auch separat für anspruchsvolle Staking-Operationen ausgeführt werden. Zudem ist Teku vollständig interoperabel mit [Web3Signer](https://github.com/ConsenSys/web3signer/) für die Sicherheit von Signierschlüsseln und Slashing-Schutz. -Teku ist in Java unter der Apache 2.0 Lizenz geschrieben. Es wird vom Protokoll-Team bei ConsenSys entwickelt, das auch für Besu und Web3Signer verantwortlich ist. Erfahren Sie mehr in den [Teku-Docs](https://docs.teku.consensys.net/en/latest/). +Teku ist in Java unter der Apache 2.0 Lizenz geschrieben. Es wird vom Protokoll-Team bei ConsenSys entwickelt, das auch für Besu und Web3Signer verantwortlich ist. Erfahren Sie mehr in den [Teku-Dokumenten](https://docs.teku.consensys.net/en/latest/). ### Grandine {#grandine} Grandine ist eine Konsens-Client-Implementierung, geschrieben in Rust und unter der GPL-3.0-Lizenz. Es wird vom Grandine Core Team gepflegt und ist schnell, leistungsstark und leicht. Es ist für eine Vielzahl von Stakern geeignet – von Einzelstakern, die ressourcenarme Geräte wie Raspberry Pi verwenden, bis hin zu großen institutionellen Stakern, die Zehntausende von Validatoren betreiben. -Die entsprechende Dokumentation finden Sie im [Grandine Book](https://docs.grandine.io/) +Die Dokumentation finden Sie im [Grandine Book](https://docs.grandine.io/) ## Synchronisationsmodi {#sync-modes} @@ -255,7 +259,7 @@ Eine vollständige Synchronisierung lädt alle Blöcke (inklusive Header und Blo - Minimiert das Vertrauen und bietet höchste Sicherheit, indem jede Transaktion verifiziert wird. - Bei einer steigenden Anzahl von Transaktionen kann es Tage bis Wochen dauern, alle Transaktionen zu bearbeiten. -[Archivknoten](#archive-node) führen eine vollständige Synchronisierung durch, um eine vollständige Historie der Statusänderungen zu erstellen (und zu behalten), die durch jede Transaktion in jedem Block vorgenommen wurden. +[Archiv-Nodes](#archive-node) führen eine vollständige Synchronisierung durch, um eine komplette Historie der Zustandsänderungen zu erstellen (und zu behalten), die durch jede Transaktion in jedem Block vorgenommen wurden. #### Schnelle Synchronisierung {#fast-sync} @@ -273,37 +277,37 @@ Snap-Synchronisierungen überprüfen ebenfalls die Chain Block für Block. Ansta [Mehr zur Snap-Synchronisierung](https://github.com/ethereum/devp2p/blob/master/caps/snap.md). -#### Leichte Synchronisation {#light-sync} +#### Light-Synchronisierung {#light-sync} Der Light-Client-Modus lädt alle Block-Header und Blockdaten herunter und prüft einige davon nach Zufallsprinzip. Synchronisiert nur die Spitze der Chain vom vertrauenswürdigen Kontrollpunkt. - Ruft nur den neuesten Zustand ab und verlässt sich dabei auf das Vertrauen in die Entwickler und den Konsensmechanismus. - Der Client ist in wenigen Minuten mit dem aktuellen Netzwerkstatus einsatzbereit. -**Hinweis**: Light Sync funktioniert noch nicht mit Proof-of-Stake Ethereum – Aber neue Versionen von Light Sync sollten bald erscheinen! +**Hinweis:** Die Light-Synchronisierung funktioniert noch nicht mit Proof-of-Stake-Ethereum – neue Versionen der Light-Synchronisierung sollten bald ausgeliefert werden! -[Mehr über Light-Clients](/developers/docs/nodes-and-clients/light-clients/) +[Mehr zu Light Clients](/developers/docs/nodes-and-clients/light-clients/) -### Synchronisationsmodi der Konsensschicht {#consensus-layer-sync-modes} +### Synchronisationsmodi der Konsensebene {#consensus-layer-sync-modes} -#### Optimistische Synchronisation {#optimistic-sync} +#### Optimistische Synchronisierung {#optimistic-sync} -Die „optimistische“ Synchronisierung ist eine Synchronisierungsstrategie nach der Zusammenführung, die als Opt-in und rückwärtskompatibel konzipiert ist und es Ausführungsknoten ermöglicht, sich über etablierte Methoden zu synchronisieren. Die Ausführungsengine kann auf _optimistische_ Weise Beacon-Blöcke importieren, ohne sie vollständig zu verifizieren, den neuesten Head finden und anschließend mit der Synchronisierung der Chain mit den oben genannten Methoden beginnen. Nachdem der Ausführungsclient aufgeholt hat, informiert er den Konsensclient über die Gültigkeit der Transaktionen auf der Beacon Chain. +Die „optimistische“ Synchronisierung ist eine Synchronisierungsstrategie nach der Zusammenführung, die als Opt-in und rückwärtskompatibel konzipiert ist und es Ausführungsknoten ermöglicht, sich über etablierte Methoden zu synchronisieren. Die Ausführungs-Engine kann Beacon-Blöcke _optimistisch_ importieren, ohne sie vollständig zu verifizieren, den neuesten Head finden und dann mit der Synchronisierung der Chain mit den oben genannten Methoden beginnen. Nachdem der Ausführungsclient aufgeholt hat, informiert er den Konsensclient über die Gültigkeit der Transaktionen auf der Beacon Chain. [Mehr zur optimistischen Synchronisierung](https://github.com/ethereum/consensus-specs/blob/dev/sync/optimistic.md) -#### Kontrollpunkt-Synchronisation {#checkpoint-sync} +#### Checkpoint-Synchronisierung {#checkpoint-sync} -Eine Checkpoint-Synchronisierung, auch bekannt als schwache Subjektivitätssynchronisierung, bietet eine überlegene Benutzererfahrung bei der Beacon-Node-Synchronisierung. Sie basiert auf Annahmen der [schwachen Subjektivität](/developers/docs/consensus-mechanisms/pos/weak-subjectivity/), welche es ermöglicht, die Beacon Chain von einem aktuellen schwachen Subjektivitäts-Checkpoint aus anstelle von Genesis zu synchronisieren. Checkpoint-Synchronisierungen verkürzen die anfängliche Synchronisierungszeit erheblich bei ähnlichen Vertrauensannahmen wie bei der Synchronisierung von [Genesis](/glossary/#genesis-block) aus. +Eine Checkpoint-Synchronisierung, auch bekannt als schwache Subjektivitätssynchronisierung, bietet eine überlegene Benutzererfahrung bei der Beacon-Node-Synchronisierung. Sie basiert auf Annahmen der [schwachen Subjektivität](/developers/docs/consensus-mechanisms/pos/weak-subjectivity/), die das Synchronisieren der Beacon Chain von einem aktuellen Checkpoint mit schwacher Subjektivität anstelle des Genesis-Blocks ermöglicht. Checkpoint-Synchronisierungen machen die anfängliche Synchronisierungszeit erheblich schneller, mit ähnlichen Vertrauensannahmen wie bei der Synchronisierung vom [Genesis-Block](/glossary/#genesis-block). In der Praxis bedeutet dies, dass Ihr Knoten eine Verbindung zu einem entfernten Dienst herstellt, um die letzten abgeschlossenen Zustände herunterzuladen und die Daten ab diesem Punkt weiter zu überprüfen. Der Drittanbieter, der die Daten bereitstellt, ist vertrauenswürdig und sollte sorgfältig ausgewählt werden. -Mehr über [Kontrollpunkt-Synchronisation](https://notes.ethereum.org/@djrtwo/ws-sync-in-practice) +Mehr zur [Checkpoint-Synchronisierung](https://notes.ethereum.org/@djrtwo/ws-sync-in-practice) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Ethereum 101 - Part 2 - Understanding Nodes](https://kauri.io/ethereum-101-part-2-understanding-nodes/48d5098292fd4f11b251d1b1814f0bba/a) _– Wil Barnes, 13. Februar 2019_ -- [Running Ethereum Full Nodes: A Guide for the Barely Motivated](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7. November 2019_ +- [Ethereum 101 – Teil 2 – Nodes verstehen](https://kauri.io/ethereum-101-part-2-understanding-nodes/48d5098292fd4f11b251d1b1814f0bba/a) _– Wil Barnes, 13. Februar 2019_ +- [Ethereum Full Nodes betreiben: Eine Anleitung für die kaum Motivierten](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7. November 2019_ ## Verwandte Themen {#related-topics} @@ -312,4 +316,4 @@ Mehr über [Kontrollpunkt-Synchronisation](https://notes.ethereum.org/@djrtwo/ws ## Verwandte Tutorials {#related-tutorials} -- [Verwandeln Sie Ihren Raspberry Pi 4 in einen Validator-Knoten nur durch die Installation der MicroSD Card – Installationsanweisung](/developers/tutorials/run-node-raspberry-pi/) _– Schalten Sie Ihren Raspberry Pi 4 ein, schließen Sie ein Ethernet-Kabel an, verbinden Sie die SSD-Festplatte und schalten Sie das Gerät ein, um den Raspberry Pi 4 in einen vollständigen Ethereum-Knoten zu verwandeln, der die Ausführungsebene (Mainnet) und/oder die Konsensebene (Beacon Chain/Validator) ausführt._ +- [Verwandeln Sie Ihren Raspberry Pi 4 in einen Validator-Node, indem Sie einfach die MicroSD-Karte flashen – Installationsanleitung](/developers/tutorials/run-node-raspberry-pi/) _– Flashen Sie Ihren Raspberry Pi 4, stecken Sie ein Ethernet-Kabel ein, schließen Sie die SSD-Festplatte an und schalten Sie das Gerät ein, um den Raspberry Pi 4 in einen vollwertigen Ethereum-Node zu verwandeln, der die Ausführungsebene (Mainnet) und/oder die Konsensebene (Beacon Chain/Validator) ausführt._ diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md index b4563ade424..6402dff7e15 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/light-clients/index.md @@ -6,13 +6,13 @@ lang: de Der Betrieb eines vollständigen Knotens ist die vertrauenswürdigste, dezentralste, privateste und zensurresistenteste Möglichkeit, um mit Ethereum zu interagieren. Mit einem vollständigen Knoten können Sie Ihre eigene Kopie der Blockchain behalten. Auf dieser können sie Abfragen direkt ausführen und Sie haben einen direkten Zugriff auf das Peer-to-Peer-Netzwerk von Ethereum. Jedoch erfordert der Betrieb eines vollständigen Knotens eine signifikante Menge an Arbeitsspeicher, Speicherplatz und CPU. Das bedeutet, dass es nicht für jeden möglich ist seinen eigenen Knoten zu betreiben. Es gibt mehrere Lösungen dazu in der Ethereum-Roadmap, dazu gehört auch die Zustandslosigkeit, jedoch sind diese noch Jahre von ihrer Implementierung entfernt. Die kurzfristige Lösung dazu ist, einige Vorteile eines vollständigen Knotens mit großen Leistungsverbesserungen, die es ermöglichen einen Knoten mit sehr geringen Hardware-Anforderungen zu betreiben, einzutauschen. Knoten, die diesen Kompromiss erzielen, werden leichte Knoten (Light Nodes) genannt. -## Was ist ein leichter Client {#what-is-a-light-client} +## Was ist ein Light-Client? {#what-is-a-light-client} Ein leichter Knoten ist ein Knoten, der auf der Software eines leichten Clients betrieben werden kann. Statt lokale Kopien der gesamten Daten der Blockchain zu speichern und unabhängig alle Änderungen mitzuverfolgen, fragen sie die notwendigen Daten von irgendeinem Anbieter ab. Der Anbieter könnte eine direkte Verbindung zu einem vollständigen Knoten oder irgendein zentraler RPC-Server sein. Die Daten werden dann vom leichten Knoten verifiziert. Dadurch kann er mit der Spitze der Blockchain mithalten. Der leichte Knoten verarbeitet nur Block-Header und lädt gelegentlich die echten Inhalte des Blocks herunter. Die Leichtigkeit der Nodes kann variieren, abhängig von den Kombinationen der Light- und vollständigen Client-Software, die sie ausführen. Zum Beispiel würde die leichteste Konfiguration darin bestehen, einen leichten Ausführungs-, sowie Konsensclient zu betreiben. Es ist auch wahrscheinlich, dass viele Knoten sich entscheiden, einen leichten Konsensclient mit einem vollen Ausführungsclient oder andersherum zu betreiben. ## Wie funktionieren leichte Clients? {#how-do-light-clients-work} -Als Ethereum damit begann, einen auf Proof-of-Stake basierenden Konsensmechanismus zu nutzen, wurde neue Infrastruktur, vor allem für leichte Clients, aufgebaut. Das funktioniert, indem alle 1,1 Tage eine Teilmenge von 512 Validatoren als **Synchronisierungskomitee** ausgewählt werden. Das Synchronisierungskomitee unterschreibt den Header von den letzten Blöcken. Jeder Block-Header beinhaltet die gesammelten Unterschriften der Validatoren im Synchronisierungskomitee und ein „Bitfeld“, das zeigt, welche Validatoren unterschrieben haben und welche nicht. Jeder Header beinhaltet auch eine Liste von Validatoren, von denen erwartet wird, den nächsten Block zu unterschreiben. Das bedeutet, dass ein leichter Client schnell sehen kann, dass das Synchronisierungskomitee den empfangenen Daten zustimmt und dass sie auch überprüfen können, ob das Synchronisierungskomitee das Original ist, indem sie die empfangenen mit den im letzten Block erwarteten Daten vergleichen. So kann der leichte Client sein Wissen über den letzten Ethereum-Block immer wieder erneuern, ohne den Block selbst, sondern nur den Header, herunterzuladen. +Als Ethereum damit begann, einen auf Proof-of-Stake basierenden Konsensmechanismus zu nutzen, wurde neue Infrastruktur, vor allem für leichte Clients, aufgebaut. Dabei wird alle 1,1 Tage zufällig eine Teilmenge von 512 Validatoren ausgewählt, die als **Synchronisierungskomitee** fungiert. Das Synchronisierungskomitee unterschreibt den Header von den letzten Blöcken. Jeder Block-Header enthält die aggregierte Signatur der Validatoren im Synchronisierungskomitee und ein "Bitfeld", das anzeigt, welche Validatoren unterschrieben haben und welche nicht. Jeder Header beinhaltet auch eine Liste von Validatoren, von denen erwartet wird, den nächsten Block zu unterschreiben. Das bedeutet, dass ein leichter Client schnell sehen kann, dass das Synchronisierungskomitee den empfangenen Daten zustimmt und dass sie auch überprüfen können, ob das Synchronisierungskomitee das Original ist, indem sie die empfangenen mit den im letzten Block erwarteten Daten vergleichen. So kann der leichte Client sein Wissen über den letzten Ethereum-Block immer wieder erneuern, ohne den Block selbst, sondern nur den Header, herunterzuladen. Auf der Ausführungsebene gibt es keine einzige Spezifikation für einen leichten Ausführungsclient. Der Anwendungsbereich eines leichten Ausführungsclients kann ein „leichter Modus“ eines vollständigen Ausführungsclients sein, der über das gesamte EVM und alle Netzwerkfunktionen eines vollständigen Knotens verfügt, jedoch nur die Block Header verifiziert. Es kann jedoch auch ein stärker zerlegter Client sein, der sich stark darauf stützt, Anfragen an einen RPC-Anbieter weiterzuleiten, um mit Ethereum zu interagieren. @@ -32,7 +32,7 @@ Der Hauptvorteil von leichten Clients ist, dass mehr Menschen unabhängigen Zugr Die Möglichkeit, Ethereum-Knoten auf Geräten mit minimalem Speicherplatz, Arbeitsspeicher und Rechenleistung zu betreiben, ist einer der großen Innovationsbereiche, die von leichten Clients ermöglicht werden. Während Ethereum-Knoten heute große Mengen an Rechenressourcen benötigen, könnten leichte Clients in Browser eingebettet werden und auch auf Mobiltelefonen oder kleineren Geräten wie Smart Watches laufen. Das bedeutet, dass Ethereum Wallets mit integrierten Clients auch auf Mobiltelefonen betrieben werden könnten. Das bedeutet, dass mobile Wallets viel dezentraler sein könnten, da sie sich nicht auf einen Datenanbieter für ihre Daten verlassen müssen. -Eine Erweiterung davon ist das Ermöglichen von Geräten mit **Internet der Dinge (Internet of Things, IoT)**. Ein leichter Client könnte verwendet werden, um schnell das Eigentum an einem Token-Guthaben oder einem NFT beweisen zu können. Mit all den Sicherheiten, die Synchronisierungskomitees anbieten, könnten leichte Clients Veränderungen am IoT hervorrufen. Stellen Sie sich einen [Fahrradverleih](https://youtu.be/ZHNrAXf3RDE?t=929) vor, der eine Anwendung mit integriertem leichten Client nutzt, um schnell zu verifizieren, dass Sie ein NFT des Fahrradverleihs besitzen. Dadurch würde ein Fahrrad für Sie entsperrt werden und Sie könnten es nutzen! +Eine Erweiterung davon ist die Unterstützung von **Internet-der-Dinge (IoT)**-Geräten. Ein leichter Client könnte verwendet werden, um schnell das Eigentum an einem Token-Guthaben oder einem NFT beweisen zu können. Mit all den Sicherheiten, die Synchronisierungskomitees anbieten, könnten leichte Clients Veränderungen am IoT hervorrufen. Stellen Sie sich einen [Fahrradverleih](https://youtu.be/ZHNrAXf3RDE?t=929) vor, der eine App mit einem eingebetteten Light-Client nutzt, um schnell zu verifizieren, dass Sie den NFT des Verleihdienstes besitzen und, falls dies der Fall ist, ein Fahrrad für Sie freischaltet, mit dem Sie losfahren können! Ethereum-Rollups würden ebenfalls von leichten Clients profitieren. Eines der großen Probleme für Rollups war, dass es bereits Angriffe auf die Brücken gab, die den Transfer von Anlagen vom Ethereum-Hauptnetz zu einem Rollup erlauben. Eine Schwachstelle sind die Oracles, die Rollups verwenden, um zu erkennen, ob ein Benutzer eine Einzahlung auf die Brücke vorgenommen hat. Wenn ein Oracle falsche Daten einspeist, könnte es dem Rollup vorgaukeln, dass eine Einzahlung auf die Brücke stattgefunden hat, und die Mittel fälschlicherweise freigeben. Ein in das Rollup eingebetteter leichter Client könnte zum Schutz vor korrupten Oracles verwendet werden, da die Einzahlung in die Brücke mit einem Nachweis versehen werden könnte, der vom Rollup vor der Freigabe von Token überprüft werden kann. Das gleiche Konzept könnte auch auf andere Brücken innerhalb der Blockchain angewendet werden. @@ -42,20 +42,20 @@ Leichte Clients könnten auch dazu verwendet werden, Ethereum-Wallets zu aktuali Es befinden sich mehrere leichte Clients in der Entwicklung, darunter Ausführungs-, Konsens- und kombinierte Ausführungs-/Konsens-Light-Clients. Dies sind die Light-Client-Implementierungen, von denen wir zum Zeitpunkt der Erstellung dieser Seite wissen: -- [Lodestar](https://github.com/ChainSafe/lodestar/tree/unstable/packages/light-client): leichter Konsensclient in TypeScript -- [Helios](https://github.com/a16z/helios): kombinierter leichter Ausführungs- und Konsensclient in Rust -- [Geth](https://github.com/ethereum/go-ethereum/tree/master/beacon/light): Light-Modus für Ausführungs-Client (in Entwicklung) in Go -- [Nimbus](https://nimbus.guide/el-light-client.html): Leichter Konsensclient in Nim +- [Lodestar](https://github.com/ChainSafe/lodestar/tree/unstable/packages/light-client): Konsens-Light-Client in TypeScript +- [Helios](https://github.com/a16z/helios): kombinierter Ausführungs- und Konsens-Light-Client in Rust +- [Geth](https://github.com/ethereum/go-ethereum/tree/master/beacon/light): Light-Modus für Ausführungs-Klient (in Entwicklung) in Go +- [Nimbus](https://nimbus.guide/el-light-client.html): Konsens-Light-Client in Nim Unseres Wissens nach ist noch keiner dieser Clients produktionsreif. -Es wird auch intensiv daran gearbeitet, die Art und Weise zu verbessern, wie leichte Clients auf Ethereum-Daten zugreifen können. Derzeit verlassen sich leichte Clients bei RPC-Anfragen an Full Nodes, die ein Client/Server-Modell verwenden. In Zukunft könnten die Daten jedoch auf eine dezentralere Weise angefordert werden, indem ein dediziertes Netzwerk wie das [Portal-Netzwerk](https://www.ethportal.net/) verwendet wird, das die Daten über ein Peer-to-Peer Gossip-Protokoll an leichte Clients weiterleiten könnte. +Es wird auch intensiv daran gearbeitet, die Art und Weise zu verbessern, wie leichte Clients auf Ethereum-Daten zugreifen können. Derzeit sind Light-Clients auf RPC-Anfragen an Full Nodes angewiesen, die ein Client-Server-Modell verwenden. In Zukunft könnten die Daten jedoch dezentraler über ein dediziertes Netzwerk wie das [Portal Network](https://www.ethportal.net/) angefordert werden, welches die Daten über ein Peer-to-Peer-Gossip-Protokoll an Light-Clients bereitstellen könnte. -Andere [Roadmap-Elemente](/roadmap/) wie [Verkle-Bäume](/roadmap/verkle-trees/) und [Zustandslosigkeit](/roadmap/statelessness/) werden schließlich dazu führen, dass die Sicherheitsgarantien von leichten Clients denen von vollständigen Clients entsprechen. +Andere Punkte auf der [Roadmap](/roadmap/) wie [Verkle-Bäume](/roadmap/verkle-trees/) und [Zustandslosigkeit](/roadmap/statelessness/) werden die Sicherheitsgarantien von Light-Clients schließlich denen von vollständigen Clients angleichen. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Zsolt Felfodhi über Geth Light Clients](https://www.youtube.com/watch?v=EPZeFXau-RE) -- [Etan Kissling über die Vernetzung von Light Clients](https://www.youtube.com/watch?v=85MeiMA4dD8) -- [Etan Kissling über Light Clients nach der Zusammenführung](https://www.youtube.com/watch?v=ZHNrAXf3RDE) -- [Piper Merriam: Der beschwerliche Weg zu funktionalen Light Clients](https://snakecharmers.ethereum.org/the-winding-road-to-functional-light-clients/) +- [Zsolt Felfodhi über Geth Light-Clients](https://www.youtube.com/watch?v=EPZeFXau-RE) +- [Etan Kissling über Light-Client-Networking](https://www.youtube.com/watch?v=85MeiMA4dD8) +- [Etan Kissling über Light-Clients nach der Zusammenführung](https://www.youtube.com/watch?v=ZHNrAXf3RDE) +- [Piper Merriam: Der kurvenreiche Weg zu funktionalen Light-Clients](https://snakecharmers.ethereum.org/the-winding-road-to-functional-light-clients/) diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/node-architecture/index.md index ffa51beb8f4..f23525ce622 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/node-architecture/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/node-architecture/index.md @@ -4,23 +4,25 @@ description: Einleitung zum Aufbau von Ethereum-Knoten. lang: de --- -Ein Ethereum-Knoten besteht aus zwei Clients: einem [Ausführungsclient](/developers/docs/nodes-and-clients/#execution-clients) und einem [Konsensclient](/developers/docs/nodes-and-clients/#consensus-clients). +Ein Ethereum-Knoten besteht aus zwei Clients: einem [Ausführungs-Client](/developers/docs/nodes-and-clients/#execution-clients) und einem [Konsens-Client](/developers/docs/nodes-and-clients/#consensus-clients). Damit ein Knoten einen neuen Block vorschlagen kann, muss er auch einen [Validator-Client](#validators) betreiben. -Als Ethereum noch den [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/)-Algorithmus verwendete, war ein Ausführungsclient genug, um einen ganzen Ethereum-Knoten zu betreiben. Seit der Implementierung des [Proof-of-Stake](/developers/docs/consensus-mechanisms/pow/)-Algorithmus, muss der Ausführungsclient jedoch in Verbindung mit einer Software, die [„Konsensclient“](/developers/docs/nodes-and-clients/#consensus-clients) genannt wird, verwendet werden. +Als Ethereum noch [Proof-of-Work](/developers/docs/consensus-mechanisms/pow/) verwendete, reichte ein Ausführungs-Client aus, um einen vollständigen Ethereum-Knoten zu betreiben. Seit der Implementierung von [Proof-of-Stake](/developers/docs/consensus-mechanisms/pow/) muss der Ausführungs-Client jedoch zusammen mit einer anderen Software, einem sogenannten [Konsens-Client](/developers/docs/nodes-and-clients/#consensus-clients), verwendet werden. Das folgende Diagramm zeigt die Verbindung zwischen zwei Ethereum-Clients. Die beiden Clients verbinden sich mit ihren eigenen Peer-to-Peer(P2P)-Netzwerken. Es werden separate P2P-Netzwerke benötigt, da der Ausführungsclient Transaktionen über ihr P2P Netzwerk kommuniziert, wodurch sie ihren lokalen Transaktionspool verwalten können. Konsensclients können dabei Blöcke über ihr eigenes P2P-Netzwerk kommunizieren, was Konsens und Wachstum der Blockchain ermöglicht. ![](node-architecture-text-background.png) -Damit diese Zwei-Client-Struktur funktioniert, müssen Konsensclients in der Lage sein Transaktionsbündel an den Ausführungsclient weiterzuleiten. Dadurch das die Transaktionen lokal ausgeführt werden, kann der Client validieren, dass die Transaktionen keine der Ethereum-Richtlinien verletzen und dass die vorgeschlagene Aktualisierung des Ethereum-Zustands korrekt ist. Wenn der Knoten als Blockerzeuger ausgewählt wird, muss der Konsensclient ebenfalls in der Lage sein, ein Bündel von Transaktionen von Geth anzufragen, damit diese Teil des neuen Blocks werden können. Er muss sie ausführen können, um den globalen Zustand zu aktualisieren. Diese Kommunikation zwischen den Clients wird durch eine lokale RPC-Verbindung unter Verwendung der [Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) verarbeitet. +_Für den Execution Client stehen verschiedene Optionen zur Wahl, einschließlich Erigon, Nethermind und Besu_. + +Für die Funktionsfähigkeit dieser Zwei-Client-Architektur müssen Consensus Clients Transaktionsbündel an den Execution Client übermitteln. Der Execution Client führt Transaktionen lokal aus, um sicherzustellen, dass sie nicht gegen Ethereum-Regeln verstoßen und das vorgeschlagene Update des Zustands korrekt ist. Sobald eine Node zum Block Producer gewählt wird, fragt der Consensus Client beim Execution Client Transaktionsbündel an. Diese werden in den neuen Block integriert und ausgeführt, um den Global State zu aktualisieren. Der Konsens-Client steuert den Ausführungs-Client über eine lokale RPC-Verbindung unter Verwendung der [Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md). ## Was macht der Ausführungsclient? {#execution-client} -Der Ausführungsclient ist für das Verarbeiten von Transaktionen, das Vermitteln von Transaktionen, die Zustandsverwaltung und die Unterstützung der Virtuellen Ethereum-Maschine ([EVM](/developers/docs/evm/)) zuständig. Jedoch ist er **nicht** für das Erstellen von Blöcken, das Vermitteln von Blöcken oder das Verwalten der Konsenslogik zuständig. Dies sind die Aufgaben des Konsensclients. +Der Ausführungs-Client ist für die Validierung, die Abwicklung und das Gossip von Transaktionen sowie für die Zustandsverwaltung und die Unterstützung der Ethereum Virtual Machine ([EVM](/developers/docs/evm/)) verantwortlich. Er ist **nicht** für das Block-Building, das Block-Gossiping oder die Handhabung der Konsens-Logik verantwortlich. Dies sind die Aufgaben des Konsensclients. -Der Ausführungsclient erstellt Ausführungsnutzlasten – die Liste der Transaktionen, die aktualisierten Zustandsbäume, und andere ausführungsbezogene Daten. Konsensclients beinhalten die Ausführungsnutzlast in jedem Block. Der Ausführungsclient ist außerdem zuständig für das Wiederausführen von Transaktionen in einem neuen Block, um sicherzugehen, dass diese gültig sind. Transaktionen werden auf dem Computer, der in den Ausführungsclients integriert ist, ausgeführt, bekannt als die [Virtuelle Ethereum-Maschine (EVM)](/developers/docs/evm). +Der Ausführungsclient erstellt Ausführungsnutzlasten – die Liste der Transaktionen, die aktualisierten Zustandsbäume, und andere ausführungsbezogene Daten. Konsensclients beinhalten die Ausführungsnutzlast in jedem Block. Der Ausführungsclient ist außerdem zuständig für das Wiederausführen von Transaktionen in einem neuen Block, um sicherzugehen, dass diese gültig sind. Die Ausführung von Transaktionen erfolgt auf dem eingebetteten Computer des Ausführungs-Clients, der als [Ethereum Virtual Machine (EVM)](/developers/docs/evm) bekannt ist. -Der Ausführungsclient bietet außerdem eine Nutzeroberfläche für Ethereum über [RPC-Methoden](/developers/docs/apis/json-rpc), die es Nutzern ermöglicht, die Ethereum Blockchain abzufragen und Transaktionen einzuschicken sowie Smart Contracts einzusetzen. Es ist üblich, das RPC-Aufrufe von einer Bibliothek wie [Web3js](https://docs.web3js.org/),[Web3py](https://web3py.readthedocs.io/en/v5/) oder einer Nutzeroberfläche, wie z. B. einer Browser-Wallet verarbeitet werden. +Der Ausführungs-Client bietet auch eine Benutzeroberfläche für Ethereum über [RPC-Methoden](/developers/docs/apis/json-rpc), die es Benutzern ermöglichen, die Ethereum-Blockchain abzufragen, Transaktionen zu übermitteln und Smart Contracts bereitzustellen. Üblicherweise werden RPC-Aufrufe von einer Bibliothek wie [Web3js](https://docs.web3js.org/), [Web3py](https://web3py.readthedocs.io/en/v5/) oder von einer Benutzeroberfläche wie einer Browser-Wallet verarbeitet. Zusammengefasst ist der Ausführungsclient: @@ -35,23 +37,23 @@ Der Konsensclient nimmt nicht an Attestierungen oder dem Vorschlagen von Blöcke ## Validatoren {#validators} -Knotenbetreiber können Validatoren zu ihren Konsensclients hinzufügen, indem sie 32 ETH in den Einzahlungsvertrag einzahlen. Der Validatorclient kommt gebündelt mit dem Konsensclient und kann zu jeder Zeit einem Knoten hinzugefügt werden. Der Validator bearbeitet Attestierungen und Blockvorschläge. Sie ermöglichen einem Knoten, Prämien zu sammeln oder ETH über Strafen oder Slashing zu verlieren. Durch das Betreiben der Validatorensoftware kann ein Knoten ausgewählt werden, um einen neuen Block vorzuschlagen. +Staking und der Betrieb der Validator-Software machen eine Node berechtigt, als Block-Proposer ausgewählt zu werden. Knotenbetreiber können Validatoren zu ihren Konsensclients hinzufügen, indem sie 32 ETH in den Einzahlungsvertrag einzahlen. Der Validatorclient kommt gebündelt mit dem Konsensclient und kann zu jeder Zeit einem Knoten hinzugefügt werden. Der Validator bearbeitet Attestierungen und Blockvorschläge. Außerdem versetzt es eine Node in die Lage, Belohnungen zu erzielen, aber auch ETH durch Strafen oder Slashing einzubüßen. -[Mehr über Staking](/staking/). +[Mehr zum Staking](/staking/). ## Vergleich der Knotenkomponenten {#node-comparison} -| Ausführungsclient | Konsensclient | Validator | -| ------------------------------------------------------- | ------------------------------------------------------------------------------- | -------------------------------------- | -| Übermittelt Transaktionen über sein P2P-Netzwerk | Übermittelt Blöcke und Attestierungen über sein P2P-Netzwerk | Schlägt Blöcke vor | -| Führt Transaktionen (erneut) aus | Betreibt den Abspaltungsalgorithmus | Sammelt Prämien/Strafen | -| Verifiziert eingehende Zustandsänderungen | Verfolgt die Spitze der Blockchain | Stellt Attestierungen aus | -| Verwaltet Zustands- und Belegsbäume | Verwaltet den Beacon-Zustand (beinhaltet Konsens- und Ausführungsinformationen) | Benötigt 32 ETH, um gestaked zu werden | -| Erzeugt Ausführungsnutzlast | Behält Überblick über die gesammelte Zufälligkeit in RANDAO | Kann „abgeschlagen“ (geslashed) werden | -| Deckt JSON-RPC API auf, um mit Ethereum zu interagieren | Behält den Überblick über Begründung und Finalisierung | | +| Ausführungsclient | Konsensclient | Validator | +| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | +| Verbreitet Transaktionen mittels Gossip über sein P2P-Netzwerk | Verbreitet Blöcke und Attestations über das eigene P2P-Netzwerk | Schlägt Blöcke vor | +| Führt Transaktionen (erneut) aus | Betreibt den Abspaltungsalgorithmus | Sammelt Prämien/Strafen | +| Verifiziert eingehende Zustandsänderungen | Verfolgt die Spitze der Blockchain | Stellt Attestierungen aus | +| Verwaltet Zustands- und Belegsbäume | Verwaltet den Beacon-Zustand (beinhaltet Konsens- und Ausführungsinformationen) | Benötigt 32 ETH, um gestaked zu werden | +| Erzeugt Ausführungsnutzlast | Überwacht den angesammelten Zufall in RANDAO (ein Algorithmus, der verifizierbaren Zufall für die Auswahl von Validatoren und weitere Konsens-Vorgänge liefert) | Kann „abgeschlagen“ (geslashed) werden | +| Deckt JSON-RPC API auf, um mit Ethereum zu interagieren | Behält den Überblick über Begründung und Finalisierung | | -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos) - [Block-Vorschlag](/developers/docs/consensus-mechanisms/pos/block-proposal) -- [Prämien und Strafen für Validatoren](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) +- [Belohnungen und Strafen für Validatoren](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 73d68f2c4ba..194988608b5 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -7,17 +7,17 @@ sidebarDepth: 2 ## Einführung {#Introduction} -Ihren eigenen [Ethereum-Node](/developers/docs/nodes-and-clients/#what-are-nodes-and-clients) zu betreiben, kann eine Herausforderung sein, vor allem wenn Sie gerade beginnen oder beim schnellen Skalieren. Es gibt eine [Anzahl von Diensten](#popular-node-services), die optimierte Node-Infrastrukturen für Sie ausführen, damit Sie sich stattdessen auf die Entwicklung Ihrer Anwendung oder Ihres Produkts konzentrieren können. Wir erklären Ihnen, wie Node-Dienste funktionieren, welche Vor- und Nachteile sie haben und listen Anbieter auf, falls Sie anfangen möchten, sie zu verwenden. +Das Betreiben eines eigenen [Ethereum-Nodes](/developers/docs/nodes-and-clients/#what-are-nodes-and-clients) kann eine Herausforderung sein, insbesondere beim Einstieg oder bei einer schnellen Skalierung. Es gibt eine [Reihe von Diensten](#popular-node-services), die für Sie optimierte Node-Infrastrukturen betreiben, sodass Sie sich stattdessen auf die Entwicklung Ihrer Anwendung oder Ihres Produkts konzentrieren können. Wir erklären Ihnen, wie Node-Dienste funktionieren, welche Vor- und Nachteile sie haben und listen Anbieter auf, falls Sie anfangen möchten, sie zu verwenden. ## Voraussetzungen {#prerequisites} -Wenn Sie noch nicht wissen, was Nodes und Clients sind, lesen Sie [Nodes und Clients](/developers/docs/nodes-and-clients/). +Wenn Sie noch nicht wissen, was Nodes und Clients sind, schauen Sie sich [Nodes und Clients](/developers/docs/nodes-and-clients/) an. ## Staker {#stakoooooooooooooors} -Solo-Staker müssen ihre eigene Infrastruktur betreiben, anstatt sich auf Drittanbieter zu verlassen. Das bedeutet, dass ein Ausführungsclient zusammen mit einem Konsensclient betrieben wird. Vor [der Zusammenführung](/roadmap/merge) war es möglich, nur einen Konsensclient zu betreiben und einen zentralisierten Anbieter für Ausführungsdaten zu verwenden; das ist jetzt nicht mehr möglich – ein Solo-Staker muss beide Clients betreiben. Es gibt jedoch Dienste, die diesen Prozess erleichtern können. +Solo-Staker müssen ihre eigene Infrastruktur betreiben, anstatt sich auf Drittanbieter zu verlassen. Das bedeutet, dass ein Ausführungsclient zusammen mit einem Konsensclient betrieben wird. Vor [The Merge](/roadmap/merge) war es möglich, nur einen Konsens-Client zu betreiben und einen zentralisierten Anbieter für Ausführungsdaten zu nutzen. Dies ist nicht mehr möglich – ein Solo-Staker muss beide Clients betreiben. Es gibt jedoch Dienste, die diesen Prozess erleichtern können. -[Lesen Sie mehr über das Betreiben eines Nodes](/developers/docs/nodes-and-clients/run-a-node/). +[Erfahren Sie mehr über das Betreiben eines Nodes](/developers/docs/nodes-and-clients/run-a-node/). Die auf dieser Seite beschriebenen Dienste gelten für Nicht-Staking-Nodes. @@ -25,34 +25,34 @@ Die auf dieser Seite beschriebenen Dienste gelten für Nicht-Staking-Nodes. Node-Dienste betreiben im Hintergrund dezentralisierte Node-Clients für Sie, so dass Sie sich nicht darum kümmern müssen. -Diese Dienste bieten in der Regel einen API-Schlüssel an, den Sie verwenden können, um in der Blockchain zu schreiben und zu lesen. Sie beinhalten oft den Zugriff auf [Ethereum-Testnetze](/developers/docs/networks/#ethereum-testnets) zusätzlich zum Mainnet. +Diese Dienste bieten in der Regel einen API-Schlüssel an, den Sie verwenden können, um in der Blockchain zu schreiben und zu lesen. Sie bieten oft zusätzlich zum Mainnet auch Zugang zu [Ethereum-Testnets](/developers/docs/networks/#ethereum-testnets). Einige Dienste bieten Ihnen ihren eigenen speziellen Node, den sie für Sie verwalten, während andere Load Balancer nutzen, um die Aktivität auf mehrere Nodes zu verteilen. Fast alle Node-Dienste sind extrem einfach mit einer Zeilenänderung in Ihren Code zu integrieren, um Ihren selbst gehosteten Node auszutauschen oder sogar zwischen den Diensten selbst zu wechseln. -Oft laufen Node-Dienste mit einer Vielzahl von [Node-Clients](/developers/docs/nodes-and-clients/#execution-clients) und [Typen](/developers/docs/nodes-and-clients/#node-types), so dass Sie in einer API zusätzlich zu Client-spezifischen Methoden auf Voll- und Archivierungsnodes zugreifen können. +Node-Dienste betreiben oft eine Vielzahl von [Node-Clients](/developers/docs/nodes-and-clients/#execution-clients) und [-Typen](/developers/docs/nodes-and-clients/#node-types), sodass Sie über eine einzige API auf Full- und Archive-Nodes sowie auf clientspezifische Methoden zugreifen können. Es ist wichtig zu beachten, dass Node-Dienste keinesfalls Ihre privaten Schlüssel oder Informationen speichern können und sollten. -## Was sind die Vorteile bei der Verwendung eines Node-Dienstes? {#benefits-of-using-a-node-service} +## Was sind die Vorteile bei der Verwendung eines Node-Dienstes? Vorteile der Nutzung eines Node-Dienstes {#benefits-of-using-a-node-service} Der Hauptvorteil bei der Nutzung eines Node-Dienstes besteht darin, dass keine Entwicklungszeit benötigt wird, um die Nodes selbst warten und zu verwalten. So können Sie sich auf den Aufbau Ihres Produkts konzentrieren, anstatt sich um die Wartung der Infrastruktur kümmern zu müssen. Der Betrieb eigener Nodes kann sehr kostspielig sein, vom Speicherplatz über die Bandbreite bis hin zu wertvoller Entwicklungszeit. Dinge wie das Starten weiterer Nodes bei der Skalierung, das Aufrüsten von Nodes auf die neueste Version und die Sicherstellung der Zustandskonsistenz können von der Entwicklung und dem Einsatz von Ressourcen für Ihr gewünschtes Web3-Produkt ablenken. -## Was sind die Nachteile eines Node-Dienstes? {#cons-of-using-a-node-service} +## Was sind die Nachteile eines Node-Dienstes? Nachteile der Nutzung eines Node-Dienstes {#cons-of-using-a-node-service} Durch den Einsatz eines Node-Dienstes zentralisieren Sie den Infrastrukturaspekt Ihres Produkts. Aus diesem Grund bevorzugen Projekte, für die Dezentralisierung die oberste Priorität hat, eher selbst bereitgestellte Nodes gegenüber Outsourcing an Dritte. -Erfahren Sie mehr über die [Vorteile des Betriebs Ihres eigenen Nodes](/developers/docs/nodes-and-clients/#benefits-to-you). +Lesen Sie mehr über die [Vorteile des Betreibens eines eigenen Nodes](/developers/docs/nodes-and-clients/#benefits-to-you). ## Beliebte Node-Dienste {#popular-node-services} Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neue hinzu, die noch fehlen! Jeder Node-Dienst bietet zusätzlich zu kostenlosen oder bezahlten Stufen verschiedene Vorteile und Funktionen. Bevor Sie sich entscheiden, sollten Sie prüfen, welcher am besten zu Ihren Bedürfnissen passt. - [**Alchemy**](https://alchemy.com/) - - [Dokumentation](https://docs.alchemyapi.io/) + - [Doku](https://www.alchemy.com/docs/) - Eigenschaften - Die größte kostenlose Stufe bietet 300 Millionen Recheneinheiten pro Monat (ca. 30 Millionen getLatestBlock-Anfragen) - Multichain-Unterstützung für Polygon, Starknet, Optimism, Arbitrum @@ -64,8 +64,21 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Integrierter Testnetz-Faucet-Zugang - Aktive Discord-Entwicklergemeinschaft mit 18.000 Nutzern -- [**All diese Nodes**](https://allthatnode.com/) - - [Dokumentation](https://docs.allthatnode.com/) +- [**Allnodes**](https://www.allnodes.com/) + - [Doku](https://docs.allnodes.com/) + - Eigenschaften + - Ein auf der Allnodes-Portfolio-Seite erstellter PublicNode-Token unterliegt keiner Ratenbegrenzung. + - Auf den Datenschutz ausgerichtete, kostenlose RPC-Endpunkte (100+ Blockchains) auf [PublicNode](https://www.publicnode.com) + - Deine eigenen dedizierten Nodes für über 90 Blockchains ohne Ratenbegrenzung + - Voller Zugriff auf dedizierte Archive Nodes für über 30 Blockchains + - Verfügbar in 3 Regionen (USA, EU, Asien) + - Snapshots für 100+ Blockchains auf [PublicNode](https://www.publicnode.com/snapshots) + - 24/7-Support & 99,90%-99.98% Uptime-SLA (planabhängig). + - Bezahlung pro Stunde + - Zahlung per Kreditkarte, PayPal oder Krypto + +- [**All That Node**](https://allthatnode.com/) + - [Doku](https://docs.allthatnode.com/) - Eigenschaften - 50,000 Anfragen pro Tag mit kostenloser Variante - Unterstützung für über 40 Protokolle @@ -78,7 +91,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Automatisierte Updates - [**Amazon Managed Blockchain**](https://aws.amazon.com/managed-blockchain/) - - [Dokumentation](https://aws.amazon.com/managed-blockchain/resources/) + - [Doku](https://aws.amazon.com/managed-blockchain/resources/) - Eigenschaften - Vollständig verwaltete Ethereum-Nodes - Verfügbar in sechs Regionen @@ -88,7 +101,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Go-Ethereum und Lighthouse - [**Ankr**](https://www.ankr.com/) - - [Dokumentation](https://docs.ankr.com/) + - [Doku](https://docs.ankr.com/) - Eigenschaften - Ankr-Protokoll – offener Zugang zu öffentlichen RPC-API-Endpunkten für über 8 Chains - Lastausgleich und Überwachung der Node-Sicherheit für ein schnelles und zuverlässiges Gateway zum nächstgelegenen verfügbaren Node @@ -101,7 +114,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Direkter Support - [**Blast**](https://blastapi.io/) - - [Dokumentation](https://docs.blastapi.io/) + - [Doku](https://docs.blastapi.io/) - Eigenschaften - Support für RPC und WSS - Hosting von Nodes in mehreren Regionen @@ -116,26 +129,26 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Mit Kryptowährungen bezahlen - [**BlockDaemon**](https://blockdaemon.com/) - - [Dokumentation](https://ubiquity.docs.blockdaemon.com/) + - [Doku](https://ubiquity.docs.blockdaemon.com/) - Vorteile - Dashboard - Pro-Node-Basis - Analysen - [**BlockPI**](https://blockpi.io/) - - [Dokumentation](https://docs.blockpi.io/) + - [Doku](https://docs.blockpi.io/) - Eigenschaften - - Robuste & verteilte Node-Struktur + - Robuste und verteilte Node-Struktur - Bis zu 40 HTTPS- und WSS-Endpunkte - Kostenloses Anmeldepaket und monatliches Paket - Support für Trace-Methode und Archivdaten - Pakete mit einer Gültigkeit von bis zu 90 Tagen - Individueller Plan und Zahlung nach Verbrauch (Pay-as-you-go) - Mit Kryptowährungen bezahlen - - Direkte Unterstützung & technischer Support + - Direkter Support & Technischer Support - [**Chainbase**](https://www.chainbase.com/) - - [Dokumentation](https://docs.chainbase.com) + - [Doku](https://docs.chainbase.com) - Eigenschaften - Hochverfügbarer, schneller und skalierbarer RPC-Dienst - Unterstützung für mehrere Blockchains @@ -144,11 +157,11 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Bietet Blockchain-Datendienste über RPC hinaus - [**Chainstack**](https://chainstack.com/) - - [Dokumentation](https://docs.chainstack.com/) + - [Doku](https://docs.chainstack.com/) - Eigenschaften - Kostenloses Teilen von Nodes - Gemeinsam genutzte Archiv-Nodes - - GraphQL-Support + - GraphQL Support - RPC- und WSS-Endpunkte - Speziielle Voll- und Archiv-Nodes - Schnelle Synchronisierungszeit für gezielte Einsätze @@ -156,23 +169,23 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Bezahlung pro Stunde - Direkter Support rund um die Uhr -- [**DRPC**](https://drpc.org/) - - [Dokumentation](https://docs.drpc.org/) - - Eigenschaften - - Dezentralisierte RPC-Nodes - - Mehr als 15 Node-Anbieter - - Node-Ausgleich - - Unbegrenzte Anzahl an Recheneinheiten pro Monat in der kostenlosen Stufe - - Datenverifizierung - - Individuelle Endpunkte - - HTTP- und WSS-Endpunkte - - Unbegrenzte Schlüssel (kostenlose oder kostenpflichtige Stufen) - - Flexible Ausweichoptionen - - [Öffentlicher Endpunkt](https://eth.drpc.org) - - Kostenlose gemeinsam genutzte Archiv-Nodes +- [**dRPC**](https://drpc.org/) + - [Doku](https://drpc.org/docs) + - NodeCloud: Plug-and-Play-RPC-Infrastruktur ab 10 $ (USD) – volle Geschwindigkeit, keine Limits + - NodeCloud-Funktionen: + - API-Unterstützung für 185 Netzwerke + - Verteilter Pool von über 40 Anbietern + - Globale Abdeckung mit neun (9) Geo-Clustern + - KI-gestütztes Lastverteilungssystem + - Nutzungsbasierte Pauschalpreise – keine Preiserhöhungen, kein Verfall, keine Anbieterbindung + - Unbegrenzte Schlüssel, granulare Schlüsselanpassungen, Teamrollen, Frontend-Schutz + - Methodenpauschale von 20 Recheneinheiten (CUs) pro Methode + - [Chainlist öffentlicher Endpunkte](https://drpc.org/chainlist) + - [Preisrechner](https://drpc.org/pricing#calculator) + - NodeCore: Open-Source-Stack für Organisationen, die volle Kontrolle wünschen - [**GetBlock**](https://getblock.io/) - - [Dokumentation](https://getblock.io/docs/get-started/authentication-with-api-key/) + - [Doku](https://getblock.io/docs/get-started/authentication-with-api-key/) - Eigenschaften - Zugang zu über 40 Blockchain-Knoten - 40.000 kostenlose und tägliche Anfragen @@ -196,7 +209,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Zugang zu mehr als 50 Blockchain-Nodes - [**Infura**](https://infura.io/) - - [Dokumentation](https://infura.io/docs) + - [Doku](https://infura.io/docs) - Eigenschaften - Option für kostenlose Stufe - Skalierung nach Bedarf @@ -205,7 +218,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Dashboard - [**Kaleido**](https://kaleido.io/) - - [Dokumentation](https://docs.kaleido.io/) + - [Doku](https://docs.kaleido.io/) - Eigenschaften - Kostenlose Starter-Stufe - Bereitstellung von Ethereum-Nodes mit einem Klick @@ -213,21 +226,21 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Mehr als 500 Verwaltungs- und Service-APIs - RESTful-Schnittstelle für die Übermittlung von Ethereum-Transaktionen (unterstützt von Apache Kafka) - Ausgehende Streams für die Zustellung von Ereignissen (unterstützt von Apache Kafka) - - Umfassende Sammlung von „Off-Chain“- und Zusatzdiensten (z. B. bilateraler verschlüsselter Nachrichtenverkehr) + - Umfangreiche Sammlung von "Offchain"- und Zusatzdiensten (z. B. bilateraler verschlüsselter Nachrichtentransport) - Unkompliziertes Netzwerk-Onboarding mit Governance und rollenbasierter Zugriffskontrolle - Ausgefeilte Benutzerverwaltung für Administratoren und Endbenutzer - Hochgradig skalierbare, belastbare, unternehmensgerechte Infrastruktur - Verwaltung privater HSM-Schlüssel in der Cloud - Ethereum Mainnet-Tethering - ISO 27000 und SOC 2, Typ-2-Zertifizierungen - - Dynamische Laufzeitkonfiguration (z. B. Hinzufügen von Cloud-Integrationen, Änderung von Knoteneingängen usw.) + - Dynamische Laufzeitkonfiguration (z. B. Hinzufügen von Cloud-Integrationen, Ändern von Node-Ingresses usw.) - Unterstützung für Orchestrierungen von Multi-Cloud-, Multi-Region- und Hybrid-Bereitstellungen - Einfache SaaS-Preise auf Stundenbasis - SLA- und 24/7-Support - [**Lava Network**](https://www.lavanet.xyz/) - - [Dokumentation](https://docs.lavanet.xyz/) - - Features + - [Doku](https://docs.lavanet.xyz/) + - Eigenschaften - Kostenlose Testnetz-Nutzung - Dezentrale Redundanz für hohe Verfügbarkeit - Open-Source @@ -238,7 +251,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Unterstützung für mehrere Blockchains - [**Moralis**](https://moralis.io/) - - [Dokumente](https://docs.moralis.io/) + - [Doku](https://docs.moralis.io/) - Eigenschaften - Kostenloses Teilen von Nodes - Kostenlose gemeinsam genutzte Archiv-Nodes @@ -251,7 +264,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Direkter, technischer Support - [**NodeReal MegaNode**](https://nodereal.io/) - - [Dokumente](https://docs.nodereal.io/docs/introduction) + - [Doku](https://docs.nodereal.io/docs/introduction) - Eigenschaften - Zuverlässige, schnelle und skalierbare RPC-API-Services - Verbesserte API für Web3-Entwickler @@ -259,7 +272,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Kostenloser Einstieg - [**NOWNodes**](https://nownodes.io/) - - [Dokumente](https://documenter.getpostman.com/view/13630829/TVmFkLwy) + - [Doku](https://documenter.getpostman.com/view/13630829/TVmFkLwy) - Eigenschaften - Zugang zu mehr als 50 Blockchain-Nodes - Kostenloser API-Schlüssel @@ -270,7 +283,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Geteilte, archivierte, Backup- und Spezial-Nodes - [**Pocket Network**](https://www.pokt.network/) - - [Dokumente](https://docs.pokt.network/home/) + - [Doku](https://docs.pokt.network/home/) - Eigenschaften - Dezentrales RPC-Protokoll und Marktplatz - 1 Mio. Anfragen pro Tag für kostenlose Stufen (pro Endpunkt, max. 2) @@ -278,7 +291,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Pre-Stake+-Programm (wenn Sie mehr als 1 Mio. Anfragen pro Tag benötigen) - Support für mehr als 15 Blockchains - Über 6400 Nodes verdienen POKT für die Bedienung von Anwendungen - - Archivierungsnodes, Archivierungsnodes mit Rückverfolgung & Support für Testnetz-Node + - Archiv-Node, Archiv-Node mit Tracing & Unterstützung für Testnet-Nodes - Client-Diversität für Ethereum Mainnet Node - Kein einzelner Ausfallpunkt - Keine Ausfallzeit @@ -288,15 +301,15 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Unendliche Skalierung der Anzahl von Anfragen pro Tag und der Nodes pro Stunde nach Bedarf - Die Option für höchste Privatsphäre und Zensurresistenz - Praktische Unterstützung für Entwickler - - [Pocket Portal](https://bit.ly/ETHorg_POKTportal)-Dashboard und Analysen + - [Pocket Portal](https://bit.ly/ETHorg_POKTportal) Dashboard und Analysen - [**QuickNode**](https://www.quicknode.com) - - [Dokumente](https://www.quicknode.com/docs/) + - [Doku](https://www.quicknode.com/docs/) - Eigenschaften - - Technischer Support rund um die Uhr & Discord-Community für Entwickler + - Technischer Support rund um die Uhr & Entwickler-Discord-Community - Geobalanciertes, Multi-Cloud/Metal-unterstütztes Netzwerk mit geringer Latenz - Unterstützung für mehrere Blockchains (Optimism, Arbitrum, Polygon + 11 weitere) - - Mittelebenen für Geschwindigkeit & Stabilität (Anrufweiterleitung, Cache, Indizierung) + - Zwischenschichten für Geschwindigkeit und Stabilität (Anfragen-Routing, Cache, Indizierung) - Smart Contract-Überwachung über Webhooks - Intuitives Dashboard, Analysesuite, RPC-Composer - Erweiterte Sicherheitsfunktionen (JWT, Maskierung, Whitelisting) @@ -305,13 +318,13 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Geeignet für Entwickler und Unternehmen - [**Rivet**](https://rivet.cloud/) - - [Dokumente](https://rivet.readthedocs.io/en/latest/) + - [Doku](https://rivet.readthedocs.io/en/latest/) - Eigenschaften - Option für kostenlose Stufe - Skalierung nach Bedarf - [**SenseiNode**](https://senseinode.com) - - [Dokumente](https://docs.senseinode.com/) + - [Doku](https://docs.senseinode.com/) - Eigenschaften - Spezielle und gemeinsam genutzte Nodes - Dashboard @@ -319,11 +332,11 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Prysm- und Lighthouse-Clients - [**SettleMint**](https://console.settlemint.com/) - - [Dokumente](https://docs.settlemint.com/) + - [Doku](https://docs.settlemint.com/) - Eigenschaften - Kostenlose Testphase - Skalierung nach Bedarf - - GraphQL-Support + - GraphQL Support - RPC- und WSS-Endpunkte - Dedizierte vollständige Nodes - Bringen Sie Ihre Cloud mit @@ -333,7 +346,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Direkter Support - [**Tenderly**](https://tenderly.co/web3-gateway) - - [Dokumente](https://docs.tenderly.co/web3-gateway/web3-gateway) + - [Doku](https://docs.tenderly.co/web3-gateway/web3-gateway) - Eigenschaften - Kostenlose Stufe einschließlich 25 Millionen Tenderly-Einheiten pro Monat - Kostenloser Zugang zu historischen Daten @@ -348,9 +361,9 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Dedizierter technischer Support per Chat, E-Mail und Discord - [**Tokenview**](https://services.tokenview.io/) - - [Dokumente](https://services.tokenview.io/docs?type=nodeService) + - [Doku](https://services.tokenview.io/docs?type=nodeService) - Eigenschaften - - Technische Unterstützung rund um die Uhr & Dev Telegram APP-Community + - Technischer Support rund um die Uhr & Entwickler-Telegram-Community - Multichain-Unterstützung (Bitcoin, Ethereum, Tron, BNB Smart Chain, Ethereum Classic) - Sowohl RPC- als auch WSS-Endpunkte können verwendet werden - Unbegrenzter Zugang zur Archivdaten-API @@ -360,7 +373,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Externe Unterstützung für zusätzliche Verhaltenskriterien - [**Watchdata**](https://watchdata.io/) - - [Dokumente](https://docs.watchdata.io/) + - [Doku](https://docs.watchdata.io/) - Eigenschaften - Zuverlässigkeit der Daten - Ununterbrochene Verbindung ohne Ausfallzeiten @@ -372,7 +385,7 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Hohe Verarbeitungsgeschwindigkeit - [**ZMOK**](https://zmok.io/) - - [Dokumente](https://docs.zmok.io/) + - [Doku](https://docs.zmok.io/) - Eigenschaften - Front-Running als Service - Globale Transaktions-Mempool mit Such- und Filtermethoden @@ -381,26 +394,25 @@ Hier ist eine Liste der beliebtesten Ethereum-Nodeanbieter. Fügen Sie gerne neu - Die beste Preisgarantie pro API-Aufruf - [**Zeeve**](https://www.zeeve.io/) - - [Dokumente](https://www.zeeve.io/docs/) + - [Doku](https://www.zeeve.io/docs/) - Eigenschaften - No-Code-Automatisierungsplattform auf Unternehmensebene, die die Bereitstellung, Überwachung und Verwaltung von Blockchain-Knoten und -Netzwerken ermöglicht - - Mind. 30 unterstützte Protokolle und Integrationen, mit der Möglichkeit weitere hinzuzufügen + - Über 30 unterstützte Protokolle & Integrationen, und es werden immer mehr - Wertsteigernde Web3-Infrastrukturdienste wie dezentraler Speicher, dezentrale Identität und Blockchain-Ledger-Daten-APIs für reale Anwendungsfälle - Support und proaktives Monitoring rund um die Uhr stellen die Sicherheit der Knoten zu jeder Zeit sicher. - RPC-Endpunkte bieten authentifizierten Zugriff auf APIs, eine unkomplizierte Verwaltung mit einem intuitiven Dashboard und Analysen. - Bietet sowohl Optionen für verwaltete Clouds und Nutzung der eigenen Cloud und Support für die wichtigsten Cloud-Anbieter wie AWS, Azure, Google Cloud, Digital Ocean andere lokale Anbieter. - Wir verwenden intelligentes Routing, um bei jeder Anfrage den dem Benutzer am nächsten gelegenen Knoten anzusteuern +## Weiterführende Lektüre {#further-reading} -## Weiterführende Informationen {#further-reading} - -- [Liste der Ethereum-Knotendienste](https://ethereumnodes.com/) +- [Liste von Ethereum-Node-Diensten](https://ethereumnodes.com/) ## Verwandte Themen {#related-topics} -- [Knotenpunkte und Clients](/developers/docs/nodes-and-clients/) +- [Nodes und Clients](/developers/docs/nodes-and-clients/) ## Verwandte Tutorials {#related-tutorials} - [Erste Schritte in der Ethereum-Entwicklung mit Alchemy](/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/) -- [Leitfaden zum Versenden von Transaktionen über web3 und Alchemy](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) +- [Anleitung zum Senden von Transaktionen mit Web3 und Alchemy](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md index b81554a688c..d936d7faf20 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/run-a-node/index.md @@ -7,35 +7,36 @@ sidebarDepth: 2 Der Betrieb eines eigenen Nodes bietet Ihnen verschiedene Vorteile, eröffnet neue Möglichkeiten und trägt zur Unterstützung des Ökosystems bei. Diese Seite führt Sie durch die Einrichtung Ihres eigenen Nodes und die Teilnahme an der Validierung von Ethereum-Transaktionen. -Bitte beachten Sie, dass seit [der Zusammenführung](/roadmap/merge) zwei Clients erforderlich sind, um einen Ethereum-Knoten zu betreiben; ein Client auf **Ausführungsebene (EL)** und ein Client auf **Konsensebene (CL)**. Auf dieser Seite zeigen wir Ihnen die Installation, Konfiguration und Verbindung dieser beiden Clients, um einen Ethereum-Knoten zu betreiben. +Beachten Sie, dass nach [The Merge](/roadmap/merge) zwei Clients erforderlich sind, um einen Ethereum-Node zu betreiben; ein Client für die **Ausführungsebene (EL)** und ein Client für die **Konsensebene (CL)**. Auf dieser Seite zeigen wir Ihnen die Installation, Konfiguration und Verbindung dieser beiden Clients, um einen Ethereum-Knoten zu betreiben. ## Voraussetzungen {#prerequisites} -Sie sollten verstehen, was ein Ethereum-Knoten ist und warum Sie ggf. einen Client betreiben sollten. Dieses Thema wird unter [Nodes und Clients](/developers/docs/nodes-and-clients/) behandelt. +Sie sollten verstehen, was ein Ethereum-Knoten ist und warum Sie ggf. einen Client betreiben sollten. Dies wird unter [Nodes und Clients](/developers/docs/nodes-and-clients/) behandelt. -Wenn das Thema neu für Sie ist oder Sie nach einem weniger technischen Weg suchen, empfehlen wir Ihnen, zunächst unsere benutzerfreundliche Einführung zum [Betrieb eines Ethereum-Knotens](/run-a-node) zu lesen. +Wenn das Thema für Sie neu ist oder Sie nach einem weniger technischen Weg suchen, empfehlen wir Ihnen, sich zuerst unsere benutzerfreundliche Einführung zum Thema [Betrieb eines Ethereum-Nodes](/run-a-node) anzusehen. -## Herangehensweise bestimmen {#choosing-approach} +## Wahl eines Ansatzes {#choosing-approach} Der erste Schritt beim Einrichten Ihres Knotens besteht in der Wahl der Herangehensweise. Auf der Grundlage der Anforderungen und der verschiedenen Möglichkeiten müssen Sie die Client-Implementierung (sowohl für Ausführungs- als auch für Konsensclients), die Umgebung (Hardware, System) und die Parameter für die Client-Einstellungen auswählen. Diese Seite wird Sie dabei unterstützen, diese Entscheidungen zu treffen und die am besten geeignete Methode für den Betrieb Ihrer Ethereum-Instanz zu finden. -Um aus Client-Implementierungen auszuwählen, sehen Sie sich alle verfügbaren Mainnet-fähigen [Ausführungsclients](/developers/docs/nodes-and-clients/#execution-clients), [Konsensclients](/developers/docs/nodes-and-clients/#consensus-clients) an und erfahren Sie mehr über [Client-Vielfalt](/developers/docs/nodes-and-clients/client-diversity). +Um aus den Client-Implementierungen zu wählen, sehen Sie sich alle verfügbaren Mainnet-fähigen [Ausführungs-Clients](/developers/docs/nodes-and-clients/#execution-clients) und [Konsens-Clients](/developers/docs/nodes-and-clients/#consensus-clients) an und erfahren Sie mehr über [Client-Diversität](/developers/docs/nodes-and-clients/client-diversity). -Entscheiden Sie, ob Sie die Software auf Ihrer eigenen [Hardware oder in der Cloud](#local-vs-cloud) betreiben möchten und berücksichtigen Sie dabei die [Anforderungen](#Anforderungen) des Clients. +Entscheiden Sie, ob Sie die Software auf Ihrer eigenen [Hardware oder in der Cloud](#local-vs-cloud) ausführen möchten, und berücksichtigen Sie dabei die [Anforderungen](#requirements) der Clients. -Nachdem Sie die Umgebung vorbereitet haben, installieren Sie die ausgewählten Clients entweder mit der[einsteigerfreundlichen Schnittstelle](#automatized-setup) oder [manuell](#manual-setup) über ein Terminal mit erweiterten Optionen. +Nachdem Sie die Umgebung vorbereitet haben, installieren Sie die ausgewählten Clients entweder über eine [einsteigerfreundliche Oberfläche](#automatized-setup) oder [manuell](#manual-setup) über ein Terminal mit erweiterten Optionen. -Wenn Ihr Knoten ausgeführt wird und synchronisiert ist, können Sie diesen [nutzen](#benutzen-den-node), Sie sollten jedoch die [Wartung](#betreiben-den-node) im Auge behalten. +Wenn der Node läuft und synchronisiert, sind Sie bereit, ihn zu [verwenden](#using-the-node), aber achten Sie darauf, seine [Wartung](#operating-the-node) im Auge zu behalten. -![Client-Setup](./diagram.png) +![Client-Einrichtung](./diagram.png) ### Umgebung und Hardware {#environment-and-hardware} #### Lokal oder Cloud {#local-vs-cloud} -Ethereum-Clients können auf gewöhnlichen Heim-Computern ausgeführt werden und benötigen keine spezielle Hardware, wie z. B. Mining-Maschinen. Sie haben also verschiedene Möglichkeiten, den Knoten je nach Ihren Bedürfnissen zu betreiben. Zur Vereinfachung stellen wir uns vor, dass ein Knoten sowohl auf einem lokalen physischen Computer als auch auf einem Cloud-Server ausgeführt werden kann: +Ethereum-Clients können auf gewöhnlichen Heim-Computern ausgeführt werden und benötigen keine spezielle Hardware, wie z. B. Mining-Maschinen. Sie haben also verschiedene Möglichkeiten, den Knoten je nach Ihren Bedürfnissen zu betreiben. +Zur Vereinfachung stellen wir uns vor, dass ein Knoten sowohl auf einem lokalen physischen Computer als auch auf einem Cloud-Server ausgeführt werden kann: - Cloud - Anbieter bieten eine hohe Serververfügbarkeit und statische öffentliche IP-Adressen @@ -48,27 +49,27 @@ Ethereum-Clients können auf gewöhnlichen Heim-Computern ausgeführt werden und - Option zum Kauf vorkonfigurierter Maschinen - Sie müssen den Rechner und das Netzwerk technisch vorbereiten, warten und möglicherweise Fehler beheben -Beide Optionen haben verschiedene Vorteile, die oben zusammengefasst sind. Wenn Sie eine Cloud-Lösung suchen, gibt es neben vielen traditionellen Cloud-Computing-Anbietern auch Dienste, die sich auf die Bereitstellung von Knoten konzentrieren. Unter [Nodes als Dienste](/developers/docs/nodes-and-clients/nodes-as-a-service/) finden Sie weitere Optionen für gehostete Nodes. +Beide Optionen haben verschiedene Vorteile, die oben zusammengefasst sind. Wenn Sie eine Cloud-Lösung suchen, gibt es neben vielen traditionellen Cloud-Computing-Anbietern auch Dienste, die sich auf die Bereitstellung von Knoten konzentrieren. Weitere Optionen für gehostete Nodes finden Sie unter [Nodes as a Service](/developers/docs/nodes-and-clients/nodes-as-a-service/). #### Hardware {#hardware} -Ein zensurresistentes, dezentrales Netz sollte sich jedoch nicht auf Cloud-Anbieter verlassen. Stattdessen ist es für das Ökosystem gesünder, wenn Sie Ihren Node auf Ihrer eigenen lokalen Hardware betreiben. [Schätzungen](https://www.ethernodes.org/network-types) zeigen, dass ein großer Teil der Knoten in der Cloud betrieben werden, was zu einer einzelnen Fehlerquelle führen kann. +Ein zensurresistentes, dezentrales Netz sollte sich jedoch nicht auf Cloudanbieter verlassen. Stattdessen ist es für das Ökosystem gesünder, wenn Sie Ihren Node auf Ihrer eigenen lokalen Hardware betreiben. [Schätzungen](https://www.ethernodes.org/networkType/cl/Hosting) zeigen, dass ein großer Teil der Nodes in der Cloud betrieben wird, was zu einem Single Point of Failure werden könnte. Ethereum-Clients können auf Ihrem Computer, Laptop, Server oder sogar auf einem Einplatinencomputer ausgeführt werden. Es ist zwar möglich, Clients auf Ihrem Heimcomputer auszuführen, jedoch kann ein eigens für Ihren Knoten eingerichteter Rechner dessen Leistung und Sicherheit erheblich verbessern und gleichzeitig die Auswirkungen auf Ihren primären Computer minimieren. Die Verwendung Ihrer eigenen Hardware kann sehr einfach sein. Es gibt viele einfache Optionen, aber auch fortgeschrittene Einstellungen für technisch versierte Personen. Schauen wir uns also die Voraussetzungen und Mittel für die Ausführung von Ethereum-Clients auf Ihrem Rechner an. -#### Voraussetzungen {#requirements} +#### Anforderungen {#requirements} Die Hardware-Anforderungen sind je nach Client unterschiedlich, aber im Allgemeinen nicht besonders hoch, da der Knoten nur synchronisiert bleiben muss. Verwechseln Sie das nicht mit dem Mining, das viel mehr Rechenleistung erfordert. Die Synchronisation von Zeit und Leistung verbessert sich jedoch mit leistungsstärkerer Hardware. Bevor Sie einen Client installieren, stellen Sie bitte sicher, dass Ihr Computer über genügend Ressourcen verfügt, um ihn auszuführen. Im Folgenden finden Sie die Mindestanforderungen und die empfohlenen Voraussetzungen. -Der Engpass für Ihre Hardware ist meist der Speicherplatz. Die Synchronisierung der Ethereum-Blockchain ist sehr ein- und ausgabeintensiv und benötigt viel Speicherplatz. Am besten ist es, ein **Solid-State-Laufwerk (SSD)** mit Hunderten von GB freiem Speicherplatz zu haben, der selbst nach der Synchronisierung noch Speicherplatz zur Verfügung hat. +Der Engpass für Ihre Hardware ist meist der Speicherplatz. Die Synchronisierung der Ethereum-Blockchain ist sehr ein- und ausgabeintensiv und benötigt viel Speicherplatz. Am besten ist es, ein **Solid-State-Drive (SSD)** mit Hunderten von GB freiem Speicherplatz zu haben, der auch nach der Synchronisierung noch verfügbar ist. -Die Größe der Datenbank und die Geschwindigkeit der anfänglichen Synchronisierung hängen vom gewählten Client, seiner Konfiguration und der [Synchronisierungsstrategie](/developers/docs/nodes-and-clients/#sync-modes) ab. +Die Größe der Datenbank und die Geschwindigkeit der anfänglichen Synchronisierung hängen vom gewählten Client, seiner Konfiguration und [Synchronisierungsstrategie](/developers/docs/nodes-and-clients/#sync-modes) ab. -Vergewissern Sie sich auch, dass Ihre Internetverbindung nicht durch eine [Bandbreitenbeschränkung](https://wikipedia.org/wiki/Data_cap) begrenzt ist. Es wird empfohlen, eine nicht gebührenpflichtige Verbindung zu verwenden, da die anfängliche Synchronisierung und die an das Netzwerk übertragenen Daten Ihr Limit überschreiten könnten. +Stellen Sie außerdem sicher, dass Ihre Internetverbindung nicht durch eine [Bandbreitenbegrenzung](https://wikipedia.org/wiki/Data_cap) eingeschränkt ist. Es wird empfohlen, eine nicht gebührenpflichtige Verbindung zu verwenden, da die anfängliche Synchronisierung und die an das Netzwerk übertragenen Daten Ihr Limit überschreiten könnten. ##### Betriebssystem @@ -91,16 +92,16 @@ Alle Clients unterstützen die wichtigsten Betriebssysteme: Linux, MacOS, Window Der von Ihnen gewählte Synchronisierungsmodus und Client wirken sich auf den Speicherplatzbedarf aus, wir haben jedoch den Speicherplatz, den Sie für jeden Client benötigen, im Folgenden geschätzt. | Client | Festplattengröße (Snap-Synchronisation) | Festplattengröße (Vollständiges Archiv) | -| ---------- | --------------------------------------- | --------------------------------------- | -| Besu | Mind. 800 GB | Mind. 12TB | -| Erigon | N/V | Mind. 2,5 TB | -| Geth | Mind. 500 GB | Mind. 12TB | -| Nethermind | Mind. 500 GB | Mind. 12TB | -| Reth | N/V | Über 2,2 TB | +| ---------- | ---------------------------------------------------------- | ---------------------------------------------------------- | +| Besu | Mind. 800 GB | Mind. 12TB | +| Erigon | N/V | Mind. 2,5 TB | +| Geth | Mind. 500 GB | Mind. 12TB | +| Nethermind | Mind. 500 GB | Mind. 12TB | +| Reth | N/V | Über 2,2 TB | - Hinweis: Erigon und Reth bieten keine Snap-Synchronisierung, aber vollständiges Pruning ist möglich (ca. 2 TB für Erigon, ca. 1,2 TB für Reth) -Bei Konsens-Clients hängt der Platzbedarf auch von der Client-Implementierung und den aktivierten Funktionen (z. B. Validator Slasher) ab, im Allgemeinen werden jedoch weitere 200 GB für Beacon-Daten benötigt. Mit einer großen Anzahl von Validatoren steigt auch die Bandbreitenbelastung. [Details zu den Anforderungen an Konsensclients finden Sie in dieser Analyse](https://mirror.xyz/0x934e6B4D7eee305F8C9C42b46D6EEA09CcFd5EDc/b69LBy8p5UhcGJqUAmT22dpvdkU-Pulg2inrhoS9Mbc). +Bei Konsens-Clients hängt der Platzbedarf auch von der Client-Implementierung und den aktivierten Funktionen ab (z. B. Validator-Slasher), aber im Allgemeinen sind weitere 200 GB für Beacon-Daten erforderlich. Mit einer großen Anzahl von Validatoren steigt auch die Bandbreitenbelastung. [Details zu den Anforderungen von Konsens-Clients finden Sie in dieser Analyse](https://mirror.xyz/0x934e6B4D7eee305F8C9C42b46D6EEA09CcFd5EDc/b69LBy8p5UhcGJqUAmT22dpvdkU-Pulg2inrhoS9Mbc). #### Plug-and-Play-Lösungen {#plug-and-play} @@ -109,39 +110,40 @@ Die einfachste Möglichkeit, einen Knoten mit eigener Hardware zu betreiben, ist - [DappNode](https://dappnode.io/) - [Avado](https://ava.do/) -#### Ethereum auf einem Einplatinenrechner {#ethereum-on-a-single-board-computer} +#### Ethereum auf einem Einplatinencomputer {#ethereum-on-a-single-board-computer} -Eine einfache und kostengünstige Möglichkeit, einen Ethereum-Node zu betreiben, ist die Verwendung eines Einplatinenrechners, sogar mit einer ARM-Architektur wie dem Raspberry Pi. [Ethereum on ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) bietet einfach auszuführende Implementierungen von mehreren Ausführungs- und Konsensclients für Raspberry Pi und anderer ARM-Boards. +Eine einfache und kostengünstige Möglichkeit, einen Ethereum-Node zu betreiben, ist die Verwendung eines Einplatinenrechners, sogar mit einer ARM-Architektur wie dem Raspberry Pi. [Ethereum on ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) bietet einfach auszuführende Images für verschiedene Ausführungs- und Konsens-Clients für Raspberry Pi und andere ARM-Boards. Kleine, kostengünstige und effiziente Geräte wie diese sind ideal für den Betrieb eines Knotens im eigenen Haushalt, doch sollte man ihre begrenzte Leistung nicht überschätzen. -## Hochfahren des Nodes {#spinning-up-node} +## Den Node hochfahren {#spinning-up-node} Die eigentliche Client-Einrichtung kann entweder mit automatischen Startprogrammen (Launcher) oder manuell erfolgen, indem die Client-Software direkt eingerichtet wird. Für weniger fortgeschrittene Benutzer empfiehlt sich die Verwendung eines „Launchers“, einer Software, die Sie durch die Installation führt und den Client-Einrichtungsprozess automatisiert. Wenn Sie jedoch etwas Erfahrung im Umgang mit einem Terminal haben, sollten die Schritte zur manuellen Einrichtung einfach zu befolgen sein. -### Geführte Einrichtung {#automatized-setup} +### Geführtes Setup {#automatized-setup} Mehrere benutzerfreundliche Projekte zielen darauf ab, die Erfahrungen bei der Einrichtung eines Kunden zu verbessern. Diese Launcher bieten eine automatische Client-Installation und -Konfiguration, wobei einige sogar eine grafische Oberfläche für die geführte Einrichtung und Überwachung der Clients bieten. Im Folgenden finden Sie einige Projekte, mit denen Sie Clients mit wenigen Klicks installieren und steuern können: -- [DappNode](https://docs.dappnode.io/docs/user/getting-started/choose-your-path) – DappNode wird nicht nur mit einer Maschine von einem Anbieter bereitgestellt. Die Software, der eigentliche Node Launcher und das Kontrollzentrum mit vielen Funktionen kann auf beliebiger Hardware eingesetzt werden. -- [eth-docker](https://eth-docker.net/) – Automatisierte Einrichtung unter Verwendung von Docker mit Schwerpunkt auf einfachem und sicherem Staking, erfordert grundlegende Terminal- und Docker-Kenntnisse, empfohlen für etwas fortgeschrittenere Benutzer. -- [Stereum](https://stereum.net/ethereum-node-setup/) – Ein Launcher für die Installation von Clients auf einem Remote-Server über eine SSH-Verbindung mit einer GUI-Einrichtungsanleitung, einem Kontrollzentrum und vielen anderen Funktionen. -- [NiceNode](https://www.nicenode.xyz/) – Ein Launcher mit einer einfachen Benutzerführung, um einen Node auf Ihrem Computer zu starten. Wählen Sie einfach Clients aus und starten Sie sie mit ein paar Klicks. Noch in der Entwicklung. -- [Sedge](https://docs.sedge.nethermind.io/docs/intro) – Node-Einrichtungstool, das mit Hilfe eines CLI-Assistenten automatisch eine Docker-Konfiguration erstellt. Geschrieben in Go von Nethermind. +- [DappNode](https://docs.dappnode.io/docs/user/getting-started/choose-your-path) – DappNode wird nicht nur als Maschine von einem Anbieter geliefert. Die Software, der eigentliche Node Launcher und das Kontrollzentrum mit vielen Funktionen kann auf beliebiger Hardware eingesetzt werden. +- [EthPillar](https://www.coincashew.com/coins/overview-eth/ethpillar) – Schnellster und einfachster Weg, einen Full Node einzurichten. Einzeiliges Setup-Tool und Knotenverwaltung TUI. Kostenlos. Open Source. Öffentliche Güter für Ethereum durch Solo-Staker. ARM64- und AMD64-Unterstützung. +- [eth-docker](https://eth-docker.net/) – Automatisierte Einrichtung mit Docker, die auf einfaches und sicheres Staking ausgerichtet ist, grundlegende Terminal- und Docker-Kenntnisse erfordert und für etwas fortgeschrittenere Benutzer empfohlen wird. +- [Stereum](https://stereum-dev.github.io/ethereum-node-web-docs) – Launcher zur Installation von Clients auf einem Remote-Server über eine SSH-Verbindung mit einer GUI-Einrichtungsanleitung, einem Kontrollzentrum und vielen anderen Funktionen. +- [NiceNode](https://www.nicenode.xyz/) – Ein Launcher mit einer unkomplizierten Benutzererfahrung, um einen Node auf Ihrem Computer zu betreiben. Wählen Sie einfach Clients aus und starten Sie sie mit ein paar Klicks. Noch in der Entwicklung. +- [Sedge](https://docs.sedge.nethermind.io/docs/intro) – Node-Setup-Tool, das automatisch eine Docker-Konfiguration mit einem CLI-Assistenten generiert. Geschrieben in Go von Nethermind. -### Manuelle Einrichtung von Clients {#manual-setup} +### Manuelles Einrichten der Clients {#manual-setup} Die andere Möglichkeit besteht darin, die Client-Software manuell herunterzuladen, zu überprüfen und zu konfigurieren. Auch wenn einige Clients eine grafische Oberfläche bieten, erfordert eine manuelle Einrichtung immer noch Grundkenntnisse im Umgang mit dem Terminal, bietet aber viel mehr Möglichkeiten. Wie bereits erläutert, muss für die Einrichtung Ihres eigenen Ethereum-Knotens ein Paar bestehend aus Konsens- und Ausführungsclients ausgeführt werden. Einige Clients können einen „leichten Client“ der alternativen Art enthalten und synchronisieren, ohne dass weitere Software erforderlich ist. Für eine vollständige vertrauenswürdige Überprüfung sind jedoch beide Implementierungen erforderlich. -#### Abrufen der Client-Software {#getting-the-client} +#### Die Client-Software erhalten {#getting-the-client} -Als erstes müssen Sie sich Ihre bevorzugte Software für den [Ausführungsclient](/developers/docs/nodes-and-clients/#execution-clients) und [Konsensclient](/developers/docs/nodes-and-clients/#consensus-clients) beschaffen. +Zuerst müssen Sie die Software für Ihren bevorzugten [Ausführungs-Client](/developers/docs/nodes-and-clients/#execution-clients) und [Konsens-Client](/developers/docs/nodes-and-clients/#consensus-clients) beschaffen. Sie können einfach eine ausführbare Anwendung oder ein Installationspaket herunterladen, das für Ihr Betriebssystem und Ihre Systemarchitektur geeignet ist. Überprüfen Sie immer die Signaturen und Prüfsummen der heruntergeladenen Pakete. Einige Clients bieten auch Repositories oder Docker-Abbildungen zur einfacheren Installation und Aktualisierung an. Alle Clients sind quelloffen, so dass Sie sie auch aus dem Quellcode erstellen können. Dies ist eine fortgeschrittenere Methode, jedoch kann sie in manchen Fällen erforderlich sein. @@ -149,7 +151,7 @@ Anleitungen zur Installation der einzelnen Clients finden Sie in der Dokumentati Dort finden Sie die Versionsseiten der Clients, auf denen Sie die vorgefertigten Binärdateien oder Anweisungen zur Installation finden können: -##### Clients auf Ausführungsebene +##### Ausführungs-Clients - [Besu](https://github.com/hyperledger/besu/releases) - [Erigon](https://github.com/ledgerwatch/erigon/releases) @@ -157,25 +159,25 @@ Dort finden Sie die Versionsseiten der Clients, auf denen Sie die vorgefertigten - [Nethermind](https://downloads.nethermind.io/) - [Reth](https://reth.rs/installation/installation.html) -Es sei auch erwähnet, dass die Client-Vielfalt ein [Problem auf der Ausführungsebene](/developers/docs/nodes-and-clients/client-diversity/#execution-layer) darstellt. Den Lesern wird empfohlen, einen Minderheitenausführungsclient zu verwenden. +Es ist auch erwähnenswert, dass die Client-Diversität ein [Problem auf der Ausführungsebene](/developers/docs/nodes-and-clients/client-diversity/#execution-layer) darstellt. Den Lesern wird empfohlen, einen Minderheitenausführungsclient zu verwenden. ##### Konsens-Clients - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (Bietet keine vorgefertigte Binärdatei, sondern nur eine Docker-Abbildung, die aus den Quelldateien erstellt werden muss) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source) (Bietet keine vorgefertigte Binärdatei, nur ein Docker-Image oder muss aus dem Quellcode erstellt werden) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) -[Client-Vielfalt](/developers/docs/nodes-and-clients/client-diversity/) ist entscheidend für Konsensknoten mit Validatoren. Wenn die Mehrheit der Validatoren eine einzelne Client-Implementierung ausführt, ist die Netzwerksicherheit gefährdet. Es wird daher empfohlen, einen Minderheits-Client zu wählen. +[Client-Diversität](/developers/docs/nodes-and-clients/client-diversity/) ist für Konsens-Nodes, die Validatoren betreiben, von entscheidender Bedeutung. Wenn die Mehrheit der Validatoren eine einzelne Client-Implementierung ausführt, ist die Netzwerksicherheit gefährdet. Es wird daher empfohlen, einen Minderheits-Client zu wählen. -[Informieren Sie sich über die aktuelle Nutzung von Netzwerkclients](https://clientdiversity.org/) und erfahren Sie mehr über [Client-Vielfalt](/developers/docs/nodes-and-clients/client-diversity). +[Sehen Sie sich die aktuelle Nutzung von Netzwerk-Clients an](https://clientdiversity.org/) und erfahren Sie mehr über [Client-Diversität](/developers/docs/nodes-and-clients/client-diversity). ##### Verifizierung der Software Beim Herunterladen von Software aus dem Internet wird empfohlen, deren Integrität zu überprüfen. Diese Maßnahme ist zwar freiwillig, aber gerade bei essenziellen Infrastrukturkomponenten wie dem Ethereum-Client ist es wichtig, mögliche Angriffsvektoren zu kennen und zu vermeiden. Sofern Sie eine vorgefertigte Binärdatei heruntergeladen haben, ist es erforderlich, darauf zu vertrauen und das damit verbundene Risiko einzugehen, dass ein Angreifer die ausführbare Datei gegen eine bösartige Variante austauschen könnte. -Entwickler signieren veröffentlichte Binärdateien mit ihren PGP-Schlüsseln, sodass Sie kryptografisch überprüfen können, dass Sie genau die von ihnen erstellte Software ausführen. Sie müssen lediglich die von den Entwicklern verwendeten öffentlichen Schlüssel erhalten, die auf den Client-Versionsseiten oder in der Dokumentation gefunden werden können. Nachdem Sie die Client-Version und ihre Signatur heruntergeladen haben, können Sie eine PGP-Implementierung wie z. B. [GnuPG](https://gnupg.org/download/index.html) verwenden, um sie problemlos zu verifizieren. Schauen Sie sich ein Tutorial zur Überprüfung von Open-Source-Software mit `gpg` auf [Linux](https://www.tecmint.com/verify-pgp-signature-downloaded-software/) oder [Windows/MacOS](https://freedom.press/training/verifying-open-source-software/) an. +Entwickler signieren veröffentlichte Binärdateien mit ihren PGP-Schlüsseln, sodass Sie kryptografisch überprüfen können, dass Sie genau die von ihnen erstellte Software ausführen. Sie müssen lediglich die von den Entwicklern verwendeten öffentlichen Schlüssel erhalten, die auf den Client-Versionsseiten oder in der Dokumentation gefunden werden können. Nachdem Sie das Client-Release und seine Signatur heruntergeladen haben, können Sie eine PGP-Implementierung, z. B. [GnuPG](https://gnupg.org/download/index.html), verwenden, um sie einfach zu verifizieren. Sehen Sie sich ein Tutorial zur Verifizierung von Open-Source-Software mit `gpg` unter [Linux](https://www.tecmint.com/verify-pgp-signature-downloaded-software/) oder [Windows/MacOS](https://freedom.press/training/verifying-open-source-software/) an. Eine weitere Form der Überprüfung besteht darin sicherzustellen, dass der Hash – ein eindeutiger kryptografischer Fingerabdruck – der heruntergeladenen Software mit dem vom Entwickler bereitgestellten übereinstimmt. Diese Vorgehensweise ist sogar unkomplizierter als die Verwendung von PGP, und bei einigen Programmen steht lediglich diese Option zur Verfügung. Führen Sie einfach die Hash-Funktion auf der heruntergeladenen Software aus und vergleichen Sie sie mit der auf der Veröffentlichungsseite angegebenen Funktion. Beispiel: @@ -185,19 +187,19 @@ sha256sum teku-22.6.1.tar.gz 9b2f8c1f8d4dab0404ce70ea314ff4b3c77e9d27aff9d1e4c1933a5439767dde ``` -#### Client-Setup {#client-setup} +#### Client-Einrichtung {#client-setup} Nach der Installation, dem Herunterladen oder dem Kompilieren der Client-Software sind Sie bereit, sie auszuführen. Das bedeutet lediglich, dass es mit der richtigen Konfiguration ausgeführt werden muss. Die Clients bieten eine vielfältige Auswahl an Konfigurationsoptionen, die verschiedene Funktionen aktivieren können. -Lassen Sie uns mit den Optionen beginnen, die sich wesentlich auf die Leistung und die Datennutzung des Clients auswirken können. [Synchronisierungsmodi](/developers/docs/nodes-and-clients/#sync-modes) stellen verschiedene Methoden zum Herunterladen und Validieren von Blockchain-Daten dar. Bevor Sie den Knoten starten, sollten Sie entscheiden, welchen Netzwerk- und Synchronisierungsmodus Sie verwenden möchten. Die wichtigsten Faktoren, die berücksichtigt werden müssen, sind der benötigte Festplattenspeicher und die Synchronisationszeit des Clients. Achten Sie auf die Dokumentation des Clients, um festzustellen, welcher Synchronisationsmodus standardmäßig verwendet wird. Wenn dies nicht geeignet ist, wählen Sie einen anderen Client basierend auf Sicherheitsniveau, verfügbaren Daten und Kosten. Neben dem Synchronisations-Algorithmus können Sie auch verschiedene Arten von alten Daten automatisch reduzieren lassen (Pruning). Pruning ermöglicht das Löschen veralteter Daten, z. B. das Entfernen von Zustands-Trie-Nodes, die von den letzten Blocks unerreichbar sind. +Lassen Sie uns mit den Optionen beginnen, die sich wesentlich auf die Leistung und die Datennutzung des Clients auswirken können. [Synchronisierungsmodi](/developers/docs/nodes-and-clients/#sync-modes) stellen verschiedene Methoden zum Herunterladen und Validieren von Blockchain-Daten dar. Bevor Sie den Knoten starten, sollten Sie entscheiden, welchen Netzwerk- und Synchronisierungsmodus Sie verwenden möchten. Die wichtigsten Faktoren, die berücksichtigt werden müssen, sind der benötigte Festplattenspeicher und die Synchronisationszeit des Clients. Achten Sie auf die Dokumentation des Clients, um festzustellen, welcher Synchronisationsmodus standardmäßig verwendet wird. Wenn dies nicht geeignet ist, wählen Sie einen anderen Client basierend auf Sicherheitsniveau, verfügbaren Daten und Kosten. Neben dem Synchronisations-Algorithmus können Sie auch verschiedene Arten von alten Daten automatisch reduzieren lassen (Pruning). Pruning ermöglicht das Löschen veralteter Daten, d.h. das Entfernen von State-Trie-Nodes, die von den letzten Blöcken aus nicht erreichbar sind. -Weitere grundlegende Konfigurationsoptionen sind beispielsweise die Auswahl eines Netzwerks – Mainnet oder Testnetzwerke –, das Aktivieren eines HTTP-Endpunkts für RPC oder WebSockets, usw. Sämtliche Funktionen und Optionen finden Sie in der Dokumentation des Clients. Verschiedene Client-Konfigurationen können durch Ausführen des Clients mit den entsprechenden Flaggen direkt in der Befehlszeilenschnittstelle (CLI) oder der Konfigurationsdatei festgelegt werden. Jeder Client ist etwas anders; bitte konsultieren Sie immer die offizielle Dokumentation oder Hilfeseite für Details zu den Konfigurationsoptionen. +Andere grundlegende Konfigurationsoptionen sind z. B. die Wahl eines Netzwerks – Mainnet oder Testnets, die Aktivierung des HTTP-Endpunkts für RPC oder WebSockets usw. Sämtliche Funktionen und Optionen finden Sie in der Dokumentation des Clients. Verschiedene Client-Konfigurationen können durch Ausführen des Clients mit den entsprechenden Flaggen direkt in der Befehlszeilenschnittstelle (CLI) oder der Konfigurationsdatei festgelegt werden. Jeder Client ist etwas anders; bitte konsultieren Sie immer die offizielle Dokumentation oder Hilfeseite für Details zu den Konfigurationsoptionen. Zu Testzwecken sollten Sie einen Client in einem der Testnetzwerke betreiben. [Siehe Übersicht der unterstützten Netzwerke](/developers/docs/nodes-and-clients/#execution-clients). Beispiele für laufende Ausführungsclients mit Grundkonfiguration finden Sie im nächsten Abschnitt. -#### Starten des Ausführungsclients {#starting-the-execution-client} +#### Starten des Ausführungs-Clients {#starting-the-execution-client} Bevor Sie die Ethereum-Client-Software starten, überprüfen Sie noch einmal, ob Ihre Systemumgebung bereit ist. Stellen Sie beispielsweise Folgendes sicher: @@ -211,34 +213,34 @@ Führen Sie Ihren Client zunächst in einem Testnetz aus, um sicherzustellen, da Sie müssen alle Client-Einstellungen, die nicht standardmäßig sind, zu Beginn angeben. Sie können Flags oder die Konfigurationsdatei verwenden, um Ihre bevorzugte Konfiguration anzugeben. Der Funktionsumfang und die Konfigurationssyntax jedes Clients unterscheiden sich. Schauen Sie sich die Dokumentation Ihres Clients für die Einzelheiten an. -Ausführungs- und Konsensclients kommunizieren über einen authentifizierten Endpunkt, der in der [Engine-API](https://github.com/ethereum/execution-apis/tree/main/src/engine) angegeben ist. Um sich mit einem Konsensclient zu verbinden, muss der Ausführungsclient einen [`jwtsecret`](https://jwt.io/) in einem bekannten Pfad generieren. Aus Sicherheits- und Stabilitätsgründen sollten die Clients auf derselben Maschine ausgeführt werden, und beide Clients müssen diesen Pfad kennen, da dieser zur Authentifizierung einer lokalen RPC-Verbindung zwischen ihnen verwendet wird. Der Ausführungsclient muss auch einen Listening-Port für authentifizierte APIs festlegen. +Ausführungs- und Konsens-Clients kommunizieren über einen authentifizierten Endpunkt, der in der [Engine API](https://github.com/ethereum/execution-apis/tree/main/src/engine) spezifiziert ist. Um eine Verbindung zu einem Konsens-Client herzustellen, muss der Ausführungs-Client ein [`jwtsecret`](https://jwt.io/) in einem bekannten Pfad generieren. Aus Sicherheits- und Stabilitätsgründen sollten die Clients auf derselben Maschine ausgeführt werden, und beide Clients müssen diesen Pfad kennen, da dieser zur Authentifizierung einer lokalen RPC-Verbindung zwischen ihnen verwendet wird. Der Ausführungsclient muss auch einen Listening-Port für authentifizierte APIs festlegen. -Dieser Token wird automatisch von der Client-Software generiert, in manchen Fällen müssen Sie dies jedoch selbst tun. Sie können ihn mit [OpenSSL](https://www.openssl.org/) erzeugen: +Dieser Token wird automatisch von der Client-Software generiert, in manchen Fällen müssen Sie dies jedoch selbst tun. Sie können es mit [OpenSSL](https://www.openssl.org/) generieren: ```sh openssl rand -hex 32 > jwtsecret ``` -#### Betreiben eines Ausführungsclients {#running-an-execution-client} +#### Einen Ausführungs-Client betreiben {#running-an-execution-client} Dieser Abschnitt führt Sie durch die Einrichtung eines Ausführungsclients. Er dient nur als Beispiel für eine Grundkonfiguration, mit der der Client entsprechend dieser Einstellungen gestartet wird: - Gibt das Netzwerk an, mit dem eine Verbindung hergestellt werden soll – in unseren Beispielen Mainnet - - Sie können stattdessen [eines der Testnetzwerke](/developers/docs/networks/) für erste Tests Ihrer Einrichtung wählen + - Sie können stattdessen [eines der Testnets](/developers/docs/networks/) für vorläufige Tests Ihres Setups auswählen - Festlegen des Datenverzeichnisses, in dem alle Daten, einschließlich der Blockchain, gespeichert werden sollen - - Stellen Sie sicher, dass Sie den Pfad durch einen echten Pfad ersetzen, der z. B. auf Ihr externes Laufwerk verweist + - Stellen Sie sicher, dass Sie den Pfad durch einen echten ersetzen, der z. B. auf Ihr externes Laufwerk verweist - Aktivieren von Schnittstellen für die Kommunikation mit dem Client - Einschließlich JSON-RPC- und Engine-API für die Kommunikation mit dem Konsens-Client -- Festlegen des Pfads zu `jwtsecret` für authentifizierte API - - Stellen Sie sicher, dass Sie den Beispielpfad durch einen echten Pfad ersetzen, auf den die Clients zugreifen können, z. B. `/tmp/jwtsecret`. +- Definiert den Pfad zum `jwtsecret` für die authentifizierte API + - Stellen Sie sicher, dass Sie den Beispielpfad durch einen echten ersetzen, auf den die Clients zugreifen können, z. B. `/tmp/jwtsecret` Bitte beachten Sie, dass dies nur ein einfaches Beispiel ist, alle anderen Einstellungen werden auf die Standardeinstellung gesetzt. Beachten Sie die Dokumentation der einzelnen Clients, um sich über standardmäßige Werte, Einstellungen und Funktionen zu informieren. Weitere Funktionen, z. B. zur Ausführung von Validatoren, zur Überwachung usw., finden Sie in der Dokumentation des jeweiligen Clients. -> Beachten Sie, dass die Schrägstriche `\` in den Beispielen nur der Formatierung dienen; Konfigurations-Flags können in einer einzigen Zeile definiert werden. +> Beachten Sie, dass die Backslashes `\` in den Beispielen nur zu Formatierungszwecken dienen; Konfigurations-Flags können in einer einzigen Zeile definiert werden. ##### Ausführen von Besu -Dieses Beispiel startet Besu im Mainnet, speichert Blockchain-Daten im Standardformat unter `/data/ethereum` und aktiviert JSON-RPC und Engine RPC zur Verbindung mit dem Konsens-Client. Engine-API ist mit dem Token `jwtsecret` authentifiziert und nur Aufrufe von `localhost` sind erlaubt. +Dieses Beispiel startet Besu auf Mainnet, speichert Blockchain-Daten im Standardformat unter `/data/ethereum`, aktiviert JSON-RPC und Engine-RPC zum Verbinden des Konsens-Clients. Die Engine-API wird mit dem Token `jwtsecret` authentifiziert und es sind nur Aufrufe von `localhost` erlaubt. ```sh besu --network=mainnet \ @@ -256,11 +258,11 @@ Besu verfügt auch über eine Startoption, die eine Reihe von Fragen stellt und besu --Xlauncher ``` -[Dokumentation von Besu](https://besu.hyperledger.org/public-networks/get-started/start-node/) enthält zusätzliche Optionen und Konfigurationsdetails. +Die [Besu-Dokumentation](https://besu.hyperledger.org/public-networks/get-started/start-node/) enthält zusätzliche Optionen und Konfigurationsdetails. ##### Ausführen von Erigon -Dieses Beispiel startet Erigon im Mainnet, speichert Blockchain-Daten unter `/data/ethereum`, aktiviert JSON-RPC, definiert, welche Namespaces zulässig sind, und aktiviert die Authentifizierung für die Verbindung mit dem Konsens-Client, der durch den `jwtsecret`-Pfad definiert ist. +Dieses Beispiel startet Erigon auf Mainnet, speichert Blockchain-Daten in `/data/ethereum`, aktiviert JSON-RPC, definiert, welche Namespaces erlaubt sind und aktiviert die Authentifizierung zur Verbindung mit dem Konsens-Client, die durch den `jwtsecret`-Pfad definiert ist. ```sh erigon --chain mainnet \ @@ -269,11 +271,11 @@ erigon --chain mainnet \ --authrpc.jwtsecret=/path/to/jwtsecret ``` -Erigon führt standardmäßig eine vollständige Synchronisierung mit einer 8 GB HDD-Festplatte durch, was zu mehr als 2 TB an Archivdaten führen wird. Stellen Sie sicher, dass `datadir` auf eine Festplatte mit ausreichend freiem Speicherplatz verweist oder sehen Sie sich die `--prune`-Flagge an, welche verschiedene Arten von Daten reduzieren kann. In der `-Hilfe` von Erigon finden Sie weitere Informationen. +Erigon führt standardmäßig eine vollständige Synchronisierung mit einer 8 GB HDD-Festplatte durch, was zu mehr als 2 TB an Archivdaten führen wird. Stellen Sie sicher, dass `datadir` auf eine Festplatte mit genügend freiem Speicherplatz verweist oder sehen Sie sich das Flag `--prune` an, mit dem verschiedene Arten von Daten getrimmt werden können. Prüfen Sie Erigons `--help` für weitere Informationen. ##### Ausführen von Geth -Dieses Beispiel startet Geth im Mainnet, speichert Blockchain-Daten unter `/data/ethereum`, aktiviert JSON-RPC und definiert, welche Namespaces zulässig sind. Es ermöglicht auch die Authentifizierung für den Verbindungsaufbau zum Konsensclient, welcher den Pfad zu `jwtsecret` benötigt, sowie eine Option, die festlegt, welche Verbindungen erlaubt sind; in unserem Beispiel nur von `localhost`. +Dieses Beispiel startet Geth auf Mainnet, speichert Blockchain-Daten unter `/data/ethereum`, aktiviert JSON-RPC und definiert, welche Namespaces erlaubt sind. Es aktiviert auch die Authentifizierung für die Verbindung mit dem Konsens-Client, was den Pfad zu `jwtsecret` erfordert, sowie eine Option, die definiert, welche Verbindungen erlaubt sind, in unserem Beispiel nur von `localhost`. ```sh geth --mainnet \ @@ -284,7 +286,7 @@ geth --mainnet \ --authrpc.jwtsecret=/path/to/jwtsecret ``` -Überprüfen Sie die [Dokumentation für alle Konfigurationsoptionen](https://geth.ethereum.org/docs/fundamentals/command-line-options) und erfahren Sie mehr über das [Ausführen von Geth mit einem Konsensclient](https://geth.ethereum.org/docs/getting-started/consensus-clients). +Überprüfen Sie die [Dokumentation für alle Konfigurationsoptionen](https://geth.ethereum.org/docs/fundamentals/command-line-options) und erfahren Sie mehr über [die Ausführung von Geth mit einem Konsens-Client](https://geth.ethereum.org/docs/getting-started/consensus-clients). ##### Ausführen von Nethermind @@ -296,7 +298,7 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -Die Nethermind-Dokumente bieten eine [vollständige Anleitung](https://docs.nethermind.io/get-started/running-node/) zum Betrieb von Nethermind mit Konsensclients. +Die Nethermind-Dokumentation bietet eine [vollständige Anleitung](https://docs.nethermind.io/get-started/running-node/) zur Ausführung von Nethermind mit einem Konsens-Client. Ein Ausführungsclient initiiert seine Kernfunktionen, wählt Endpunkte und beginnt mit der Suche nach Peers. Nach erfolgreicher Erkennung von Peers beginnt der Client mit der Synchronisierung. Der Ausführungsclient wartet auf eine Verbindung vom Konsensclient. Die aktuellen Blockchain-Daten sind verfügbar, sobald der Client erfolgreich mit dem aktuellen Zustand synchronisiert wurde. @@ -311,19 +313,19 @@ reth node \ --authrpc.port 8551 ``` -Weitere Informationen zu Standarddatenverzeichnissen finden Sie unter [Konfigurieren von Reth](https://reth.rs/run/config.html?highlight=data%20directory#configuring-reth). [Die Reth-Dokumentation](https://reth.rs/run/mainnet.html) enthält zusätzliche Optionen und Konfigurationsdetails. +Siehe [Reth konfigurieren](https://reth.rs/run/config.html?highlight=data%20directory#configuring-reth), um mehr über Standard-Datenverzeichnisse zu erfahren. Die [Reth-Dokumentation](https://reth.rs/run/mainnet.html) enthält zusätzliche Optionen und Konfigurationsdetails. -#### Starten des Konsensclients {#starting-the-consensus-client} +#### Starten des Konsens-Clients {#starting-the-consensus-client} Der Konsensclient muss mit der richtigen Port-Konfiguration gestartet werden, um eine lokale RPC-Verbindung zum Ausführungsclient herzustellen. Die Konsensclients müssen mit dem offengelegten Ausführungsclient-Port als Konfigurationsargument ausgeführt werden. -Der Konsensclient benötigt außerdem den Pfad zum `jwt-secret` des Ausführungsclients, um die RPC-Verbindung zwischen ihnen zu authentifizieren. Ähnlich wie bei den obigen Ausführungsbeispielen verfügt jeder Konsensclient über ein Konfigurationsmerkmal, das den Pfad des jwt-Tokens als Argument annimmt. Dieser muss mit dem `jwtsecret`-Pfad übereinstimmen, der dem Ausführungsclient mitgeteilt wurde. +Der Konsens-Client benötigt auch den Pfad zum `jwt-secret` des Ausführungs-Clients, um die RPC-Verbindung zwischen ihnen zu authentifizieren. Ähnlich wie bei den obigen Ausführungsbeispielen verfügt jeder Konsensclient über ein Konfigurationsmerkmal, das den Pfad des jwt-Tokens als Argument annimmt. Dieser muss mit dem `jwtsecret`-Pfad übereinstimmen, der dem Ausführungs-Client zur Verfügung gestellt wird. -Wenn Sie einen Validator betreiben möchten, fügen Sie unbedingt eine Konfigurationsflagge hinzu, die die Ethereum-Adresse des Gebührenempfängers angibt. Hier sammeln sich die Ether-Prämien für Ihren Validator. Jeder Konsensclient hat eine Option, z. B. `--suggested-fee-recipient=0xabcd1`, die eine Ethereum-Adresse als Argument nimmt. +Wenn Sie einen Validator betreiben möchten, fügen Sie unbedingt eine Konfigurationsflagge hinzu, die die Ethereum-Adresse des Gebührenempfängers angibt. Hier sammeln sich die Ether-Prämien für Ihren Validator. Jeder Konsens-Client hat eine Option, z. B. `--suggested-fee-recipient=0xabcd1`, die eine Ethereum-Adresse als Argument entgegennimmt. -Wenn Sie eine Beacon Node in einem Testnetzwerk starten, können Sie viel Zeit bei der Synchronisierung sparen, indem Sie einen öffentlichen Endpunkt für die [Kontrollpunkt-Synchronisation](https://notes.ethereum.org/@launchpad/checkpoint-sync) verwenden. +Wenn Sie eine Beacon Node auf einem Testnet starten, können Sie durch die Verwendung eines öffentlichen Endpunkts für den [Checkpoint-Sync](https://notes.ethereum.org/@launchpad/checkpoint-sync) erheblich Zeit bei der Synchronisierung sparen. -#### Betrieb eines Konsensclients {#running-a-consensus-client} +#### Betreiben eines Konsens-Clients {#running-a-consensus-client} ##### Ausführen von Lighthouse @@ -340,11 +342,11 @@ lighthouse beacon_node \ ##### Ausführen von Lodestar -Installieren Sie die Lodestar-Software, indem Sie sie kompilieren oder das Docker-Abbild herunterladen. Weitere Informationen finden Sie in den [Dokumenten](https://chainsafe.github.io/lodestar/) und im umfassenden [Einrichtungsleitfaden](https://hackmd.io/@philknows/rk5cDvKmK). +Installieren Sie die Lodestar-Software, indem Sie sie kompilieren oder das Docker-Abbild herunterladen. Erfahren Sie mehr in den [Dokumenten](https://chainsafe.github.io/lodestar/) und in der umfassenderen [Einrichtungsanleitung](https://hackmd.io/@philknows/rk5cDvKmK). ```sh lodestar beacon \ - --rootDir="/data/ethereum" \ + --dataDir="/data/ethereum" \ --network=mainnet \ --eth1.enabled=true \ --execution.urls="http://127.0.0.1:8551" \ @@ -353,7 +355,8 @@ lodestar beacon \ ##### Ausführen von Nimbus -Nimbus wird sowohl mit Konsens- als auch mit Ausführungsclients geliefert. Es kann auf verschiedenen Geräten auch mit sehr bescheidener Rechenleistung ausgeführt werden. Nach der [Installation von Abhängigkeiten und von Nimbus selbst](https://nimbus.guide/quick-start.html) können Sie den Konsensclient starten: +Nimbus wird sowohl mit Konsens- als auch mit Ausführungsclients geliefert. Es kann auf verschiedenen Geräten auch mit sehr bescheidener Rechenleistung ausgeführt werden. +Nach der [Installation der Abhängigkeiten und von Nimbus selbst](https://nimbus.guide/quick-start.html), können Sie dessen Konsens-Client ausführen: ```sh nimbus_beacon_node \ @@ -365,7 +368,7 @@ nimbus_beacon_node \ ##### Ausführen von Prysm -Prysm wird mit einem Skript geliefert, das eine einfache automatische Installation ermöglicht. Einzelheiten sind in den [Prysm-Dokumenten](https://prysm.offchainlabs.com/docs/install-prysm/install-with-script/) zu finden. +Prysm wird mit einem Skript geliefert, das eine einfache automatische Installation ermöglicht. Details finden Sie in der [Prysm-Dokumentation](https://prysm.offchainlabs.com/docs/install-prysm/install-with-script/). ```sh ./prysm.sh beacon-chain \ @@ -386,49 +389,49 @@ teku --network mainnet \ Wenn sich ein Konsensclient mit dem Ausführungsclient verbindet, um den Einzahlungsvertrag zu lesen und die Validatoren zu identifizieren, verbindet er sich auch mit anderen Beacon Node-Peers und beginnt mit der Synchronisierung der Konsens-Slots ab der Genesis. Sobald der Beacon Node die aktuelle Epoche erreicht, wird die Beacon API für Ihre Validatoren nutzbar. Erfahren Sie mehr über [Beacon Node APIs](https://eth2docs.vercel.app/). -### Hinzufügen von Validatoren {#adding-validators} +### Validatoren hinzufügen {#adding-validators} Ein Konsensclient dient als Beacon Node, mit dem sich Validatoren verbinden können. Jeder Konsensclient verfügt über eine eigene Validierungssoftware, die in der jeweiligen Dokumentation ausführlich beschrieben wird. -Der Betrieb eines eigenen Validators ermöglicht [Solo-Staking](/staking/solo/), die wirkungsvollste und vertrauenswürdigste Methode zur Unterstützung des Ethereum-Netzwerks. Allerdings ist dafür eine Einzahlung von 32 ETH erforderlich. Um einen Validator auf einem eigenen Knoten mit einem kleineren Betrag zu betreiben, könnte ein dezentraler Pool mit erlaubnisfreien Node-Betreibern wie [Rocket Pool](https://rocketpool.net/node-operators) interessant sein. +Der Betrieb eines eigenen Validators ermöglicht [Solo-Staking](/staking/solo/), die wirkungsvollste und vertrauenswürdigste Methode zur Unterstützung des Ethereum-Netzwerks. Allerdings ist dafür eine Einzahlung von 32 ETH erforderlich. Um einen Validator auf Ihrem eigenen Node mit einem kleineren Betrag zu betreiben, könnte ein dezentraler Pool mit erlaubnisfreien Node-Betreibern, wie [Rocket Pool](https://rocketpool.net/node-operators), für Sie interessant sein. -Die einfachste Möglichkeit, mit Staking und der Generierung von Validator-Schlüsseln zu beginnen, ist die Verwendung des [Holesky Testnet Staking Launchpad](https://holesky.launchpad.ethereum.org/), mit dem Sie Ihr Setup testen können, indem Sie [Nodes auf Holesky ausführen](https://notes.ethereum.org/@launchpad/holesky). Wenn Sie für das Mainnet bereit sind, können diese Schritte mit dem [Mainnet Staking Launchpad](https://launchpad.ethereum.org/) wiederholt werden. +Der einfachste Weg, um mit dem Staking und der Generierung von Validator-Schlüsseln zu beginnen, ist die Verwendung des [Hoodi Testnet Staking Launchpads](https://hoodi.launchpad.ethereum.org/), mit dem Sie Ihr Setup testen können, indem Sie [Nodes auf Hoodi ausführen](https://notes.ethereum.org/@launchpad/hoodi). Wenn Sie für Mainnet bereit sind, können Sie diese Schritte mit dem [Mainnet Staking Launchpad](https://launchpad.ethereum.org/) wiederholen. -Auf der [Staking-Seite](/staking) finden Sie einen Überblick über die Staking-Optionen. +Sehen Sie sich die [Staking-Seite](/staking) an, um einen Überblick über die Staking-Optionen zu erhalten. -### Verwendung eines Knotens {#using-the-node} +### Verwenden des Nodes {#using-the-node} -Ausführungsclients bieten [RPC-API-Endpunkte](/developers/docs/apis/json-rpc/), mit denen Sie Transaktionen einreichen, mit dem Ethereum-Netzwerk interagieren oder Smart Contracts auf verschiedene Weise einsetzen können: +Ausführungs-Clients bieten [RPC-API-Endpunkte](/developers/docs/apis/json-rpc/) an, die Sie verwenden können, um Transaktionen zu übermitteln, mit Smart Contracts im Ethereum-Netzwerk zu interagieren oder diese auf verschiedene Weisen bereitzustellen: - Manueller Aufruf mit einem geeigneten Protokoll (z. B. mit `curl`) - Anhängen einer bereitgestellten Konsole (z. B. `geth attach`) -- Implementierung in Applikationen mit web3-Bibliotheken, z. B. [web3.py](https://web3py.readthedocs.io/en/stable/overview.html#overview), [ethers](https://github.com/ethers-io/ethers.js/) +- Implementierung in Anwendungen mithilfe von web3-Bibliotheken, z. B. [web3.py](https://web3py.readthedocs.io/en/stable/overview.html#overview), [ethers](https://github.com/ethers-io/ethers.js/) -Verschiedene Clients verfügen über unterschiedliche Implementierungen der RPC-Endpunkte. Es gibt jedoch einen Standard-JSON-RPC, den Sie mit jedem Client verwenden können. Für einen Überblick [lesen Sie die JSON-RPC-Dokumente](/developers/docs/apis/json-rpc/). Anwendungen, die Informationen aus dem Ethereum-Netzwerk benötigen, können diesen RPC verwenden. Mit der beliebten Wallet MetaMask können Sie zum Beispiel [eine Verbindung zu Ihrem eigenen RPC-Endpunkt herstellen](https://metamask.zendesk.com/hc/en-us/articles/360015290012-Using-a-Local-Node), was erhebliche Vorteile für den Datenschutz und die Sicherheit mit sich bringt. +Verschiedene Clients verfügen über unterschiedliche Implementierungen der RPC-Endpunkte. Es gibt jedoch einen Standard-JSON-RPC, den Sie mit jedem Client verwenden können. Für einen Überblick [lesen Sie die JSON-RPC-Dokumentation](/developers/docs/apis/json-rpc/). Anwendungen, die Informationen aus dem Ethereum-Netzwerk benötigen, können diesen RPC verwenden. Zum Beispiel ermöglicht die beliebte Wallet MetaMask es Ihnen, sich mit Ihrem [eigenen RPC-Endpunkt zu verbinden](https://metamask.zendesk.com/hc/en-us/articles/360015290012-Using-a-Local-Node), was große Vorteile für Datenschutz und Sicherheit bietet. -Die Konsensclients stellen alle eine [Beacon API](https://ethereum.github.io/beacon-APIs) zur Verfügung, die verwendet werden kann, um den Status des Konsensclients zu überprüfen oder Blöcke und Konsensdaten herunterzuladen, indem Anfragen mit Tools wie [Curl](https://curl.se) gesendet werden. Weitere Informationen hierzu finden Sie in der Dokumentation des jeweiligen Konsensclients. +Die Konsens-Clients stellen alle eine [Beacon-API](https://ethereum.github.io/beacon-APIs) zur Verfügung, die verwendet werden kann, um den Status des Konsens-Clients zu überprüfen oder Blöcke und Konsensdaten durch Senden von Anfragen mit Tools wie [Curl](https://curl.se) herunterzuladen. Weitere Informationen hierzu finden Sie in der Dokumentation des jeweiligen Konsensclients. -#### Weitere Informationen hierzu finden Sie in der Dokumentation des jeweiligen Konsensclients. {#reaching-rpc} +#### RPC erreichen {#reaching-rpc} -Der Standardport für den Ausführungsclient JSON-RPC ist `8545`, Sie können jedoch die Ports der lokalen Endpunkte in der Konfiguration ändern. Standardmäßig ist die RPC-Schnittstelle nur über den localhost Ihres Computers erreichbar. Um sie aus der Ferne zugänglich zu machen, können Sie sie der Öffentlichkeit präsentieren, indem Sie die Adresse zu `0.0.0.0` ändern. Hierdurch wird sie über das lokale Netz und öffentliche IP-Adressen erreichbar. In den meisten Fällen müssen Sie außerdem eine Portweiterleitung auf Ihrem Router einrichten. +Der Standardport für den JSON-RPC des Ausführungs-Clients ist `8545`, aber Sie können die Ports der lokalen Endpunkte in der Konfiguration ändern. Standardmäßig ist die RPC-Schnittstelle nur über den localhost Ihres Computers erreichbar. Um es aus der Ferne zugänglich zu machen, möchten Sie es vielleicht der Öffentlichkeit zugänglich machen, indem Sie die Adresse auf `0.0.0.0` ändern. Hierdurch wird sie über das lokale Netz und öffentliche IP-Adressen erreichbar. In den meisten Fällen müssen Sie außerdem eine Portweiterleitung auf Ihrem Router einrichten. Die Freigabe von Ports für das Internet ist mit Vorsicht zu genießen, da hierdurch jeder im Internet Ihren Knoten kontrollieren kann. Böswillige Akteure könnten auf Ihren Knoten zugreifen, um Ihr System zum Absturz zu bringen oder Ihr Geld zu stehlen, wenn Sie Ihren Client als Wallet verwenden. -Eine Möglichkeit, dies zu umgehen, besteht darin zu verhindern, dass potenziell schädliche RPC-Methoden geändert werden können. Mit Geth können Sie zum Beispiel veränderbare Methoden mit einer Flag deklarieren: `--http.api web3,eth,txpool`. +Eine Möglichkeit, dies zu umgehen, besteht darin zu verhindern, dass potenziell schädliche RPC-Methoden geändert werden können. Mit Geth können Sie zum Beispiel modifizierbare Methoden mit einem Flag deklarieren: `--http.api web3,eth,txpool`. -Der Zugriff auf die RPC-Schnittstelle kann durch die Entwicklung von Edge-Layer-APIs oder Webserver-Anwendungen wie Nginx und deren Verbindung mit der lokalen Adresse und dem Port Ihres Clients erweitert werden. Die Nutzung einer Middle-Layer kann Entwicklern auch die Möglichkeit geben, ein Zertifikat für sichere `https`-Verbindungen zur RPC-Schnittstelle einzurichten. +Der Zugriff auf die RPC-Schnittstelle kann durch die Entwicklung von Edge-Layer-APIs oder Webserver-Anwendungen wie Nginx und deren Verbindung mit der lokalen Adresse und dem Port Ihres Clients erweitert werden. Die Nutzung einer Zwischenschicht kann Entwicklern auch die Möglichkeit geben, ein Zertifikat für sichere `https`-Verbindungen zur RPC-Schnittstelle einzurichten. -Die Einrichtung eines Webservers, eines Proxys oder einer nach außen gerichteten Rest-API ist nicht die einzige Möglichkeit, den Zugriff auf den RPC-Endpunkt Ihrer Node zu ermöglichen. Eine andere datenschutzfreundliche Möglichkeit, einen öffentlich erreichbaren Endpunkt einzurichten, ist das Hosten des Knotens auf einem eigenen [Tor](https://www.torproject.org/)-Onion-Dienst. Auf diese Weise können Sie den RPC außerhalb Ihres lokalen Netzes erreichen, ohne eine statische öffentliche IP-Adresse oder geöffnete Ports. Bei dieser Konfiguration kann der RPC-Endpunkt jedoch nur über das Tor-Netzwerk erreichbar sein, was nicht von allen Anwendungen unterstützt wird und zu Verbindungsproblemen führen kann. +Die Einrichtung eines Webservers, eines Proxys oder einer nach außen gerichteten Rest-API ist nicht die einzige Möglichkeit, den Zugriff auf den RPC-Endpunkt Ihrer Node zu ermöglichen. Eine weitere datenschutzfreundliche Möglichkeit, einen öffentlich erreichbaren Endpunkt einzurichten, ist das Hosten des Nodes auf Ihrem eigenen [Tor](https://www.torproject.org/) Onion-Service. Auf diese Weise können Sie den RPC außerhalb Ihres lokalen Netzes erreichen, ohne eine statische öffentliche IP-Adresse oder geöffnete Ports. Bei dieser Konfiguration kann der RPC-Endpunkt jedoch nur über das Tor-Netzwerk erreichbar sein, was nicht von allen Anwendungen unterstützt wird und zu Verbindungsproblemen führen kann. -Dazu müssen Sie Ihren eigenen [Onion-Service](https://community.torproject.org/onion-services/) erstellen. Schauen Sie sich [die Dokumentation](https://community.torproject.org/onion-services/setup/) über die Einrichtung des Onion-Services an, um Ihren eigenen zu hosten. Sie können ihn auf einen Webserver mit Proxy zum RPC-Port oder direkt auf den RPC verweisen. +Dazu müssen Sie Ihren eigenen [Onion-Service](https://community.torproject.org/onion-services/) erstellen. Lesen Sie [die Dokumentation](https://community.torproject.org/onion-services/setup/) zur Einrichtung eines Onion-Dienstes, um Ihren eigenen zu hosten. Sie können ihn auf einen Webserver mit Proxy zum RPC-Port oder direkt auf den RPC verweisen. -Eine der beliebtesten Möglichkeiten, Zugang zu internen Netzen zu erhalten, ist schließlich eine VPN-Verbindung. Je nach Anwendungsfall und der Anzahl der Benutzer, die Zugang zu Ihrem Knoten benötigen, könnte eine sichere VPN-Verbindung eine Option sein. [OpenVPN](https://openvpn.net/) ist ein SSL-VPN mit vollem Funktionsumfang, das eine sichere Netzwerkerweiterung auf OSI-Ebene 2 oder 3 unter Verwendung des Branchenstandards SSL/TLS-Protokoll implementiert, flexible Client-Authentifizierungsmethoden auf der Grundlage von Zertifikaten, Smartcards und/oder Benutzername/Passwort-Anmeldeinformationen unterstützt und benutzer- oder gruppenspezifische Zugriffskontrollrichtlinien unter Verwendung von Firewall-Regeln für die virtuelle VPN-Schnittstelle ermöglicht. +Eine der beliebtesten Möglichkeiten, Zugang zu internen Netzen zu erhalten, ist schließlich eine VPN-Verbindung. Je nach Anwendungsfall und der Anzahl der Benutzer, die Zugang zu Ihrem Knoten benötigen, könnte eine sichere VPN-Verbindung eine Option sein. OpenVPN ist ein SSL-VPN mit vollem Funktionsumfang, das eine sichere Netzwerkerweiterung auf OSI-Ebene 2 oder 3 unter Verwendung des Branchenstandards SSL/TLS-Protokoll implementiert, flexible Client-Authentifizierungsmethoden auf der Grundlage von Zertifikaten, Smartcards und/oder Benutzername/Passwort-Anmeldeinformationen unterstützt und benutzer- oder gruppenspezifische Zugriffskontrollrichtlinien unter Verwendung von Firewall-Regeln für die virtuelle VPN-Schnittstelle ermöglicht. -### Betreiben des Knotens {#operating-the-node} +### Betreiben des Nodes {#operating-the-node} Sie sollten Ihren Knoten regelmäßig überwachen, um sicherzustellen, dass er ordnungsgemäß funktioniert. Möglicherweise müssen Sie gelegentlich Wartungsarbeiten durchführen. -#### Eine Node online lassen {#keeping-node-online} +#### Einen Node online halten {#keeping-node-online} Ihr Knoten muss nicht die ganze Zeit online sein, Sie sollten ihn jedoch so oft wie möglich online lassen, damit er sich mit dem Netzwerk synchronisieren kann. Sie können ihn ausschalten, um ihn neu zu starten, bedenken Sie jedoch Folgendes: @@ -436,45 +439,46 @@ Ihr Knoten muss nicht die ganze Zeit online sein, Sie sollten ihn jedoch so oft - Erzwungene Abschaltungen können die Datenbank beschädigen, so dass Sie den gesamten Knoten neu synchronisieren müssen. - Ihr Client wird nicht mehr mit dem Netzwerk synchronisiert und muss neu synchronisiert werden, wenn Sie ihn neu starten. Die Synchronisation des Knotens kann zwar an dem Punkt beginnen, an dem er zuletzt heruntergefahren wurde, aber je nachdem, wie lange er offline war, kann der Prozess einige Zeit dauern. -_Dies gilt nicht für Validierungsknoten auf Konsensebene._ Wenn Sie Ihren Knoten offline schalten, wirkt sich dies auf alle von ihm abhängigen Dienste aus. Wenn Sie einen Node für _Sicherungszwecke_ betreiben, sollten Sie versuchen, die Ausfallzeiten so gering wie möglich zu halten. +_Dies gilt nicht für Validator-Nodes der Konsensebene._ Wenn Sie Ihren Node offline schalten, wirkt sich dies auf alle von ihm abhängigen Dienste aus. Wenn Sie einen Node für _Staking_-Zwecke betreiben, sollten Sie versuchen, die Ausfallzeiten so gering wie möglich zu halten. -#### Erstellung von Client-Diensten {#creating-client-services} +#### Erstellen von Client-Diensten {#creating-client-services} -Erwägen Sie die Einrichtung eines Dienstes, der Ihren Client automatisch beim Start ausführt. Auf Linux-Servern wäre es zum Beispiel eine gute Praxis, einen Dienst zu erstellen, z. B. mit `systemd`, der den Client mit der richtigen Konfiguration unter einem Benutzer mit begrenzten Rechten ausführt und automatisch neu startet. +Erwägen Sie die Einrichtung eines Dienstes, der Ihren Client automatisch beim Start ausführt. Auf Linux-Servern wäre es zum Beispiel eine gute Praxis, einen Dienst, z. B. mit `systemd`, zu erstellen, der den Client mit der richtigen Konfiguration unter einem Benutzer mit begrenzten Rechten ausführt und automatisch neu startet. -#### Aktualisieren von Clients {#updating-clients} +#### Clients aktualisieren {#updating-clients} -Sie müssen Ihre Client-Software mit den neuesten Sicherheitspatches, Funktionen und [EIPs](/eips/) auf dem neuesten Stand halten. Besonders vor [Hard Forks](/ethereum-forks/) sollten Sie sicherstellen, dass Sie die richtigen Client-Versionen verwenden. +Sie müssen Ihre Client-Software mit den neuesten Sicherheitspatches, Funktionen und [EIPs](/eips/) auf dem neuesten Stand halten. Stellen Sie insbesondere vor [Hard Forks](/ethereum-forks/) sicher, dass Sie die richtigen Client-Versionen verwenden. -> Vor wichtigen Netzwerk-Updates veröffentlicht EF einen Beitrag in seinem [Blog](https://blog.ethereum.org). Sie können [diese Ankündigungen abonnieren](https://blog.ethereum.org/category/protocol#subscribe), um eine Benachrichtigung per E-Mail zu erhalten, wenn Ihr Node eine Aktualisierung benötigt. +> Vor wichtigen Netzwerk-Updates veröffentlicht die EF einen Beitrag in ihrem [Blog](https://blog.ethereum.org). Sie können [diese Ankündigungen abonnieren](https://blog.ethereum.org/category/protocol#subscribe), um eine Benachrichtigung per E-Mail zu erhalten, wenn Ihr Node eine Aktualisierung benötigt. Die Aktualisierung der Clients ist sehr einfach. Jeder Client hat spezifische Anweisungen in seiner Dokumentation, im Allgemeinen besteht das Verfahren jedoch nur darin, die neueste Version herunterzuladen und den Client mit der neuen ausführbaren Datei neu zu starten. Der Client sollte dort weitermachen, wo er aufgehört hat, jedoch mit den vorgenommenen Aktualisierungen. Jede Client-Implementierung hat eine von Menschen lesbare Versionszeichenfolge, die im Peer-to-Peer-Protokoll verwendet wird, aber auch über die Befehlszeile zugänglich ist. Anhand dieses Versionsstrings können die Nutzer überprüfen, ob sie die richtige Version verwenden. Außerdem ermöglicht er es Blockexplorern und anderen Analysewerkzeugen eine quantitative Analyse der Verteilung bestimmter Clients im Netz. Weitere Informationen zu den Versionsstrings finden Sie in der jeweiligen Client-Dokumentation. -#### Ausführung zusätzlicher Dienste {#running-additional-services} +#### Ausführen zusätzlicher Dienste {#running-additional-services} Wenn Sie einen eigenen Knoten betreiben, können Sie Dienste nutzen, die einen direkten Zugang zum Ethereum-Client-RPC erfordern. Dabei handelt es sich um Dienste, die auf Ethereum aufbauen, wie [Layer-2-Lösungen](/developers/docs/scaling/#layer-2-scaling), Backend für Wallets, Block-Explorer, Entwicklertools und andere Ethereum-Infrastruktur. -#### Überwachung des Knotens {#monitoring-the-node} +#### Überwachen des Nodes {#monitoring-the-node} Um Ihren Knoten ordnungsgemäß zu überwachen, sollten Sie Metriken sammeln. Clients stellen Metrik-Endpunkte bereit, damit Sie umfassende Daten über Ihren Knoten erhalten können. Verwenden Sie Tools wie [InfluxDB](https://www.influxdata.com/get-influxdb/) oder [Prometheus](https://prometheus.io/), um Datenbanken zu erstellen, die Sie in Software wie [Grafana](https://grafana.com/) in Visualisierungen und Diagramme umwandeln können. Es gibt viele Setups für die Verwendung dieser Software und verschiedene Grafana-Dashboards, mit denen Sie Ihre Knoten und das Netzwerk als Ganzes visualisieren können. Sehen Sie sich zum Beispiel das [Tutorial zur Überwachung von Geth](/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/) an. Behalten Sie im Rahmen der Überwachung auch die Leistung Ihres Rechners im Auge. Während der ersten Synchronisierung Ihres Knotens kann die Client-Software sehr viel CPU und RAM beanspruchen. Zusätzlich zu Grafana können Sie dafür die Tools Ihres Betriebssystems wie `htop` oder `uptime` verwenden. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Leitfaden für Ethereum Staking](https://github.com/SomerEsat/ethereum-staking-guides) - _Somer Esat, häufig aktualisiert_ -- [Anleitung | Einrichtung eines Validators für das Staken auf dem Ethereum Mainnet](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _- CoinCashew, regelmäßig aktualisiert_ -- [ETHStaker-Anleitungen zum Ausführen von Validatoren in Testnetzwerken](https://github.com/remyroy/ethstaker#guides) - _ETHStaker, regelmäßig aktualisiert_ -- [FAQ zur Zusammenführung für Knotenbetreiber](https://notes.ethereum.org/@launchpad/node-faq-merge) - _Juli 2022_ -- [Analyzing the hardware requirements to be an Ethereum full validated node](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau, 24. September 2018_ -- [Running Ethereum Full Nodes: A Guide for the Barely Motivated](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7. November 2019_ -- [Running a Hyperledger Besu Node on the Ethereum Mainnet: Benefits, Requirements, and Setup](https://pegasys.tech/running-a-hyperledger-besu-node-on-the-ethereum-mainnet-benefits-requirements-and-setup/) _– Felipe Faraggi, 7. Mai 2020_ -- [Deploying Nethermind Ethereum Client with Monitoring Stack](https://medium.com/nethermind-eth/deploying-nethermind-ethereum-client-with-monitoring-stack-55ce1622edbd) _– Nethermind.eth, 8. Juli 2020_ +- [Ethereum Staking Guides](https://github.com/SomerEsat/ethereum-staking-guides) – _Somer Esat, wird häufig aktualisiert_ +- [Anleitung | Wie man einen Validator für Ethereum Staking auf Mainnet einrichtet](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _– CoinCashew, wird häufig aktualisiert_ +- [ETHStaker-Anleitungen zum Ausführen von Validatoren in Testnets](https://github.com/remyroy/ethstaker#guides) – _ETHStaker, wird regelmäßig aktualisiert_ +- [Beispiel AWS Blockchain Node Runner App für Ethereum Nodes](https://aws-samples.github.io/aws-blockchain-node-runners/docs/Blueprints/Ethereum) – _AWS, wird häufig aktualisiert_ +- [The Merge FAQ für Node-Betreiber](https://notes.ethereum.org/@launchpad/node-faq-merge) – _Juli 2022_ +- [Analyse der Hardware-Anforderungen für einen Ethereum Full Validated Node](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau, 24. September 2018_ +- [Ethereum Full Nodes betreiben: Eine Anleitung für die kaum Motivierten](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7. November 2019_ +- [Einen Hyperledger Besu Node auf dem Ethereum Mainnet betreiben: Vorteile, Anforderungen und Einrichtung](https://pegasys.tech/running-a-hyperledger-besu-node-on-the-ethereum-mainnet-benefits-requirements-and-setup/) _– Felipe Faraggi, 7. Mai 2020_ +- [Bereitstellung des Nethermind Ethereum Client mit Monitoring Stack](https://medium.com/nethermind-eth/deploying-nethermind-ethereum-client-with-monitoring-stack-55ce1622edbd) _– Nethermind.eth, 8. Juli 2020_ ## Verwandte Themen {#related-topics} -- [Knotenpunkte und Clients](/developers/docs/nodes-and-clients/) +- [Nodes und Clients](/developers/docs/nodes-and-clients/) - [Blöcke](/developers/docs/blocks/) - [Netzwerke](/developers/docs/networks/) diff --git a/public/content/translations/de/developers/docs/oracles/index.md b/public/content/translations/de/developers/docs/oracles/index.md index 3c0e168f684..315bd1e9376 100644 --- a/public/content/translations/de/developers/docs/oracles/index.md +++ b/public/content/translations/de/developers/docs/oracles/index.md @@ -1,109 +1,116 @@ --- -title: Oracles -description: Oracles helfen dabei, Daten aus der realen Welt in Ihre Ethereum-Anwendung zu bringen, da Smart Contracts die realen Daten nicht allein abfragen können. +title: Orakel +description: Orakel ermöglichen Ethereum-Smart-Contracts den Zugang zu Daten aus der realen Welt, was mehr Anwendungsfälle und einen größeren Nutzen für die Benutzer freischaltet. lang: de --- -Oracles sind Anwendungen, die Datenfeeds bereitstellen und Offchain-Datenquellen für die Blockchain und Smart Contracts verfügbar machen. Das ist notwendig, weil Ethereum-basierte Smart Contracts standardmäßig keinen Zugriff auf Informationen außerhalb des Blockchain-Netzwerks haben. +Oracles sind Anwendungen, die Datenfeeds erstellen, um Off-Chain-Datenquellen für Smart Contracts auf der Blockchain verfügbar zu machen. Dies ist notwendig, da Ethereum-basierte Smart Contracts standardmäßig nicht auf Informationen zugreifen können, die außerhalb des Blockchain-Netzwerks gespeichert sind. -Indem Smart Contracts die Möglichkeit erhalten, mit Offchain-Daten zu arbeiten, wird der Nutzen und Wert dezentraler Anwendungen erheblich gesteigert. Beispielsweise verlassen sich Onchain-Vorhersagemärkte auf Oracles, um Informationen über Ereignisse zu liefern, die zur Validierung von Nutzerprognosen verwendet werden. Wenn Alice zum Beispiel 20 ETH darauf wettet, wer der nächste US-Präsident wird, benötigt die Vorhersagemarkt-dApp ein Oracle, um das Wahlergebnis zu bestätigen und zu bestimmen, ob Alice eine Auszahlung erhält. +Durch die Möglichkeit, dass Smart Contracts mit Off-Chain-Daten ausgeführt werden können, wird die Nützlichkeit und der Wert dezentralisierter Anwendungen erweitert. Zum Beispiel stützen sich On-Chain-Prognosemärkte auf Orakel, um Informationen über Ergebnisse bereitzustellen, die sie zur Überprüfung von Benutzervorhersagen verwenden. Angenommen, Alice setzt 20 ETH darauf, wer der nächste US-Präsident wird. Präsident. In diesem Fall benötigt die Vorhersage-Markt-Dapp ein Orakel, um die Wahlergebnisse zu bestätigen und zu ermitteln, ob Alice für eine Auszahlung in Frage kommt. ## Voraussetzungen {#prerequisites} -Diese Seite setzt voraus, dass Sie mit den Grundlagen von Ethereum vertraut sind, einschließlich [Nodes](/developers/docs/nodes-and-clients/), [Konsensmechanismen](/developers/docs/consensus-mechanisms/) und der [EVM](/developers/docs/evm/). Sie sollten außerdem ein gutes Verständnis von [Smart Contracts](/developers/docs/smart-contracts/) und [Smart Contract Anatomie](/developers/docs/smart-contracts/anatomy/), insbesondere von [Events](/glossary/#events), haben. +Diese Seite setzt voraus, dass der Leser mit den Grundlagen von Ethereum vertraut ist, einschließlich [Nodes](/developers/docs/nodes-and-clients/), [Konsensmechanismen](/developers/docs/consensus-mechanisms/) und der [EVM](/developers/docs/evm/). Sie sollten auch ein gutes Verständnis von [Smart Contracts](/developers/docs/smart-contracts/) und der [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) haben, insbesondere von [Ereignissen](/glossary/#events). -## Was ist ein Blockchain-Oracle? {#what-is-a-blockchain-oracle} +## Was ist ein Blockchain-Orakel? {#what-is-a-blockchain-oracle} -Oracles sind Anwendungen, die externe Informationen (d.h. Offchain-Daten) beschaffen, verifizieren und an Smart Contracts auf der Blockchain übermitteln. Neben dem "Abrufen" von Offchain-Daten und deren Veröffentlichung auf Ethereum können Oracles auch Informationen von der Blockchain an externe Systeme "senden", z. B. das Öffnen eines Smart Locks, nachdem ein Nutzer eine Gebühr per Ethereum-Transaktion bezahlt hat. +Oracles sind Anwendungen, die externe Informationen (d. h. Offchain gespeicherte Informationen) beschaffen, überprüfen und an Smart Contracts übermitteln, die auf der Blockchain ausgeführt werden. Neben dem „Abrufen“ von Off-Chain-Daten und dem Übertragen auf Ethereum können Orakel auch Informationen von der Blockchain an externe Systeme „pushen“, z. B. ein Smart Lock entsperren, sobald der Benutzer eine Gebühr über eine Ethereum-Transaktion sendet. -Ohne ein Oracle wären Smart Contracts ausschließlich auf Onchain-Daten beschränkt. +Ohne ein Oracle wäre ein Smart Contract vollständig auf On-Chain-Daten beschränkt. -Oracles unterscheiden sich je nach Datenquelle (einzelne oder mehrere Quellen), Vertrauensmodell (zentralisiert oder dezentralisiert) und Systemarchitektur (Sofortabfrage, Publish-Subscribe, Request-Response). Außerdem kann man zwischen Oracles unterscheiden, die externe Daten für Onchain-Verträge bereitstellen (Input-Oracles), Informationen von der Blockchain an Offchain-Anwendungen senden (Output-Oracles) oder Offchain-Berechnungen durchführen (Computational Oracles). +Orakles unterscheiden sich in Bezug auf die Datenquelle (eine oder mehrere Quellen), Vertrauensmodelle (zentralisiert oder dezentralisiert) und Systemarchitektur (sofort-lesen, publish-subscribe und request-response). Wir können auch zwischen Orakeln unterscheiden, je nachdem, ob sie externe Daten für die Nutzung durch On-Chain-Verträge abrufen (Input-Orakel), Informationen von der Blockchain zu Off-Chain-Anwendungen senden (Output-Orakel) oder rechnerische Aufgaben außerhalb der Blockchain ausführen (Computational-Orakel). -## Warum brauchen Smart Contracts Oracles? {#why-do-smart-contracts-need-oracles} +## Warum benötigen Smart Contracts Orakel? {#why-do-smart-contracts-need-oracles} -Viele Entwickler sehen Smart Contracts als Code, der an bestimmten Adressen auf der Blockchain läuft. Allgemeiner betrachtet sind Smart Contracts jedoch [selbstausführende Softwareprogramme](/smart-contracts/), die Vereinbarungen zwischen Parteien automatisch durchsetzen, sobald bestimmte Bedingungen erfüllt sind – daher der Begriff "Smart Contract". +Viele Entwickler betrachten Smart Contracts als Code, der an spezifischen Adressen auf der Blockchain ausgeführt wird. Eine [allgemeinere Sichtweise auf Smart Contracts](/smart-contracts/) ist jedoch, dass es sich um selbstausführende Softwareprogramme handelt, die in der Lage sind, Vereinbarungen zwischen Parteien durchzusetzen, sobald bestimmte Bedingungen erfüllt sind – daher der Begriff „Smart Contracts“. -Die Nutzung von Smart Contracts zur Durchsetzung von Vereinbarungen ist jedoch nicht trivial, da Ethereum deterministisch ist. Ein [deterministisches System](https://en.wikipedia.org/wiki/Deterministic_algorithm) liefert bei gleichem Anfangszustand und gleicher Eingabe immer das gleiche Ergebnis – es gibt keine Zufälligkeit oder Variation im Prozess der Berechnung von Ausgaben aus Eingaben. +Die Verwendung von Smart Contracts zur Durchsetzung von Vereinbarungen zwischen Personen ist aufgrund der Deterministik von Ethereum nicht einfach. Ein [deterministisches System](https://en.wikipedia.org/wiki/Deterministic_algorithm) ist eines, das bei einem gegebenen Anfangszustand und einer bestimmten Eingabe immer die gleichen Ergebnisse liefert, was bedeutet, dass es bei der Berechnung von Ausgaben aus Eingaben keine Zufälligkeit oder Variation gibt. -Um deterministische Ausführung zu gewährleisten, beschränken Blockchains die Nodes darauf, Konsens nur auf Basis von Onchain-Daten über einfache Ja/Nein-Fragen zu erzielen. Beispiele: +Um eine deterministische Ausführung zu erreichen, beschränken Blockchains die Nodes darauf, einen Konsens über einfache binäre (wahr/falsch) Fragen zu erzielen, indem sie _ausschließlich_ Daten verwenden, die auf der Blockchain selbst gespeichert sind. Beispiele für solche Fragen umfassen: -- "Hat der Kontoinhaber (identifiziert durch einen Public Key) diese Transaktion mit dem zugehörigen Private Key signiert?" -- "Hat dieses Konto genügend Guthaben für die Transaktion?" -- "Ist diese Transaktion im Kontext dieses Smart Contracts gültig?" +- „Hat der Kontoinhaber (identifiziert durch einen öffentlichen Schlüssel) diese Transaktion mit dem zugehörigen privaten Schlüssel signiert?“ +- „Verfügt dieses Konto über ausreichende Mittel, um die Transaktion abzudecken?“ +- „Ist diese Transaktion im Kontext dieses Smart Contracts gültig?“, usw. -Wenn Blockchains Informationen aus externen Quellen beziehen würden, wäre Determinismus nicht mehr möglich, und die Nodes könnten sich nicht mehr auf die Gültigkeit von Statusänderungen einigen. Ein Beispiel: Ein Smart Contract, der eine Transaktion auf Basis des aktuellen ETH-USD-Kurses aus einer traditionellen Preis-API ausführt. Dieser Wert ändert sich häufig (und die API könnte veraltet oder kompromittiert werden), sodass Nodes, die denselben Contract-Code ausführen, zu unterschiedlichen Ergebnissen kommen könnten. +Wenn Blockchains Informationen von externen Quellen (d.h. aus der realen Welt) erhielten, wäre eine deterministische Ausführung unmöglich zu erreichen, was die Nodes daran hindern würde, sich über die Gültigkeit von Änderungen am Zustand der Blockchain einig zu werden. Nehmen Sie zum Beispiel einen Smart Contract, der eine Transaktion basierend auf dem aktuellen ETH-USD Wechselkurs ausführt, der von einer traditionellen Preis-API bezogen wird. Diese Zahl wird wahrscheinlich häufig ändern (ganz zu schweigen davon, dass die API veraltet oder gehackt werden könnte), was bedeutet, dass Knoten, die denselben Vertragscode ausführen, zu unterschiedlichen Ergebnissen kommen würden. -Für eine öffentliche Blockchain wie Ethereum, mit Tausenden von Nodes weltweit, ist Determinismus entscheidend. Ohne zentrale Autorität als Wahrheitsquelle benötigen die Nodes Mechanismen, um nach denselben Transaktionen zum gleichen Status zu gelangen. Wenn Node A den Code eines Smart Contracts ausführt und "3" erhält, während Node B "7" erhält, würde der Konsens zusammenbrechen und Ethereum seinen Wert als dezentrale Plattform verlieren. +Für eine öffentliche Blockchain wie Ethereum, mit Tausenden von Nodes weltweit, die Transaktionen verarbeiten, ist Determinismus von entscheidender Bedeutung. Ohne eine zentrale Autorität als Quelle der Wahrheit benötigen Nodes Mechanismen, um nach der Anwendung derselben Transaktionen zum gleichen Zustand zu gelangen. Ein Fall, in dem Node A einen Smart Contract ausführt und als Ergebnis "3" erhält, während Node B "7" erhält, nachdem er dieselbe Transaktion ausgeführt hat, würde den Konsens zusammenbrechen lassen und den Wert von Ethereum als dezentralisierte Computing-Plattform zunichte machen. -Dieses Szenario zeigt auch das Problem, wenn Blockchains selbstständig Informationen aus externen Quellen abrufen würden. Oracles lösen dieses Problem, indem sie Informationen aus Offchain-Quellen nehmen und auf der Blockchain speichern, sodass Smart Contracts sie nutzen können. Da Onchain-Daten unveränderlich und öffentlich sind, können Ethereum-Nodes die von Oracles importierten Offchain-Daten sicher verwenden, ohne den Konsens zu gefährden. +Dieses Szenario hebt auch das Problem hervor, das mit dem Entwurf von Blockchains entsteht, um Informationen aus externen Quellen zu beziehen. Orakel lösen dieses Problem jedoch, indem sie Informationen aus Off-Chain-Quellen entnehmen und diese auf der Blockchain speichern, damit Smart Contracts sie nutzen können. Da auf der Blockchain gespeicherte Informationen unveränderlich und öffentlich zugänglich sind, können Ethereum-Nodes die vom Oracle importierten Off-Chain-Daten sicher verwenden, um Zustandsänderungen zu berechnen, ohne den Konsens zu brechen. -Dazu besteht ein Oracle typischerweise aus einem Onchain-Smart-Contract und einigen Offchain-Komponenten. Der Onchain-Contract erhält Datenanfragen von anderen Smart Contracts und leitet sie an die Offchain-Komponente (das Oracle-Node) weiter. Dieses kann Datenquellen abfragen (z. B. per API) und Transaktionen senden, um die angeforderten Daten im Smart Contract zu speichern. +Um dies zu erreichen, besteht ein Oracle in der Regel aus einem Smart Contract, der auf der Blockchain läuft, und einigen Off-Chain-Komponenten. Der On-Chain-Vertrag erhält Anfragen nach Daten von anderen Smart Contracts, die er an die Off-Chain-Komponente (auch Oracle-Node genannt) weiterleitet. Dieser Oracle-Node kann Datenquellen abfragen – beispielsweise unter Verwendung von Anwendungsprogrammierschnittstellen (APIs) – und Transaktionen senden, um die angeforderten Daten im Speicher des Smart Contracts zu speichern. -Im Wesentlichen überbrückt ein Blockchain-Oracle die Informationslücke zwischen Blockchain und externer Welt und ermöglicht sogenannte "hybride Smart Contracts", die sowohl Onchain-Code als auch Offchain-Infrastruktur nutzen. Dezentrale Vorhersagemärkte sind ein gutes Beispiel für hybride Smart Contracts. Weitere Beispiele sind etwa Versicherungsverträge, die bei bestimmten Wetterereignissen automatisch auszahlen. +Im Wesentlichen überbrückt ein Blockchain-Oracle die Informationslücke zwischen der Blockchain und der externen Umgebung, wodurch „hybride Smart Contracts“ entstehen. Ein hybrider Smart Contract ist einer, der auf einer Kombination aus On-Chain-Vertragscode und Off-Chain-Infrastruktur basiert. Dezentrale Prognosemärkte sind ein hervorragendes Beispiel für hybride Smart Contracts. Andere Beispiele könnten Smart Contracts für Ernteversicherungen sein, die eine Zahlung leisten, wenn eine Gruppe von Orakeln feststellt, dass bestimmte Wetterphänomene eingetreten sind. -## Das Oracle-Problem {#the-oracle-problem} +## Was ist das Oracle-Problem? Das Oracle-Problem {#the-oracle-problem} -Oracles lösen ein wichtiges Problem, bringen aber auch neue Herausforderungen mit sich, z. B.: +Orakel lösen ein wichtiges Problem, führen aber auch einige Komplikationen ein, zum Beispiel.,: -- Wie kann man sicherstellen, dass die eingefügten Informationen aus der richtigen Quelle stammen und nicht manipuliert wurden? -- Wie kann man gewährleisten, dass diese Daten immer verfügbar und regelmäßig aktualisiert werden? +- Wie können wir überprüfen, dass die eingespeiste Information aus der richtigen Quelle extrahiert wurde oder nicht manipuliert wurde? -Das sogenannte "Oracle-Problem" beschreibt die Schwierigkeiten, die mit der Nutzung von Oracles für Smart Contracts einhergehen. Die von einem Oracle gelieferten Daten müssen korrekt sein, damit ein Smart Contract korrekt ausgeführt wird. Zudem untergräbt das Vertrauen in Oracle-Betreiber das "Trustless"-Prinzip von Smart Contracts. +- Wie stellen wir sicher, dass diese Daten immer verfügbar sind und regelmäßig aktualisiert werden? -Verschiedene Oracles bieten unterschiedliche Lösungen für das Oracle-Problem, die wir später betrachten. Oracles werden typischerweise danach bewertet, wie gut sie folgende Herausforderungen meistern: +Das sogenannte "Orakle-Problem" zeigt die Probleme auf, die mit der Verwendung von Blockchain-Orakeln zur Übermittlung von Eingaben an Smart Contracts verbunden sind. Die Daten von einem Orakel müssen korrekt sein, damit ein Smart Contract korrekt ausgeführt wird. Darüber hinaus untergräbt das notwendige 'Vertrauen' in die Betreiber von Orakeln, genaue Informationen zu liefern, den 'vertrauenslosen' Aspekt von Smart Contracts. -1. **Korrektheit**: Ein Oracle sollte keine Statusänderungen auf Basis ungültiger Offchain-Daten auslösen. Es muss die _Authentizität_ und _Integrität_ der Daten garantieren. Authentizität bedeutet, dass die Daten aus der richtigen Quelle stammen, Integrität, dass sie vor der Onchain-Übertragung nicht verändert wurden. -2. **Verfügbarkeit**: Ein Oracle sollte Smart Contracts nicht daran hindern, Aktionen auszuführen. Die Daten müssen _auf Anfrage_ ohne Unterbrechung verfügbar sein. -3. **Anreizkompatibilität**: Ein Oracle sollte Offchain-Datenanbieter dazu motivieren, korrekte Informationen zu liefern. Dazu gehören _Zurechenbarkeit_ und _Verantwortlichkeit_. +Different oracles offer different solutions to the oracle problem, which we explore later. Orakel werden typischerweise danach bewertet, wie gut sie die folgenden Herausforderungen bewältigen können: -## Wie funktioniert ein Blockchain-Oracle-Service? {#how-does-a-blockchain-oracle-service-work} +1. **Korrektheit**: Ein Oracle sollte nicht dazu führen, dass Smart Contracts Zustandsänderungen auf Basis ungültiger Off-Chain-Daten auslösen. Ein Orakel muss die _Authentizität_ und _Integrität_ der Daten gewährleisten. Authentizität bedeutet, dass die Daten aus der richtigen Quelle stammen, während Integrität bedeutet, dass die Daten intakt geblieben sind (d. h. nicht verändert wurden), bevor sie onchain gesendet wurden. -### Nutzer (Users) {#users} +2. **Verfügbarkeit**: Ein Orakel sollte keine Verzögerungen verursachen oder die Ausführung von Aktionen und das Auslösen von Zustandsänderungen durch Smart Contracts verhindern. Das bedeutet, dass die Daten von einem Orakel _auf Anfrage_ ohne Unterbrechung verfügbar sein müssen. -Nutzer sind Entitäten (z. B. Smart Contracts), die externe Informationen benötigen, um bestimmte Aktionen auszuführen. Der grundlegende Ablauf eines Oracle-Services beginnt damit, dass der Nutzer eine Datenanfrage an den Oracle-Contract sendet. Datenanfragen beantworten meist folgende Fragen: +3. **Anreizkompatibilität**: Ein Oracle sollte Off-Chain-Datenanbieter dazu anreizen, korrekte Informationen an Smart Contracts zu übermitteln. Anreizkompatibilität beinhaltet _Zurechenbarkeit_ und _Rechenschaftspflicht_. Zurechenbarkeit ermöglicht die Verknüpfung eines Stücks externer Information mit ihrem Anbieter, während Verantwortlichkeit die Datenanbieter an die von ihnen gelieferten Informationen bindet, sodass sie basierend auf der Qualität der bereitgestellten Informationen belohnt oder bestraft werden können. -1. Welche Quellen können Offchain-Nodes für die angeforderten Informationen konsultieren? -2. Wie verarbeiten Reporter die Informationen aus den Datenquellen und extrahieren relevante Datenpunkte? -3. Wie viele Oracle-Nodes können an der Datenbeschaffung teilnehmen? -4. Wie werden Abweichungen in den Oracle-Berichten gehandhabt? -5. Welche Methode wird zur Filterung und Aggregation der Berichte verwendet? +## Wie funktioniert ein Blockchain-Orakel-Dienst? Wie funktioniert ein Blockchain-Oracle-Service? {#how-does-a-blockchain-oracle-service-work} -### Oracle-Contract {#oracle-contract} +### Benutzer {#users} -Der Oracle-Contract ist die Onchain-Komponente des Oracle-Services. Er hört auf Datenanfragen anderer Contracts, leitet Datenanfragen an Oracle-Nodes weiter und gibt die zurückgegebenen Daten an die Client-Contracts weiter. Der Contract kann auch Berechnungen an den zurückgegebenen Daten durchführen, um einen aggregierten Wert zu liefern. +Benutzer sind Entitäten (d.h. Smart Contracts), die Informationen benötigen, die extern zur Blockchain liegen, um bestimmte Aktionen abzuschließen. Der grundlegende Arbeitsablauf eines Orakel-Dienstes beginnt damit, dass der Benutzer eine Datenanfrage an den Orakel-Vertrag sendet. Datenanfragen werden gewöhnlich einige oder alle der folgenden Fragen beantworten: -Der Oracle-Contract stellt Funktionen bereit, die von Client-Contracts bei einer Datenanfrage aufgerufen werden. Nach Eingang einer neuen Anfrage löst der Smart Contract ein [Log-Event](/developers/docs/smart-contracts/anatomy/#events-and-logs) aus, das Offchain-Nodes benachrichtigt (meist per JSON-RPC `eth_subscribe`), die dann die im Log-Event definierten Daten abrufen. +1. Welche Quellen können Off-Chain-Nodes für die angeforderten Informationen konsultieren? -Hier ist ein [Beispiel-Oracle-Contract](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) von Pedro Costa. Dies ist ein einfacher Oracle-Service, der auf Anfrage anderer Smart Contracts Offchain-APIs abfragen und die angeforderten Informationen auf der Blockchain speichern kann: +2. Wie verarbeiten Reporter Informationen aus Datenquellen und extrahieren nützliche Datenpunkte? + +3. Wie viele Oracle Nodes können an der Datenabfrage teilnehmen? + +4. Wie sollten Diskrepanzen in Berichten von Orakeln verwaltet werden? + +5. Welche Methode sollte implementiert werden, um Einreichungen zu filtern und Berichte zu einem einzigen Wert zu aggregieren? + +### Oracle-Vertrag {#oracle-contract} + +Der Oracle-Vertrag ist die On-Chain-Komponente des Oracle-Dienstes. Der Oracle Contract ist die On-Chain-Komponente für den Oracle-Service. Dieser Vertrag kann auch einige Berechnungen auf den zurückgegebenen Datenpunkten durchführen, um einen aggregierten Wert zu erzeugen, der an den anfragenden Vertrag gesendet wird. + +Der Orakelvertrag stellt einige Funktionen bereit, die von Client-Verträgen aufgerufen werden, wenn eine Datenanfrage gestellt wird. Nach Erhalt einer neuen Anfrage gibt der Smart Contract ein [Log-Ereignis](/developers/docs/smart-contracts/anatomy/#events-and-logs) mit den Details der Datenanfrage aus. Dies benachrichtigt Offchain-Nodes, die das Protokoll abonniert haben (normalerweise mit etwas wie dem JSON-RPC-Befehl `eth_subscribe`), die dann die im Log-Ereignis definierten Daten abrufen. + +Nachfolgend finden Sie einen [Beispiel-Oracle-Vertrag](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) von Pedro Costa. Dies ist ein einfacher Oracle-Dienst, der auf Anfrage von anderen Smart Contracts Off-Chain-APIs abfragen und die angeforderten Informationen auf der Blockchain speichern kann: ```solidity pragma solidity >=0.4.21 <0.6.0; contract Oracle { - Request[] requests; //Liste der an den Contract gestellten Anfragen - uint currentId = 0; //steigende Anfrage-ID - uint minQuorum = 2; //minimale Anzahl von Antworten, die empfangen werden müssen, bevor das Endergebnis festgelegt wird - uint totalOracleCount = 3; //Fest codierte Anzahl der Oracles + Request[] requests; //Liste der an den Vertrag gestellten Anfragen + uint currentId = 0; //ansteigende Anforderungs-ID + uint minQuorum = 2; //Mindestanzahl der zu erhaltenden Antworten, bevor das Endergebnis deklariert wird + uint totalOracleCount = 3; // Fest programmierte Oracle-Anzahl - //definiert eine allgemeine API-Anfrage + // definiert eine allgemeine API-Anfrage struct Request { - uint id; //Anfrage-ID + uint id; //Anforderungs-ID string urlToQuery; //API-URL string attributeToFetch; //JSON-Attribut (Schlüssel), das in der Antwort abgerufen werden soll - string agreedValue; //Wert aus dem Schlüssel + string agreedValue; //Wert vom Schlüssel mapping(uint => string) answers; //von den Oracles bereitgestellte Antworten - mapping(address => uint) quorum; //Oracles, die die Antwort abfragen werden (1=Oracle hat nicht abgestimmt, 2=Oracle hat abgestimmt) + mapping(address => uint) quorum; //Oracles, die die Antwort abfragen (1=Oracle hat nicht abgestimmt, 2=Oracle hat abgestimmt) } - //Event, das das Oracle außerhalb der Blockchain auslöst + //Ereignis, das das Oracle außerhalb der Blockchain auslöst event NewRequest ( uint id, string urlToQuery, string attributeToFetch ); - //wird ausgelöst, wenn ein Konsens über das Endergebnis besteht + //wird ausgelöst, wenn ein Konsens über das Endergebnis erzielt wird event UpdatedRequest ( uint id, string urlToQuery, @@ -120,23 +127,23 @@ contract Oracle { uint length = requests.push(Request(currentId, _urlToQuery, _attributeToFetch, "")); Request storage r = requests[length-1]; - //Fest codierte Oracle-Adressen + // Fest programmierte Oracle-Adressen r.quorum[address(0x6c2339b46F41a06f09CA0051ddAD54D1e582bA77)] = 1; r.quorum[address(0xb5346CF224c02186606e5f89EACC21eC25398077)] = 1; r.quorum[address(0xa2997F1CA363D11a0a35bB1Ac0Ff7849bc13e914)] = 1; - //Event auslösen, das vom Oracle außerhalb der Blockchain erkannt wird + // ein Ereignis auslösen, das vom Oracle außerhalb der Blockchain erkannt wird emit NewRequest ( currentId, _urlToQuery, _attributeToFetch ); - //Anfrage-ID erhöhen + // Anforderungs-ID erhöhen currentId++; } - //wird vom Oracle aufgerufen, um seine Antwort zu registrieren + //vom Oracle aufgerufen, um seine Antwort aufzuzeichnen function updateRequest ( uint _id, string memory _valueRetrieved @@ -155,7 +162,7 @@ contract Oracle { uint tmpI = 0; bool found = false; while(!found) { - //erste leere Position finden + //ersten leeren Slot finden if(bytes(currRequest.answers[tmpI]).length == 0){ found = true; currRequest.answers[tmpI] = _valueRetrieved; @@ -165,8 +172,8 @@ contract Oracle { uint currentQuorum = 0; - //durch die Oracle-Liste iterieren und prüfen, ob genügend Oracles (minimales Quorum) - //für die gleiche Antwort wie die aktuelle gestimmt haben + //durch die Oracle-Liste iterieren und prüfen, ob genügend Oracles (Mindestquorum) + //für dieselbe Antwort wie die aktuelle gestimmt haben for(uint i = 0; i < totalOracleCount; i++){ bytes memory a = bytes(currRequest.answers[i]); bytes memory b = bytes(_valueRetrieved); @@ -191,127 +198,127 @@ contract Oracle { ### Oracle-Nodes {#oracle-nodes} -Das Oracle-Node ist die Offchain-Komponente des Oracle-Services. Es extrahiert Informationen aus externen Quellen (z. B. APIs von Drittanbietern) und bringt sie Onchain, damit Smart Contracts sie nutzen können. Oracle-Nodes hören auf Events des Onchain-Oracle-Contracts und führen die im Log beschriebenen Aufgaben aus. +Der Oracle-Node ist die Off-Chain-Komponente des Oracle-Dienstes. Er extrahiert Informationen aus externen Quellen, wie zum Beispiel APIs, die auf Drittanbieterservern gehostet werden, und stellt diese On-Chain für die Nutzung durch Smart Contracts bereit. Oracle-Nodes hören auf Ereignisse aus dem On-Chain-Oracle-Vertrag und führen die in der Protokollmeldung beschriebene Aufgabe aus. -Eine typische Aufgabe für Oracle-Nodes ist das Senden einer [HTTP GET](https://www.w3schools.com/tags/ref_httpmethods.asp)-Anfrage an einen API-Service, das Parsen der Antwort, das Formatieren in ein blockchain-lesbares Format und das Onchain-Senden per Transaktion an den Oracle-Contract. Das Oracle-Node kann auch verpflichtet sein, die Gültigkeit und Integrität der eingereichten Informationen durch "Authentizitätsnachweise" zu belegen. +Eine häufige Aufgabe für Oracle-Nodes ist das Senden einer [HTTP GET](https://www.w3schools.com/tags/ref_httpmethods.asp)-Anfrage an einen API-Dienst, das Parsen der Antwort, um relevante Daten zu extrahieren, das Formatieren in eine Blockchain-lesbare Ausgabe und das Senden onchain durch Einbindung in eine Transaktion an den Oracle-Vertrag. Der Orakel-Node kann auch verpflichtet sein, die Gültigkeit und Integrität der eingereichten Informationen mit „Echtheitsbeweisen“ zu bestätigen, die wir später näher betrachten. -Computational Oracles verlassen sich ebenfalls auf Offchain-Nodes, um Berechnungen durchzuführen, die Onchain zu teuer oder zu aufwendig wären (z. B. die Generierung verifizierbarer Zufallszahlen für Blockchain-Spiele). +Auch Computations-Oracles verlassen sich auf Off-Chain-Nodes, um rechenintensive Aufgaben auszuführen, die aufgrund von Gas-Kosten und Blockgrößenbeschränkungen nicht praktikabel On-Chain durchgeführt werden könnten. Zum Beispiel kann der Oracle-Node damit beauftragt werden, eine nachweislich zufällige Zahl zu generieren (z.B. für blockchain-basierte Spiele). ## Oracle-Designmuster {#oracle-design-patterns} -Es gibt drei Haupttypen von Oracles: Sofortabfrage, Publish-Subscribe und Request-Response. Die letzten beiden werden am häufigsten in Ethereum-Smart-Contracts verwendet. +Oracles gibt es in verschiedenen Typen, einschließlich _Immediate-Read_, _Publish-Subscribe_ und _Request-Response_, wobei die beiden letzteren bei Ethereum-Smart-Contracts am beliebtesten sind. Hier beschreiben wir kurz die Publish-Subscribe- und Request-Response-Modelle. -### Veröffentlichungs-Abonnement-Oracles {#publish-subscribe-oracles} +### Publish-Subscribe-Oracles {#publish-subscribe-oracles} -Diese Art von Oracle bietet "Datenfeeds" an, die von anderen Contracts regelmäßig gelesen werden können. Die Daten ändern sich häufig, und Client-Contracts müssen auf Datenaktualisierungen hören. Ein Beispiel ist ein ETH-USD-Preis-Oracle. +Dieser Typ von Oracle stellt einen "Datenfeed" zur Verfügung, den andere Verträge regelmäßig für Informationen abrufen können. In diesem Fall wird erwartet, dass sich die Daten häufig ändern, sodass die Client-Verträge auf Aktualisierungen der Daten im Speicher des Oracles achten müssen. Ein Beispiel ist ein Oracle, das Nutzern die neuesten ETH-USD-Preisinformationen zur Verfügung stellt. -### Anfrage-Antwort-Oracles {#request-response-oracles} +### Request-Response-Oracles {#request-response-oracles} -Ein Anfrage-Antwort-Setup ermöglicht es dem Client-Contract, beliebige Daten anzufordern, die nicht von einem Veröffentlichungs-Abonnement-Oracle bereitgestellt werden. Anfrage-Antwort-Oracles sind ideal, wenn der Datensatz zu groß ist, um im Speicher eines Smart Contracts gespeichert zu werden, und/oder Benutzer zu jedem Zeitpunkt nur einen kleinen Teil der Daten benötigen. +Ein Request-Response-Setup ermöglicht es dem Client-Vertrag, beliebige Daten anzufordern, die über die von einem Publish-Subscribe-Oracle bereitgestellten Daten hinausgehen. Request-Response-Oracles sind ideal, wenn der Datensatz zu groß ist, um im Speicher eines Smart Contracts gespeichert zu werden, und/oder die Nutzer zu jedem Zeitpunkt nur einen kleinen Teil der Daten benötigen. -Obwohl komplexer als Veröffentlichungs-Abonnement-Modelle, sind Anfrage-Antwort-Oracles im Wesentlichen das, was wir im vorherigen Abschnitt beschrieben haben. Das Oracle hat eine Onchain-Komponente, die eine Datenanfrage empfängt und an einen Offchain-Node zur Verarbeitung weiterleitet. +Obwohl komplexer als Publish-Subscribe-Modelle, sind Request-Response-Oracles im Grunde das, was wir im vorherigen Abschnitt beschrieben haben. Der Oracle wird eine On-Chain-Komponente haben, die eine Datenanfrage empfängt und diese an einen Off-Chain-Node zur Verarbeitung weiterleitet. -Benutzer, die Datenabfragen initiieren, müssen die Kosten für das Abrufen von Informationen aus der Offchain-Quelle tragen. Der Client-Contract muss auch Mittel bereitstellen, um die Gas-Kosten zu decken, die durch den Oracle-Contract bei der Rückgabe der Antwort über die in der Anfrage angegebene Callback-Funktion entstehen. +Benutzer, die Datenabfragen initiieren, müssen die Kosten für das Abrufen von Informationen aus der Off-Chain-Quelle übernehmen. Der Client-Vertrag muss auch Mittel bereitstellen, um die Gas-Kosten zu decken, die durch den Oracle-Vertrag beim Zurücksenden der Antwort über die in der Anfrage spezifizierte Callback-Funktion entstehen. -## Zentralisierte und dezentralisierte Oracles {#types-of-oracles} +## Zentralisierte vs. dezentralisierte Oracles {#types-of-oracles} ### Zentralisierte Oracles {#centralized-oracles} -Werden von einer einzelnen Entität kontrolliert, die für die Aggregation von Offchain-Informationen und die Aktualisierung der Onchain-Daten verantwortlich ist. Zentralisierte Oracles sind effizient, da sie sich auf eine einzige Wahrheitsquelle verlassen. Sie funktionieren möglicherweise besser in Fällen, in denen proprietäre Datensätze direkt vom Eigentümer mit einer allgemein akzeptierten Signatur veröffentlicht werden. Es gibt jedoch auch Nachteile: +Ein zentralisierter Oracle wird von einer einzigen Entität kontrolliert, die für das Sammeln von Off-Chain-Informationen und das Aktualisieren der Daten im Oracle-Vertrag auf Anfrage verantwortlich ist. Zentralisierte Oracles sind effizient, da sie sich auf eine einzige Wahrheitsquelle stützen. Sie können besser funktionieren in Fällen, in denen proprietäre Datensätze direkt vom Besitzer mit einer weit akzeptierten Signatur veröffentlicht werden. Sie bringen jedoch auch Nachteile mit sich: #### Geringe Korrektheitsgarantien {#low-correctness-guarantees} -Bei zentralisierten Oracles gibt es keine Möglichkeit zu überprüfen, ob die bereitgestellten Informationen korrekt sind oder nicht. Selbst "renommierte" Anbieter können sich ändern oder gehackt werden. Wenn das Oracle korrupt wird, werden Smart Contracts auf Basis falscher Daten ausgeführt. +Bei zentralisierten Orakeln gibt es keine Möglichkeit zu bestätigen, ob die bereitgestellten Informationen korrekt sind oder nicht. Selbst "renommierte" Anbieter können unzuverlässig werden oder gehackt werden. Wenn das Orakel korrupt wird, führen Smart Contracts Ausführungen auf Basis fehlerhafter Daten durch. #### Schlechte Verfügbarkeit {#poor-availability} -Zentralisierte Oracles garantieren nicht, dass Offchain-Daten immer für andere Smart Contracts verfügbar sind. Wenn der Anbieter beschließt, den Service abzuschalten oder ein Hacker die Offchain-Komponente des Oracles übernimmt, ist Ihr Smart Contract einem Denial-of-Service (DoS)-Angriff ausgesetzt. +Zentralisierte Oracles garantieren nicht, dass Off-Chain-Daten immer für andere Smart Contracts verfügbar gemacht werden. Wenn der Anbieter sich entscheidet, den Dienst abzuschalten, oder ein Hacker die Off-Chain-Komponente des Oracles übernimmt, besteht für deinen Smart Contract das Risiko eines Denial-of-Service (DoS)-Angriffs. #### Schlechte Anreizkompatibilität {#poor-incentive-compatibility} -Zentralisierte Oracles haben oft schlecht gestaltete oder nicht existierende Anreize für den Datenanbieter, genaue/unveränderte Informationen zu senden. Die Bezahlung eines Oracles für Korrektheit garantiert keine Ehrlichkeit. Dieses Problem wird größer, je mehr Wert von Smart Contracts kontrolliert wird. +Zentralisierte Orakel haben oft schlecht konzipierte oder nicht vorhandene Anreize für den Datenanbieter, genaue/unveränderte Informationen zu senden. Die Bezahlung eines Orakels für Korrektheit garantiert nicht dessen Ehrlichkeit. Dieses Problem wird größer, je mehr Wert von Smart Contracts kontrolliert wird. ### Dezentralisierte Oracles {#decentralized-oracles} -Dezentralisierte Oracles sind so konzipiert, dass sie die Einschränkungen zentralisierter Oracles überwinden, indem sie Single Points of Failure eliminieren. Ein dezentralisierter Oracle-Dienst besteht aus mehreren Teilnehmern in einem Peer-to-Peer-Netzwerk, die einen Konsens über Offchain-Daten bilden, bevor diese an einen Smart Contract gesendet werden. +Dezentralisierte Orakel sind darauf ausgelegt, die Einschränkungen zentralisierter Orakel zu überwinden, indem sie einzelne Ausfallpunkte beseitigen. Ein dezentraler Oracle-Dienst besteht aus mehreren Teilnehmern in einem Peer-to-Peer-Netzwerk, die vor dem Senden an einen Smart Contract ein Konsens über die Off-Chain-Daten bilden. -Ein dezentralisiertes Oracle sollte (im Idealfall) erlaubnisfrei, vertrauenslos und frei von Verwaltung durch eine zentrale Partei sein; in der Realität liegt die Dezentralisierung bei Oracles auf einem Spektrum. Es gibt halb-dezentralisierte Oracle-Netzwerke, an denen jeder teilnehmen kann, aber mit einem "Eigentümer", der Nodes basierend auf ihrer historischen Leistung genehmigt und entfernt. Es existieren auch vollständig dezentralisierte Oracle-Netzwerke: Diese laufen in der Regel als eigenständige Blockchains und haben definierte Konsensmechanismen für die Koordination von Nodes und die Bestrafung von Fehlverhalten. +Ein dezentralisiertes Oracle sollte (idealerweise) erlaubnisfrei, vertrauenslos und frei von der Verwaltung durch eine zentrale Partei sein; in der Realität ist die Dezentralisierung bei Oracles ein Spektrum. Es gibt halb-dezentralisierte Orakel Netzwerke wo jeder Teilnehmen kann, aber mit einem "Besitzer" welcher Knoten nach historischer Leistung erlaubt und entfernt. Vollständig dezentralisierte Orakelnetzwerke existieren ebenfalls: Diese funktionieren in der Regel als eigenständige Blockchains und verfügen über definierte Konsensmechanismen zur Koordination der Nodes und zur Bestrafung von Fehlverhalten. -Die Verwendung dezentralisierter Oracles bietet folgende Vorteile: +Die Nutzung dezentralisierter Orakel bietet folgende Vorteile: ### Hohe Korrektheitsgarantien {#high-correctness-guarantees} -Dezentralisierte Oracles versuchen, die Korrektheit der Daten durch verschiedene Ansätze zu gewährleisten. Dazu gehören der Einsatz von Nachweisen, die die Authentizität und Integrität der zurückgegebenen Informationen belegen, sowie die Anforderung, dass mehrere Entitäten gemeinsam über die Gültigkeit von Offchain-Daten entscheiden. +Dezentralisierte Orakel versuchen, die Korrektheit von Daten durch verschiedene Ansätze zu gewährleisten. Dazu gehört die Verwendung von Nachweisen, die die Authentizität und Integrität der zurückgegebenen Informationen bestätigen, sowie die Notwendigkeit, dass mehrere Akteure kollektiv die Gültigkeit der Off-Chain-Daten bestätigen. #### Authentizitätsnachweise {#authenticity-proofs} -Authentizitätsnachweise sind kryptographische Mechanismen, die eine unabhängige Überprüfung von Informationen aus externen Quellen ermöglichen. Diese Nachweise können die Quelle der Informationen validieren und mögliche Änderungen an den Daten nach dem Abruf erkennen. +Authentizitätsnachweise sind kryptografische Mechanismen, die eine unabhängige Überprüfung von Informationen ermöglichen, die aus externen Quellen abgerufen wurden. Diese Nachweise können die Quelle der Informationen validieren und mögliche Veränderungen der Daten nach deren Abruf erkennen. -Beispiele für Authentizitätsnachweise sind: +Beispiele für Authentizitätsnachweise umfassen: -**Transport Layer Security (TLS)-Nachweise**: Oracle-Nodes rufen häufig Daten aus externen Quellen über eine sichere HTTP-Verbindung ab, die auf dem Transport Layer Security (TLS)-Protokoll basiert. Einige dezentralisierte Oracles verwenden Authentizitätsnachweise, um TLS-Sitzungen zu verifizieren (d.h. den Informationsaustausch zwischen einem Node und einem bestimmten Server zu bestätigen) und zu bestätigen, dass die Inhalte der Sitzung nicht verändert wurden. +**Transport Layer Security (TLS)-Nachweise**: Oracle-Nodes rufen häufig Daten aus externen Quellen über eine sichere HTTP-Verbindung ab, die auf dem Transport Layer Security (TLS)-Protokoll basiert. Einige dezentralisierte Orakel verwenden Authentizitätsnachweise, um TLS-Sitzungen zu verifizieren (das heißt, den Informationsaustausch zwischen einem Node und einem bestimmten Server zu bestätigen) und um sicherzustellen, dass die Inhalte der Sitzung nicht verändert wurden. -**Trusted Execution Environment (TEE)-Nachweise**: Ein [Trusted Execution Environment](https://en.wikipedia.org/wiki/Trusted_execution_environment) (TEE) ist eine abgeschottete Rechenumgebung, die von den Betriebsprozessen des Host-Systems isoliert ist. TEEs stellen sicher, dass Anwendungscode oder Daten, die in der Rechenumgebung gespeichert/verwendet werden, ihre Integrität, Vertraulichkeit und Unveränderlichkeit behalten. Benutzer können auch einen Nachweis generieren, um zu beweisen, dass eine Anwendungsinstanz innerhalb der vertrauenswürdigen Ausführungsumgebung läuft. +**Trusted Execution Environment (TEE)-Attestierungen**: Eine [Trusted Execution Environment](https://en.wikipedia.org/wiki/Trusted_execution_environment) (TEE) ist eine abgeschottete Rechenumgebung, die von den Betriebsprozessen ihres Host-Systems isoliert ist. TEEs stellen sicher, dass jeglicher Anwendungscode oder Daten, die in der Rechenumgebung gespeichert oder verwendet werden, ihre Integrität, Vertraulichkeit und Unveränderlichkeit bewahren. Benutzer können auch eine Attestierung erstellen, um zu beweisen, dass eine Anwendungsinstanz innerhalb der Trusted Execution Environment läuft. -Bestimmte Klassen von dezentralisierten Oracles erfordern von Oracle-Node-Betreibern die Bereitstellung von TEE-Nachweisen. Dies bestätigt einem Benutzer, dass der Node-Betreiber eine Instanz des Oracle-Clients in einer vertrauenswürdigen Ausführungsumgebung betreibt. TEEs verhindern, dass externe Prozesse den Code und die Daten einer Anwendung verändern oder lesen können. Daher beweisen diese Nachweise, dass der Oracle-Node die Informationen intakt und vertraulich gehalten hat. +Bestimmte Klassen dezentralisierter Orakel erfordern, dass Betreiber von Orakel-Nodes TEE-Attestierungen bereitstellen. Dies bestätigt dem Benutzer, dass der Node-Betreiber eine Instanz des Orakel-Clients in einer Trusted Execution Environment ausführt. TEEs verhindern, dass externe Prozesse den Code und die Daten einer Anwendung ändern oder lesen. Daher beweisen diese Attestierungen, dass der Orakel-Node die Informationen unverändert und vertraulich gehalten hat. #### Konsensbasierte Validierung von Informationen {#consensus-based-validation-of-information} -Zentralisierte Oracles verlassen sich bei der Bereitstellung von Daten für Smart Contracts auf eine einzige Wahrheitsquelle, was die Möglichkeit der Veröffentlichung ungenauer Informationen mit sich bringt. Dezentralisierte Oracles lösen dieses Problem, indem sie sich auf mehrere Oracle-Nodes verlassen, um Offchain-Informationen abzufragen. Durch den Vergleich von Daten aus mehreren Quellen reduzieren dezentralisierte Oracles das Risiko, ungültige Informationen an Onchain-Contracts weiterzugeben. +Zentralisierte Orakel stützen sich auf eine einzelne Quelle der Wahrheit, wenn sie Daten an Smart Contracts liefern, was die Möglichkeit der Veröffentlichung ungenauer Informationen mit sich bringt. Dezentrale Oracles lösen dieses Problem, indem sie auf mehrere Oracle-Nodes zurückgreifen, um Off-Chain-Informationen abzufragen. Durch den Vergleich von Daten aus mehreren Quellen reduzieren dezentrale Oracles das Risiko, ungültige Informationen an On-Chain-Verträge weiterzuleiten. -Dezentralisierte Oracles müssen jedoch mit Diskrepanzen in den Informationen umgehen, die aus mehreren Offchain-Quellen abgerufen werden. Um Unterschiede in den Informationen zu minimieren und sicherzustellen, dass die an den Oracle-Contract übergebenen Daten die kollektive Meinung der Oracle-Nodes widerspiegeln, verwenden dezentralisierte Oracles die folgenden Mechanismen: +Dezentrale Oracles müssen jedoch mit Diskrepanzen in den von mehreren Off-Chain-Quellen abgerufenen Informationen umgehen. Um Unterschiede in den Informationen zu minimieren und sicherzustellen, dass die an den Orakel-Vertrag übergebenen Daten die kollektive Meinung der Orakel-Nodes widerspiegeln, verwenden dezentralisierte Orakel folgende Mechanismen: -##### Abstimmung/Staking über die Genauigkeit von Daten +##### Abstimmung/Einsatz bezüglich der Genauigkeit von Daten -Einige dezentralisierte Oracle-Netzwerke erfordern von den Teilnehmern, über die Genauigkeit von Antworten auf Datenanfragen (z.B. "Wer hat die US-Wahl 2020 gewonnen?") unter Verwendung des nativen Tokens des Netzwerks abzustimmen oder zu staken. Ein Aggregationsprotokoll sammelt dann die Stimmen und Stakes und nimmt die von der Mehrheit unterstützte Antwort als gültige an. +Einige dezentralisierte Orakelnetzwerke erfordern, dass Teilnehmer über die Genauigkeit von Antworten auf Datenanfragen abstimmen oder Einsätze tätigen (z.B. "Wer hat die US-Wahl 2020 gewonnen?") unter Verwendung des nativen Tokens des Netzwerks. Ein Aggregationsprotokoll aggregiert dann die Stimmen und Einsätze und nimmt die von der Mehrheit unterstützte Antwort als die gültige an. -Nodes, deren Antworten von der Mehrheitsantwort abweichen, werden bestraft, indem ihre Tokens an andere verteilt werden, die korrektere Werte liefern. Die Verpflichtung der Nodes, eine Sicherheit zu hinterlegen, bevor sie Daten bereitstellen, motiviert zu ehrlichen Antworten, da sie als rationale wirtschaftliche Akteure angenommen werden, die ihre Rendite maximieren wollen. +Ein Aggregationsprotokoll aggregiert dann die Stimmen und Einsätze und nimmt die von der Mehrheit unterstützte Antwort als die gültige an. Das Erfordern einer Kaution von den Nodes, bevor sie Daten bereitstellen, motiviert zu ehrlichen Antworten, da angenommen wird, dass sie rationale ökonomische Akteure sind, die darauf abzielen, ihre Erträge zu maximieren. -Staking/Abstimmung schützt dezentralisierte Oracles auch vor [Sybil-Angriffen](/glossary/#sybil-attack), bei denen böswillige Akteure mehrere Identitäten erstellen, um das Konsenssystem zu manipulieren. Staking kann jedoch "Trittbrettfahren" (Oracle-Nodes kopieren Informationen von anderen) und "faules Validieren" (Oracle-Nodes folgen der Mehrheit ohne eigene Überprüfung der Informationen) nicht verhindern. +Staking/Abstimmungen schützen dezentrale Oracles auch vor [Sybil-Angriffen](/glossary/#sybil-attack), bei denen böswillige Akteure mehrere Identitäten erstellen, um das Konsenssystem zu manipulieren. Allerdings kann Staking „Trittbrettfahren“ (Nodes kopieren Informationen von anderen) und „faule Validierung“ (Nodes folgen der Mehrheit, ohne die Informationen selbst zu überprüfen) nicht verhindern. ##### Schelling-Punkt-Mechanismen -Der [Schelling-Punkt]() ist ein spieltheoretisches Konzept, das davon ausgeht, dass mehrere Entitäten in Abwesenheit jeglicher Kommunikation immer zu einer gemeinsamen Lösung eines Problems tendieren. Schelling-Punkt-Mechanismen werden häufig in dezentralisierten Oracle-Netzwerken verwendet, um Nodes zu ermöglichen, einen Konsens über Antworten auf Datenanfragen zu erreichen. +Ein [Schelling-Punkt](https://en.wikipedia.org/wiki/Focal_point_\(game_theory\)) ist ein spieltheoretisches Konzept, das davon ausgeht, dass mehrere Entitäten bei fehlender Kommunikation immer auf eine gemeinsame Lösung für ein Problem zurückgreifen. Schelling-Punkt-Mechanismen werden häufig in dezentralen Orakel-Netzwerken verwendet, um Nodes zu ermöglichen, einen Konsens über Antworten auf Datenanfragen zu erreichen. -Eine frühe Idee dafür war [SchellingCoin](https://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed/), ein vorgeschlagener Datenfeed, bei dem Teilnehmer Antworten auf "skalare" Fragen (Fragen, deren Antworten durch Größe beschrieben werden, z.B. "Was ist der Preis von ETH?") zusammen mit einer Einlage einreichen. Benutzer, die Werte zwischen dem 25. und 75. [Perzentil](https://en.wikipedia.org/wiki/Percentile) liefern, werden belohnt, während diejenigen, deren Werte stark vom Medianwert abweichen, bestraft werden. +Eine frühe Idee dafür war [SchellingCoin](https://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed/), ein vorgeschlagener Datenfeed, bei dem die Teilnehmer Antworten auf „skalare“ Fragen (Fragen, deren Antworten durch eine Größenordnung beschrieben werden, z. B. „Wie hoch ist der Preis von ETH?“) zusammen mit einer Einlage einreichen. Benutzer, die Werte zwischen dem 25. und 75. [Perzentil](https://en.wikipedia.org/wiki/Percentile) angeben, werden belohnt, während diejenigen, deren Werte stark vom Medianwert abweichen, bestraft werden. -Obwohl SchellingCoin heute nicht existiert, verwenden eine Reihe von dezentralisierten Oracles—insbesondere [Maker Protocol's Oracles](https://docs.makerdao.com/smart-contract-modules/oracle-module)—den Schelling-Punkt-Mechanismus, um die Genauigkeit der Oracle-Daten zu verbessern. Jedes Maker Oracle besteht aus einem Offchain-P2P-Netzwerk von Nodes ("Relayers" und "Feeds"), die Marktpreise für Sicherheiten-Assets einreichen, und einem Onchain-"Medianizer"-Contract, der den Median aller bereitgestellten Werte berechnet. Sobald die festgelegte Verzögerungszeit abgelaufen ist, wird dieser Medianwert zum neuen Referenzpreis für das zugehörige Asset. +Obwohl es SchellingCoin heute nicht mehr gibt, nutzen eine Reihe dezentraler Oracles – insbesondere die [Oracles des Maker-Protokolls](https://docs.makerdao.com/smart-contract-modules/oracle-module) – den Schelling-Punkt-Mechanismus, um die Genauigkeit der Oracle-Daten zu verbessern. Jeder Maker-Oracle besteht aus einem Off-Chain-P2P-Netzwerk von Nodes ("Relayer" und "Feeds"), die Marktpreise für Sicherungsassets einreichen, sowie einem On-Chain-"Medianizer"-Vertrag, der den Median aller bereitgestellten Werte berechnet. Sobald die festgelegte Verzögerungszeit vorüber ist, wird dieser Medianwert zum neuen Referenzpreis für das zugehörige Asset. -Andere Beispiele für Oracles, die Schelling-Punkt-Mechanismen verwenden, sind [Chainlink Offchain Reporting](https://docs.chain.link/docs/offchain-reporting/) und [Witnet](https://witnet.io/). In beiden Systemen werden Antworten von Oracle-Nodes im Peer-to-Peer-Netzwerk zu einem einzigen Aggregatwert zusammengefasst, wie z.B. einem Mittelwert oder Median. Nodes werden je nachdem belohnt oder bestraft, inwieweit ihre Antworten mit dem Aggregatwert übereinstimmen oder davon abweichen. +Andere Beispiele für Oracles, die Schelling-Punkt-Mechanismen verwenden, sind [Chainlink Offchain Reporting](https://docs.chain.link/architecture-overview/off-chain-reporting) und [Witnet](https://witnet.io/). In beiden Systemen werden Antworten von Orakel-Nodes im Peer-to-Peer-Netzwerk zu einem einzigen aggregierten Wert wie einem Mittelwert oder Median zusammengefasst. Nodes werden entsprechend dem Grad belohnt oder bestraft, in dem ihre Antworten mit dem aggregierten Wert übereinstimmen oder von ihm abweichen. -Schelling-Punkt-Mechanismen sind attraktiv, weil sie den Onchain-Fußabdruck minimieren (nur eine Transaktion muss gesendet werden), während sie gleichzeitig Dezentralisierung garantieren. Letzteres ist möglich, weil Nodes die Liste der eingereichten Antworten unterzeichnen müssen, bevor sie in den Algorithmus eingespeist wird, der den Mittelwert/Medianwert erzeugt. +Schelling-Punkt-Mechanismen sind attraktiv, da sie den On-Chain-Fußabdruck minimieren (es muss nur eine Transaktion gesendet werden), während gleichzeitig Dezentralisierung garantiert wird. Letzteres ist möglich, weil die Nodes die Liste der eingereichten Antworten signieren müssen, bevor sie in den Algorithmus eingespeist wird, der den Mittelwert/Medianwert berechnet. ### Verfügbarkeit {#availability} -Dezentralisierte Oracle-Dienste gewährleisten eine hohe Verfügbarkeit von Offchain-Daten für Smart Contracts. Dies wird durch die Dezentralisierung sowohl der Quelle der Offchain-Informationen als auch der Nodes erreicht, die für die Übertragung der Informationen Onchain verantwortlich sind. +Dezentrale Oracle-Dienste gewährleisten eine hohe Verfügbarkeit von Off-Chain-Daten für Smart Contracts. Dies wird erreicht, indem sowohl die Quelle der Off-Chain-Informationen als auch die Nodes, die für die Übertragung der Informationen On-Chain verantwortlich sind, dezentralisiert werden. -Dies gewährleistet Fehlertoleranz, da der Oracle-Contract sich auf mehrere Nodes verlassen kann (die sich auch auf mehrere Datenquellen verlassen), um Abfragen von anderen Contracts auszuführen. Dezentralisierung auf der Quellen- _und_ Node-Betreiber-Ebene ist entscheidend—ein Netzwerk von Oracle-Nodes, das Informationen aus derselben Quelle bereitstellt, wird auf das gleiche Problem stoßen wie ein zentralisiertes Oracle. +Dies gewährleistet Fehlertoleranz, da der Orakelvertrag sich auf mehrere Nodes (die sich auch auf mehrere Datenquellen stützen) verlassen kann, um Abfragen von anderen Verträgen auszuführen. Die Dezentralisierung auf der Ebene der Quelle _und_ des Node-Betreibers ist entscheidend – ein Netzwerk von Oracle-Nodes, das Informationen aus derselben Quelle bereitstellt, wird auf dasselbe Problem stoßen wie ein zentralisiertes Oracle. -Es ist auch möglich, dass Stake-basierte Oracles Node-Betreiber bestrafen, die nicht schnell genug auf Datenanfragen reagieren. Dies motiviert Oracle-Nodes erheblich, in fehlertolerante Infrastruktur zu investieren und Daten zeitnah bereitzustellen. +Es ist auch möglich, dass stake-basierte Oracles die Node-Betreiber bestrafen, die nicht schnell auf Datenanfragen reagieren. Dies incentiviert Orakel-Nodes erheblich, in fehlertolerante Infrastruktur zu investieren und Daten rechtzeitig bereitzustellen. ### Gute Anreizkompatibilität {#good-incentive-compatibility} -Dezentralisierte Oracles implementieren verschiedene Anreizdesigns, um [byzantinisches](https://en.wikipedia.org/wiki/Byzantine_fault) Verhalten unter Oracle-Nodes zu verhindern. Konkret erreichen sie _Zurechenbarkeit_ und _Verantwortlichkeit_: +Dezentralisierte Oracles implementieren verschiedene Anreizdesigns, um [byzantinisches](https://en.wikipedia.org/wiki/Byzantine_fault) Verhalten unter Oracle-Nodes zu verhindern. Insbesondere erreichen sie _Zurechenbarkeit_ und _Rechenschaftspflicht_: -1. Dezentralisierte Oracle-Nodes müssen oft die Daten signieren, die sie als Antwort auf Datenanfragen bereitstellen. Diese Informationen helfen bei der Bewertung der historischen Leistung von Oracle-Nodes, sodass Benutzer unzuverlässige Oracle-Nodes bei Datenanfragen herausfiltern können. Ein Beispiel ist Witnets [Algorithmisches Reputationssystem](https://docs.witnet.io/intro/about/architecture#algorithmic-reputation-system). +1. Dezentralisierte Orakel-Nodes müssen häufig die Daten signieren, die sie als Antwort auf Datenanfragen bereitstellen. Diese Informationen helfen bei der Bewertung der historischen Leistung von Orakel-Nodes, sodass Nutzer unzuverlässige Orakel-Nodes bei Datenanfragen herausfiltern können. Ein Beispiel ist das [Algorithmische Reputationssystem](https://docs.witnet.io/intro/about/architecture#algorithmic-reputation-system) von Witnet. -2. Dezentralisierte Oracles—wie bereits erklärt—können von Nodes verlangen, dass sie einen Stake auf ihre Überzeugung von der Richtigkeit der von ihnen eingereichten Daten setzen. Wenn sich die Behauptung als richtig erweist, kann dieser Stake zusammen mit Belohnungen für ehrlichen Service zurückgegeben werden. Er kann aber auch gekürzt werden, falls die Informationen falsch sind, was ein gewisses Maß an Verantwortlichkeit bietet. +2. Dezentralisierte Orakel – wie zuvor erläutert – können verlangen, dass Nodes einen Einsatz auf ihre Überzeugung in die Wahrheit der von ihnen übermittelten Daten setzen. Wenn die Behauptung zutrifft, kann dieser Einsatz zusammen mit Belohnungen für ehrlichen Dienst zurückgegeben werden. But it can also be slashed in case the information is incorrect, which provides some measure of accountability. ## Anwendungen von Oracles in Smart Contracts {#applications-of-oracles-in-smart-contracts} -Die folgenden sind häufige Anwendungsfälle für Oracles in Ethereum: +Die folgenden sind häufige Anwendungsfälle für Orakel in Ethereum: -### Finanzdaten abrufen {#retrieving-financial-data} +### Abrufen von Finanzdaten {#retrieving-financial-data} -[Dezentralisierte Finanzanwendungen](/defi/) (DeFi) ermöglichen Peer-to-Peer-Kredite, Kreditaufnahme und Handel mit Assets. Dies erfordert oft den Zugriff auf verschiedene Finanzinformationen, einschließlich Wechselkursdaten (zur Berechnung des Fiat-Werts von Kryptowährungen oder zum Vergleich von Token-Preisen) und Kapitalmarktdaten (zur Berechnung des Werts von tokenisierten Assets wie Gold oder US-Dollar). +[Dezentralisierte Finanzen](/defi/) (DeFi) ermöglichen Peer-to-Peer-Kreditvergabe, -aufnahme und den Handel mit Vermögenswerten. Dies erfordert oft das Einholen verschiedener Finanzinformationen, einschließlich Wechselkursdaten (zur Berechnung des Fiat-Werts von Kryptowährungen oder zum Vergleich von Token-Preisen) und Kapitalmarktdaten (zur Berechnung des Werts tokenisierter Vermögenswerte, wie Gold oder US-Dollar). -Ein DeFi-Kreditprotokoll muss beispielsweise aktuelle Marktpreise für als Sicherheit hinterlegte Assets (z.B. ETH) abfragen. Dies ermöglicht es dem Contract, den Wert der Sicherheiten-Assets zu bestimmen und festzulegen, wie viel aus dem System geliehen werden kann. +Ein DeFi-Kreditprotokoll muss beispielsweise die aktuellen Marktpreise für als Sicherheit hinterlegte Vermögenswerte (z. B. ETH) abfragen. Dies ermöglicht es dem Vertrag, den Wert der Sicherheitsvermögenswerte zu bestimmen und festzulegen, wie viel er vom System leihen kann. -Beliebte "Preis-Oracles" (wie sie oft genannt werden) in DeFi sind Chainlink Price Feeds, Compound Protocol's [Open Price Feed](https://compound.finance/docs/prices), Uniswap's [Time-Weighted Average Prices (TWAPs)](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) und [Maker Oracles](https://docs.makerdao.com/smart-contract-modules/oracle-module). +Beliebte „Preis-Oracles“ (wie sie oft genannt werden) in DeFi umfassen Chainlink Price Feeds, den [Open Price Feed](https://compound.finance/docs/prices) von Compound Protocol, die [zeitgewichteten Durchschnittspreise (TWAPs)](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) von Uniswap und die [Maker Oracles](https://docs.makerdao.com/smart-contract-modules/oracle-module). -Entwickler sollten die Einschränkungen dieser Preis-Oracles verstehen, bevor sie sie in ihr Projekt integrieren. Dieser [Artikel](https://blog.openzeppelin.com/secure-smart-contract-guidelines-the-dangers-of-price-oracles/) bietet eine detaillierte Analyse dessen, was bei der Planung der Verwendung eines der genannten Preis-Oracles zu beachten ist. +Entwickler sollten die Vorbehalte verstehen, die mit diesen Preis-Orakeln einhergehen, bevor sie sie in ihr Projekt integrieren. Dieser [Artikel](https://blog.openzeppelin.com/secure-smart-contract-guidelines-the-dangers-of-price-oracles/) bietet eine detaillierte Analyse dessen, was bei der Planung der Verwendung eines der genannten Preis-Oracles zu beachten ist. -Hier ist ein Beispiel, wie Sie den neuesten ETH-Preis in Ihrem Smart Contract mit einem Chainlink-Preis-Feed abrufen können: +Im Folgenden finden Sie ein Beispiel, wie Sie den aktuellen ETH-Preis in Ihrem Smart Contract unter Verwendung eines Chainlink-Preisfeeds abrufen können: ```solidity pragma solidity ^0.6.7; @@ -347,81 +354,80 @@ contract PriceConsumerV3 { } ``` -### Verifizierbare Zufallszahlen generieren {#generating-verifiable-randomness} +### Generierung nachweisbarer Zufälligkeit {#generating-verifiable-randomness} -Bestimmte Blockchain-Anwendungen, wie Blockchain-basierte Spiele oder Lotteriesysteme, benötigen ein hohes Maß an Unvorhersehbarkeit und Zufälligkeit, um effektiv zu funktionieren. Die deterministische Ausführung von Blockchains eliminiert jedoch die Zufälligkeit. +Bestimmte Blockchain-Anwendungen, wie blockchain-basierte Spiele oder Lotteriesysteme, benötigen ein hohes Maß an Unvorhersehbarkeit und Zufälligkeit, um effektiv zu funktionieren. Jedoch eliminiert die deterministische Ausführung von Blockchains die Zufälligkeit. -Der ursprüngliche Ansatz war die Verwendung pseudozufälliger kryptographischer Funktionen wie `blockhash`, aber diese konnten von [Miner manipuliert werden](https://ethereum.stackexchange.com/questions/3140/risk-of-using-blockhash-other-miners-preventing-attack#:~:text=So%20while%20the%20miners%20can,to%20one%20of%20the%20players.), die den Proof-of-Work-Algorithmus lösen. Außerdem bedeutet Ethereums [Umstellung auf Proof-of-Stake](/roadmap/merge/), dass Entwickler sich nicht mehr auf `blockhash` für Onchain-Zufälligkeit verlassen können. Der [RANDAO-Mechanismus](https://eth2book.info/altair/part2/building_blocks/randomness) der Beacon Chain bietet stattdessen eine alternative Quelle für Zufälligkeit. +Der ursprüngliche Ansatz war die Verwendung pseudozufälliger kryptografischer Funktionen wie `blockhash`, aber diese konnten von [Minern manipuliert werden](https://ethereum.stackexchange.com/questions/3140/risk-of-using-blockhash-other-miners-preventing-attack#:~:text=So%20while%20the%20miners%20can,to%20one%20of%20the%20players.) Lösung des Proof-of-Work-Algorithmus. Außerdem bedeutet [Ethereums Umstellung auf Proof-of-Stake](/roadmap/merge/), dass Entwickler sich für die Onchain-Zufälligkeit nicht mehr auf `blockhash` verlassen können. Der [RANDAO-Mechanismus](https://eth2book.info/altair/part2/building_blocks/randomness) der Beacon Chain bietet stattdessen eine alternative Quelle für Zufälligkeit. -Es ist möglich, den Zufallswert Offchain zu generieren und Onchain zu senden, aber dies erfordert ein hohes Maß an Vertrauen von den Benutzern. Sie müssen glauben, dass der Wert wirklich durch unvorhersehbare Mechanismen generiert wurde und nicht während der Übertragung verändert wurde. +Es ist möglich, den Zufallswert Off-Chain zu generieren und ihn dann On-Chain zu senden, aber dies stellt hohe Vertrauensanforderungen an die Nutzer. Sie müssen glauben, dass der Wert tatsächlich durch unvorhersehbare Mechanismen erzeugt wurde und während der Übertragung nicht verändert wurde. -Oracles, die für Offchain-Berechnungen konzipiert sind, lösen dieses Problem, indem sie Zufallsergebnisse Offchain sicher generieren und diese Onchain zusammen mit kryptographischen Nachweisen senden, die die Unvorhersehbarkeit des Prozesses belegen. Ein Beispiel ist [Chainlink VRF](https://docs.chain.link/docs/chainlink-vrf/) (Verifiable Random Function), ein nachweislich faires und manipulationssicheres Zufallszahlengeneratorsystem (RNG), das nützlich ist für den Aufbau zuverlässiger Smart Contracts für Anwendungen, die auf unvorhersehbare Ergebnisse angewiesen sind. Ein weiteres Beispiel ist [API3 QRNG](https://docs.api3.org/explore/qrng/), das Quanten-Zufallszahlengenerierung (QRNG) als öffentliche Methode der Web3-Zufallszahlengenerierung basierend auf Quantenphänomenen anbietet, bereitgestellt mit freundlicher Genehmigung der Australian National University (ANU). +Oracles, die für Off-Chain-Berechnungen entwickelt wurden, lösen dieses Problem, indem sie zufällige Ergebnisse sicher Off-Chain generieren und diese zusammen mit kryptografischen Beweisen, die die Unvorhersehbarkeit des Prozesses bestätigen, On-Chain übertragen. Ein Beispiel ist [Chainlink VRF](https://docs.chain.link/docs/chainlink-vrf/) (Verifiable Random Function), ein nachweislich fairer und manipulationssicherer Zufallszahlengenerator (RNG), der für die Erstellung zuverlässiger Smart Contracts für Anwendungen nützlich ist, die auf unvorhersehbaren Ergebnissen beruhen. -### Ereignisergebnisse abrufen {#getting-outcomes-for-events} +### Ergebnisse für Ereignisse erhalten {#getting-outcomes-for-events} -Mit Oracles ist es einfach, Smart Contracts zu erstellen, die auf Ereignisse in der realen Welt reagieren. Oracle-Dienste machen dies möglich, indem sie Contracts erlauben, über Offchain-Komponenten mit externen APIs zu verbinden und Informationen aus diesen Datenquellen zu konsumieren. Zum Beispiel könnte die zuvor erwähnte Vorhersage-dApp ein Oracle anfordern, Wahlergebnisse aus einer vertrauenswürdigen Offchain-Quelle (z.B. Associated Press) zurückzugeben. +Mit Orakeln ist es einfach, Smart Contracts zu erstellen, die auf reale Ereignisse reagieren. Oracle-Dienste machen dies möglich, indem sie Verträgen erlauben, sich über Off-Chain-Komponenten mit externen APIs zu verbinden und Informationen aus diesen Datenquellen zu nutzen. Zum Beispiel könnte die zuvor erwähnte Vorhersage-App ein Oracle anfordern, um Wahlergebnisse von einer vertrauenswürdigen Off-Chain-Quelle (z. B. der Associated Press) zurückzuliefern. -Die Verwendung von Oracles zum Abrufen von Daten basierend auf Ergebnissen aus der realen Welt ermöglicht andere neuartige Anwendungsfälle; zum Beispiel benötigt ein dezentralisiertes Versicherungsprodukt genaue Informationen über Wetter, Katastrophen usw., um effektiv zu funktionieren. +Die Verwendung von Orakeln, um Daten basierend auf realen Ergebnissen abzurufen, ermöglicht andere neuartige Anwendungsfälle; beispielsweise benötigt ein dezentralisiertes Versicherungsprodukt genaue Informationen über Wetter, Katastrophen usw., um effektiv zu funktionieren. ### Automatisierung von Smart Contracts {#automating-smart-contracts} -Smart Contracts laufen nicht automatisch; vielmehr muss ein externes Konto (EOA) oder ein anderer Contract-Account die richtigen Funktionen auslösen, um den Contract-Code auszuführen. In den meisten Fällen sind die meisten Funktionen des Contracts öffentlich und können von EOAs und anderen Contracts aufgerufen werden. +Smart Contracts werden nicht automatisch ausgeführt; vielmehr muss ein externes Eigentümerkonto (EOA) oder ein anderes Vertragskonto die richtigen Funktionen auslösen, um den Code des Vertrags auszuführen. In den meisten Fällen sind der Großteil der Funktionen des Vertrags öffentlich und können von externen Eigentümerkonten (EOAs) und anderen Verträgen aufgerufen werden. -Es gibt aber auch _private Funktionen_ innerhalb eines Contracts, die für andere unzugänglich sind, aber für die Gesamtfunktionalität einer dApp kritisch sind. Beispiele sind eine `mintERC721Token()`-Funktion, die periodisch neue NFTs für Benutzer prägt, eine Funktion für die Auszahlung in einem Vorhersagemarkt oder eine Funktion zum Entsperren gestaketer Tokens in einer DEX. +Es gibt aber auch _private Funktionen_ innerhalb eines Vertrags, die für andere unzugänglich sind, aber für die allgemeine Funktionalität einer Dapp entscheidend sind. Beispiele hierfür sind eine `mintERC721Token()`-Funktion, die regelmäßig neue NFTs für Benutzer prägt, eine Funktion zur Auszahlung von Gewinnen in einem Prognosemarkt oder eine Funktion zum Freischalten von gestaketen Token in einer DEX. -Entwickler müssen solche Funktionen in regelmäßigen Abständen auslösen, um die Anwendung reibungslos laufen zu lassen. Dies kann jedoch zu mehr verlorenen Stunden für routinemäßige Aufgaben führen, weshalb die Automatisierung der Ausführung von Smart Contracts attraktiv ist. +Entwickler müssen solche Funktionen in Intervallen auslösen, um die Anwendung reibungslos laufen zu lassen. Dies kann jedoch zu mehr verlorenen Stunden bei routinemäßigen Aufgaben für Entwickler führen, weshalb die Automatisierung der Ausführung von Smart Contracts attraktiv ist. -Einige dezentralisierte Oracle-Netzwerke bieten Automatisierungsdienste an, die es Offchain-Oracle-Nodes ermöglichen, Smart-Contract-Funktionen gemäß den vom Benutzer definierten Parametern auszulösen. Typischerweise erfordert dies die "Registrierung" des Ziel-Contracts beim Oracle-Dienst, die Bereitstellung von Mitteln zur Bezahlung des Oracle-Betreibers und die Angabe der Bedingungen oder Zeiten für die Auslösung des Contracts. +Einige dezentrale Oracle-Netzwerke bieten Automatisierungsdienste an, die es Off-Chain-Oracle-Nodes ermöglichen, Smart-Contract-Funktionen gemäß von den Nutzern definierten Parametern auszulösen. Üblicherweise erfordert dies die "Registrierung" des Zielvertrags beim Orakeldienst, die Bereitstellung von Mitteln zur Bezahlung des Orakelbetreibers und die Festlegung der Bedingungen oder Zeiten zum Auslösen des Vertrags. -Chainlinks [Keeper Network](https://chain.link/keepers) bietet Optionen für Smart Contracts, regelmäßige Wartungsaufgaben auf vertrauensminimierte und dezentralisierte Weise auszulagern. Lesen Sie die offizielle [Keeper-Dokumentation](https://docs.chain.link/docs/chainlink-keepers/introduction/), um Informationen darüber zu erhalten, wie Sie Ihren Contract Keeper-kompatibel machen und den Upkeep-Dienst nutzen können. +Das [Keeper Network](https://chain.link/keepers) von Chainlink bietet Optionen für Smart Contracts, um regelmäßige Wartungsaufgaben auf eine vertrauensminimierte und dezentralisierte Weise auszulagern. Lesen Sie die offizielle [Keeper-Dokumentation](https://docs.chain.link/docs/chainlink-keepers/introduction/) für Informationen darüber, wie Sie Ihren Vertrag Keeper-kompatibel machen und den Upkeep-Service nutzen können. ## Wie man Blockchain-Oracles verwendet {#use-blockchain-oracles} -Im Ethereum-Ökosystem stehen verschiedene Oracle-Dienste zur Integration zur Verfügung: +Es gibt mehrere Oracle Anwendungen, die du in den Ethereum Dapp integrieren kannst: -**[Chainlink](https://chain.link/)** - _Chainlink dezentralisierte Oracle-Netzwerke bieten manipulationssichere Eingaben, Ausgaben und Berechnungen zur Unterstützung fortgeschrittener Smart Contracts auf jeder Blockchain._ +**[Chainlink](https://chain.link/)** – _Dezentrale Oracle-Netzwerke von Chainlink bieten manipulationssichere Eingaben, Ausgaben und Berechnungen zur Unterstützung fortschrittlicher Smart Contracts auf jeder Blockchain._ -**[RedStone Oracles](https://redstone.finance/)** - _RedStone ist ein dezentralisiertes modulares Oracle, das gas-optimierte Datenfeeds bereitstellt. Es spezialisiert sich auf die Bereitstellung von Preis-Feeds für aufstrebende Assets wie Liquid Staking Tokens (LSTs), Liquid Restaking Tokens (LRTs) und Bitcoin Staking-Derivate._ +**[RedStone Oracles](https://redstone.finance/)** – _RedStone ist ein dezentrales, modulares Oracle, das gasoptimierte Datenfeeds bereitstellt. Er spezialisiert sich darauf, Preisfeeds für aufstrebende Assets anzubieten, wie zum Beispiel Liquid-Staking-Token (LSTs), Liquid-Restaking-Token (LRTs) und Bitcoin-Staking-Derivate._ -**[Chronicle](https://chroniclelabs.org/)** - _Chronicle überwindet die aktuellen Einschränkungen bei der Übertragung von Daten Onchain durch die Entwicklung wirklich skalierbarer, kosteneffizienter, dezentralisierter und verifizierbarer Oracles._ +**[Chronicle](https://chroniclelabs.org/)** – _Chronicle überwindet die aktuellen Einschränkungen bei der Übertragung von Daten onchain durch die Entwicklung wirklich skalierbarer, kosteneffizienter, dezentraler und verifizierbarer Oracles._ -**[Witnet](https://witnet.io/)** - _Witnet ist ein erlaubnisfreies, dezentralisiertes und zensurresistentes Oracle, das Smart Contracts hilft, auf Ereignisse in der realen Welt mit starken kryptoökonomischen Garantien zu reagieren._ +**[Witnet](https://witnet.io/)** – _Witnet ist ein erlaubnisfreies, dezentrales und zensurresistentes Oracle, das Smart Contracts dabei hilft, auf Ereignisse in der realen Welt mit starken krypto-ökonomischen Garantien zu reagieren._ -**[UMA Oracle](https://uma.xyz)** - _UMAs optimistisches Oracle ermöglicht es Smart Contracts, schnell jede Art von Daten für verschiedene Anwendungen zu erhalten, einschließlich Versicherungen, Finanzderivate und Vorhersagemärkte._ +**[UMA Oracle](https://uma.xyz)** – _Das optimistische Oracle von UMA ermöglicht es Smart Contracts, schnell jede Art von Daten für verschiedene Anwendungen zu empfangen, einschließlich Versicherungen, Finanzderivaten und Prognosemärkten._ -**[Tellor](https://tellor.io/)** - _Tellor ist ein transparentes und erlaubnisfreies Oracle-Protokoll, mit dem Ihr Smart Contract jederzeit leicht auf Daten zugreifen kann._ +**[Tellor](https://tellor.io/)** – _Tellor ist ein transparentes und erlaubnisfreies Oracle-Protokoll, mit dem Ihr Smart Contract problemlos alle Daten abrufen kann, wann immer er sie benötigt._ -**[Band Protocol](https://bandprotocol.com/)** - _Band Protocol ist eine Cross-Chain-Datenoracle-Plattform, die reale Daten und APIs mit Smart Contracts aggregiert und verbindet._ +**[Band Protocol](https://bandprotocol.com/)** – _Band Protocol ist eine kettenübergreifende Daten-Oracle-Plattform, die reale Daten und APIs aggregiert und mit Smart Contracts verbindet._ -**[Paralink](https://paralink.network/)** - _Paralink bietet eine Open-Source- und dezentralisierte Oracle-Plattform für Smart Contracts, die auf Ethereum und anderen beliebten Blockchains laufen._ +**[Pyth Network](https://pyth.network/)** – _Das Pyth-Netzwerk ist ein First-Party-Finanz-Oracle-Netzwerk, das darauf ausgelegt ist, kontinuierlich Daten aus der realen Welt onchain in einer manipulationssicheren, dezentralen und autarken Umgebung zu veröffentlichen._ -**[Pyth Network](https://pyth.network/)** - _Das Pyth-Netzwerk ist ein First-Party-Finanzoracle-Netzwerk, das darauf ausgelegt ist, kontinuierliche Daten aus der realen Welt in einer manipulationssicheren, dezentralisierten und selbsttragenden Umgebung Onchain zu veröffentlichen._ +**[API3 DAO](https://www.api3.org/)** – _API3 DAO liefert First-Party-Oracle-Lösungen, die eine größere Quellentransparenz, Sicherheit und Skalierbarkeit in einer dezentralen Lösung für Smart Contracts bieten_ -**[API3 DAO](https://www.api3.org/)** - _API3 DAO liefert First-Party-Oracle-Lösungen, die in einer dezentralisierten Lösung für Smart Contracts größere Quellentransparenz, Sicherheit und Skalierbarkeit bieten._ +**[Supra](https://supra.com/)** – Ein vertikal integriertes Toolkit mit kettenübergreifenden Lösungen, das alle Blockchains, ob öffentlich (L1s und L2s) oder privat (Unternehmen), miteinander verbindet und dezentrale Oracle-Preis-Feeds bereitstellt, die für Onchain- und Offchain-Anwendungsfälle genutzt werden können. -**[Supra](https://supra.com/)** - Ein vertikal integriertes Toolkit von Cross-Chain-Lösungen, das alle Blockchains, öffentliche (L1s und L2s) oder private (Unternehmen), miteinander verbindet und dezentralisierte Oracle-Preis-Feeds bereitstellt, die für Onchain- und Offchain-Anwendungsfälle verwendet werden können. +**[Gas Network](https://gas.network/)** – Eine dezentrale Oracle-Plattform, die Echtzeit-Gaspreisdaten über die Blockchain hinweg bereitstellt. Indem es Daten von führenden Gaspreis-Datenanbietern onchain bereitstellt, trägt das Gas Network zur Förderung der Interoperabilität bei. Das Gas Network unterstützt Daten für über 35 Chains, einschließlich des Ethereum Mainnets und vieler führender L2s. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} **Artikel** -- [Was ist ein Blockchain-Oracle?](https://chain.link/education/blockchain-oracles) - _Chainlink_ -- [Was ist ein Blockchain-Oracle?](https://betterprogramming.pub/what-is-a-blockchain-oracle-f5ccab8dbd72) - _Patrick Collins_ -- [Dezentralisierte Oracle: Ein umfassender Überblick](https://medium.com/fabric-ventures/decentralised-oracles-a-comprehensive-overview-d3168b9a8841) - _Julien Thevenard_ -- [Implementieren eines Blockchain-Oracles auf Ethereum](https://medium.com/@pedrodc/implementieren-ein-blockchain-orakel-auf-ethereum-cedc7e26b49e) - _Pedro Costa_ -- [Warum können Smart Contracts keine API-Aufrufe tätigen?](https://ethereum.stackexchange.com/questions/301/why-cant-contracts-make-api-calls) - _StackExchange_ -- [Sie wollen also ein Preis-Oracle benutzen](https://samczsun.com/so-you-want-to-use-a-price-oracle/) -_samczsun_ +- [Was ist ein Blockchain-Oracle?](https://chain.link/education/blockchain-oracles) – _Chainlink_ +- [Was ist ein Blockchain-Oracle?](https://medium.com/better-programming/what-is-a-blockchain-oracle-f5ccab8dbd72) – _Patrick Collins_ +- [Dezentrale Oracles: ein umfassender Überblick](https://medium.com/fabric-ventures/decentralised-oracles-a-comprehensive-overview-d3168b9a8841) – _Julien Thevenard_ +- [Implementierung eines Blockchain-Oracles auf Ethereum](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) – _Pedro Costa_ +- [Warum können Smart Contracts keine API-Aufrufe tätigen?](https://ethereum.stackexchange.com/questions/301/why-cant-contracts-make-api-calls) – _StackExchange_ +- [Sie möchten also ein Preis-Oracle verwenden](https://samczsun.com/so-you-want-to-use-a-price-oracle/) – _samczsun_ **Videos** -- [Oracles und die Erweiterung der Blockchain-Nützlichkeit](https://youtu.be/BVUZpWa8vpw) — Real Vision Finance -- [Der Unterschied zwischen First-Party- und Third-Party-Oracles](https://blockchainoraclesummit.io/first-party-vs-third-party-oracles/) - Blockchain Oracle Summit +- [Oracles und die Erweiterung des Nutzens der Blockchain](https://youtu.be/BVUZpWa8vpw) – _Real Vision Finance_ **Tutorials** -- [Wie man den aktuellen Ethereum-Preis in Solidity abruft](https://blog.chain.link/fetch-current-crypto-price-data-solidity/) — Chainlink -- [Oracle-Daten konsumieren](https://docs.chroniclelabs.org/Developers/tutorials/Remix) — Chronicle +- [Wie man den aktuellen Preis von Ethereum in Solidity abruft](https://blog.chain.link/fetch-current-crypto-price-data-solidity/) – _Chainlink_ +- [Oracle-Daten konsumieren](https://docs.chroniclelabs.org/Developers/tutorials/Remix) – _Chronicle_ **Beispielprojekte** -- [Chainlink Ethereum Full-Stack-Starter-Projekt](https://github.com/hackbg/chainlink-fullstack) — HackBG +- [Vollständiges Chainlink-Starterprojekt für Ethereum in Solidity](https://github.com/hackbg/chainlink-fullstack) – _HackBG_ diff --git a/public/content/translations/de/developers/docs/programming-languages/dart/index.md b/public/content/translations/de/developers/docs/programming-languages/dart/index.md index 25436497765..02446271233 100644 --- a/public/content/translations/de/developers/docs/programming-languages/dart/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/dart/index.md @@ -5,24 +5,28 @@ lang: de incomplete: true --- -## Erste Schritte mit Smart Contracts und der Solidity-Sprache {#getting-started-with-smart-contracts-and-solidity} +## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} ## Tutorials {#tutorials} -- [Flutter und Blockchain – Hello World Dapp](https://www.geeksforgeeks.org/flutter-and-blockchain-hello-world-dapp/) führt Sie durch die ersten Schritte: - 1. Smart Contract in [Solidity](https://soliditylang.org/) schreiben - 2. Benutzeroberfläche in Dart schreiben -- Eine [mobile dApp mit Flutter zu erstellen](https://medium.com/dash-community/building-a-mobile-dapp-with-flutter-be945c80315a) ist wesentlich kürzer und empfehlenswert für alle, die mit den Grundlagen bereits vertraut sind -- Wenn Sie es vorziehen, durch ein Video zu lernen, können Sie sich [Build Your First Blockchain Flutter App](https://www.youtube.com/watch?v=3Eeh3pJ6PeA) (Erstellen Sie Ihre erste Blockchain-Flutter-App) ansehen, das ungefähr eine Stunde dauert -- Für Ungeduldige ist [Bau einer dezentralen Blockchain-Anwendung mit Flutter und Dart auf Ethereum](https://www.youtube.com/watch?v=jaMFEOCq_1s) empfehlenswert, denn die Dauer beträgt nur etwa zwanzig Minuten. -- [Integrating MetaMask in Flutter application with Web3Modal by WalletConnect](https://www.youtube.com/watch?v=v_M2buHCpc4) (MetaMask in Flutter-Anwendung mit Web3Modal von WalletConnect integrieren) – dieses kurze Video führt Sie durch die Schritte zur Integration von MetaMask in Ihre Flutter-Anwendungen mit der [Web3Modal](https://pub.dev/packages/web3modal_flutter)-Bibliothek von WalletConnect -- [Mobile Blockchain Developer Bootcamp Course With Solidity & Flutter](https://youtube.com/playlist?list=PL4V4Unlk5luhQ26ERO6hWEbcUwHDSSmVH) (Bootcamp-Kurs für mobile Blockchain-Entwickler mit Solidity und Flutter) – Playlist für den Kurs für mobile Blockchain-Entwickler mit vollem Stack +- [Flutter and Blockchain – Hello World Dapp](https://www.geeksforgeeks.org/flutter-and-blockchain-hello-world-dapp/) führt Sie durch alle Schritte für den Einstieg: + 1. Einen Smart Contract in [Solidity](https://soliditylang.org/) schreiben + 2. Benutzeroberfläche in Dart schreiben +- [Building a Mobile dapp with Flutter](https://medium.com/dash-community/building-a-mobile-dapp-with-flutter-be945c80315a) ist viel kürzer und eignet sich möglicherweise besser, + wenn Sie die Grundlagen bereits kennen +- Wenn Sie lieber durch das Ansehen eines Videos lernen, können Sie sich [Build Your First Blockchain Flutter App](https://www.youtube.com/watch?v=3Eeh3pJ6PeA) ansehen, das etwa eine Stunde dauert. +- Wenn Sie ungeduldig sind, bevorzugen Sie vielleicht [Building a Blockchain Decentralized-app with Flutter and Dart on Ethereum](https://www.youtube.com/watch?v=jaMFEOCq_1s), das nur etwa zwanzig Minuten dauert. +- [Integrating MetaMask in Flutter application with Web3Modal by WalletConnect](https://www.youtube.com/watch?v=v_M2buHCpc4) – dieses kurze Video führt Sie durch die Schritte zur Integration von MetaMask in Ihre Flutter-Anwendungen mit der [Web3Modal](https://pub.dev/packages/web3modal_flutter)-Bibliothek von WalletConnect. +- [Mobile Blockchain Developer Bootcamp Course With Solidity & Flutter](https://youtube.com/playlist?list=PL4V4Unlk5luhQ26ERO6hWEbcUwHDSSmVH) – Playlist eines Kurses für Full-Stack-Entwickler mobiler Blockchain-Anwendungen -## Mit Ethereum Clients arbeiten {#working-with-ethereum-clients} +## Arbeiten mit Ethereum-Clients {#working-with-ethereum-clients} -Sie können mit Ethereum dezentrale Anwendungen (oder "dApps") erstellen, die sich die Vorteile von Kryptowährung und der Blockchain-Technologie zu eigen machen. Es gibt mindestens zwei derzeit gepflegte Bibliotheken für Dart, um die [JSON-RPC-API](/developers/docs/apis/json-rpc/) für Ethereum zu verwenden. +Sie können mit Ethereum dezentrale Anwendungen (oder "dApps") erstellen, die sich die Vorteile von Kryptowährung und der Blockchain-Technologie zu eigen machen. +Es gibt mindestens zwei derzeit gepflegte Bibliotheken für Dart, um die +[JSON-RPC API](/developers/docs/apis/json-rpc/) für Ethereum zu verwenden. -1. [Web3dart von simonbutler.eu](https://pub.dev/packages/web3dart) -1. [Ethereum 5.0.0 von darticulate.com](https://pub.dev/packages/ethereum) +1. [Web3dart von pwa.ir](https://pub.dev/packages/web3dart) +2. [Ethereum 5.0.0 von darticulate.com](https://pub.dev/packages/ethereum) -Außerdem gibt es zusätzliche Bibliotheken, mit denen Sie bestimmte Ethereum-Adressen bearbeiten könnten oder mit denen sich die Preise verschiedener Kryptowährungen abrufen lassen. [Die vollständige Liste ist hier einsehbar](https://pub.dev/dart/packages?q=ethereum). +Außerdem gibt es zusätzliche Bibliotheken, mit denen Sie bestimmte Ethereum-Adressen bearbeiten könnten oder mit denen sich die Preise verschiedener Kryptowährungen abrufen lassen. +[Die vollständige Liste finden Sie hier](https://pub.dev/dart/packages?q=ethereum). diff --git a/public/content/translations/de/developers/docs/programming-languages/delphi/index.md b/public/content/translations/de/developers/docs/programming-languages/delphi/index.md index a2d7fae60bc..2482c21b29b 100644 --- a/public/content/translations/de/developers/docs/programming-languages/delphi/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/delphi/index.md @@ -11,46 +11,46 @@ Lernen, mit der Programmiersprache Delphi für Ethereum zu entwickeln -Sie können mit Ethereum dezentrale Anwendungen (oder "dApps") erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. dApps sind vertrauenswürdig. Das bedeutet, dass dApps nach dem Hochladen auf Ethereum immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. Erstellen Sie dezentrale Anwendungen auf Ethereum und interagieren Sie mit Smart Contracts in der Programmiersprache Delphi. -## Erste Schritte mit Smart Contracts und der Solidity-Sprache {#getting-started-with-smart-contracts-and-the-solidity-language} +## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-the-solidity-language} **Erste Schritte bei der Integration von Delphi mit Ethereum** -Benötigen Sie für den Einstieg erst einmal allgemeinere Informationen? Dann empfehlen wir Ihnen [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). +Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Den ersten Smart Contract schreiben](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Kompilieren und Bereitstellen von Solidity Code lernen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -## Referenzen und Links für Einsteiger {#beginner-references-and-links} +## Referenzen und Links für Anfänger {#beginner-references-and-links} **Einführung der Delphereum-Bibliothek** - [Was ist Delphereum?](https://github.com/svanas/delphereum/blob/master/README.md) -- [Verbindung von Delphi mit einer lokalen (in-memory) Blockchain](https://medium.com/@svanas/connecting-delphi-to-a-local-in-memory-blockchain-9a1512d6c5b0) -- [Anbindung von Delphi an das Ethereum-Mainnet](https://medium.com/@svanas/connecting-delphi-to-the-ethereum-main-net-5faf1feffd83) -- [Verbindung von Delphi mit Smart Contracts](https://medium.com/@svanas/connecting-delphi-to-smart-contracts-3146b12803a1) +- [Verbinden von Delphi mit einer lokalen (In-Memory) Blockchain](https://medium.com/@svanas/connecting-delphi-to-a-local-in-memory-blockchain-9a1512d6c5b0) +- [Verbinden von Delphi mit dem Ethereum Mainnet](https://medium.com/@svanas/connecting-delphi-to-the-ethereum-main-net-5faf1feffd83) +- [Verbinden von Delphi mit Smart Contracts](https://medium.com/@svanas/connecting-delphi-to-smart-contracts-3146b12803a1) **Möchten Sie die Einrichtung erst einmal überspringen und direkt zu den Beispielen gehen?** -- [Ein 3-minütiger Smart Contract und Delphi – Teil 1](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-61d998571d) -- [Ein 3-minütiger Smart Contract und Delphi – Teil 2](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-part-2-446925faa47b) +- [Ein 3-Minuten Smart Contract und Delphi – Teil 1](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-61d998571d) +- [Ein 3-Minuten Smart Contract und Delphi – Teil 2](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-part-2-446925faa47b) ## Artikel für Fortgeschrittene {#intermediate-articles} -- [Ethereum-signierte Nachrichten-Signatur in Delphi erstellen](https://medium.com/@svanas/generating-an-ethereum-signed-message-signature-in-delphi-75661ce5031b) -- [Ether mit Delphi übertragen](https://medium.com/@svanas/transferring-ether-with-delphi-b5f24b1a98a4) -- [ERC-20-Token mit Delphi übertragen](https://medium.com/@svanas/transferring-erc-20-tokens-with-delphi-bb44c05b295d) +- [Erstellen einer von Ethereum signierten Nachrichtensignatur in Delphi](https://medium.com/@svanas/generating-an-ethereum-signed-message-signature-in-delphi-75661ce5031b) +- [Ether mit Delphi überweisen](https://medium.com/@svanas/transferring-ether-with-delphi-b5f24b1a98a4) +- [ERC-20-Tokens mit Delphi überweisen](https://medium.com/@svanas/transferring-erc-20-tokens-with-delphi-bb44c05b295d) ## Fortgeschrittene Nutzungsmuster {#advanced-use-patterns} - [Delphi und Ethereum Name Service (ENS)](https://medium.com/@svanas/delphi-and-ethereum-name-service-ens-4443cd278af7) - [QuikNode, Ethereum und Delphi](https://medium.com/@svanas/quiknode-ethereum-and-delphi-f7bfc9671c23) - [Delphi und der Ethereum Dark Forest](https://svanas.medium.com/delphi-and-the-ethereum-dark-forest-5b430da3ad93) -- [Einen Token gegen einen anderen in Delphi austauschen](https://svanas.medium.com/swap-one-token-for-another-in-delphi-bcb999c47f7) +- [Einen Token gegen einen anderen in Delphi tauschen](https://svanas.medium.com/swap-one-token-for-another-in-delphi-bcb999c47f7) -Sind Sie an weiteren Informationen interessiert? Sehen Sie sich [ethereum.org/developers](/developers/) an. +Sind Sie an weiteren Informationen interessiert? Schauen Sie sich [ethereum.org/developers](/developers/) an. diff --git a/public/content/translations/de/developers/docs/programming-languages/dot-net/index.md b/public/content/translations/de/developers/docs/programming-languages/dot-net/index.md index 3c5b6462808..fee6c345b75 100644 --- a/public/content/translations/de/developers/docs/programming-languages/dot-net/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/dot-net/index.md @@ -5,54 +5,54 @@ lang: de incomplete: true --- -Lernen, wie Sie .NET-basierte Projekte und Tools für die Ethereum-Entwicklung nutzen können +Lernen Sie, wie Sie für Ethereum mithilfe von .NET-basierten Projekten und Tools entwickeln -Sie können mit Ethereum dezentrale Anwendungen (oder "dApps") erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. dApps sind vertrauenswürdig. Das bedeutet, dass dApps nach dem Hochladen auf Ethereum immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. Erstellen Sie dezentrale Anwendungen auf Ethereum und interagieren Sie mit Smart Contracts unter Verwendung von Tools und Sprachen aus dem Microsoft-Technologie-Stack – unterstützt C#, Visual Basic .NET, F#, über Tools wie VSCode und Visual Studio, mit dem .NET Framework/.NET Core/.NET Standard. Stellen Sie eine Ethereum-Blockchain mit Microsoft Azure Blockchain in wenigen Minuten bereit. Ethereum lässt sich eben so gut einsetzen wie .NET. -## Erste Schritte mit Smart Contracts und der Solidity-Sprache {#getting-started-with-smart-contracts-and-the-solidity-language} +## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-the-solidity-language} **Erste Schritte bei der Integration von .Net mit Ethereum** -Benötigen Sie für den Einstieg erst einmal allgemeinere Informationen? Dann empfehlen wir Ihnen [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). +Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Den ersten Smart Contract schreiben](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Kompilieren und Bereitstellen von Solidity Code lernen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -## Referenzen und Links für Einsteiger {#beginner-references-and-links} +## Referenzen und Links für Anfänger {#beginner-references-and-links} -**Einführung der Nethereum-Bibliothek und von VS Code Solidity** +**Einführung der Nethereum Bibliothek und VS Code Solidity** -- [Nethereum – Erste Schritte](https://docs.nethereum.com/en/latest/getting-started/) -- [VS Code Solidity installieren](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) -- [Ein .NET-Entwickler-Workflow zum Erstellen und Aufrufen von Ethereum-Smart-Contracts](https://medium.com/coinmonks/a-net-developers-workflow-for-creating-and-calling-ethereum-smart-contracts-44714f191db2) -- [Smart-Contract-Integration mit Nethereum](https://kauri.io/#collections/Getting%20Started/smart-contracts-integration-with-nethereum/#smart-contracts-integration-with-nethereumm) -- [Schnittstellen von .NET und Ethereum-Blockchain-Smart-Contracts mit Nethereum](https://medium.com/my-blockchain-development-daily-journey/interfacing-net-and-ethereum-blockchain-smart-contracts-with-nethereum-2fa3729ac933), auch in [中文版](https://medium.com/my-blockchain-development-daily-journey/%E4%BD%BF%E7%94%A8nethereum%E9%80%A3%E6%8E%A5-net%E5%92%8C%E4%BB%A5%E5%A4%AA%E7%B6%B2%E5%8D%80%E5%A1%8A%E9%8F%88%E6%99%BA%E8%83%BD%E5%90%88%E7%B4%84-4a96d35ad1e1) -- [Nethereum – Eine Open-Source-.NET-Integrationsbibliothek für Blockchain](https://kauri.io/#collections/a%20hackathon%20survival%20guide/nethereum-an-open-source-.net-integration-library/) +- [Nethereum, Erste Schritte](https://docs.nethereum.com/en/latest/getting-started/) +- [Installation von VS Code Solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) +- [Ein Workflow für .NET-Entwickler zum Erstellen und Aufrufen von Ethereum Smart Contracts](https://medium.com/coinmonks/a-net-developers-workflow-for-creating-and-calling-ethereum-smart-contracts-44714f191db2) +- [Integration von Smart Contracts mit Nethereum](https://kauri.io/#collections/Getting%20Started/smart-contracts-integration-with-nethereum/#smart-contracts-integration-with-nethereumm) +- [Anbindung von .NET- und Ethereum-Blockchain-Smart-Contracts mit Nethereum](https://medium.com/my-blockchain-development-daily-journey/interfacing-net-and-ethereum-blockchain-smart-contracts-with-nethereum-2fa3729ac933), auch in [中文版](https://medium.com/my-blockchain-development-daily-journey/%E4%BD%BF%E7%94%A8nethereum%E9%80%A3%E6%8E%A5-net%E5%92%8C%E4%BB%A5%E5%A4%AA%E7%B6%B2%E5%8D%80%E5%A1%8A%E9%8F%88%E6%99%BA%E8%83%BD%E5%90%88%E7%B4%84-4a96d35ad1e1) +- [Nethereum – Eine Open-Source-.NET-Integrationsbibliothek für die Blockchain](https://kauri.io/#collections/a%20hackathon%20survival%20guide/nethereum-an-open-source-.net-integration-library/) - [Ethereum-Transaktionen mit Nethereum in eine SQL-Datenbank schreiben](https://medium.com/coinmonks/writing-ethereum-transactions-to-sql-database-using-nethereum-fd94e0e4fa36) -- [Erfahren Sie, wie Sie Smart Contracts mit C# und VisualStudio einfach umsetzen können](https://koukia.ca/deploy-ethereum-smart-contracts-using-c-and-visualstudio-5be188ae928c) +- [Sehen Sie, wie Sie Ethereum Smart Contracts einfach mit C# und VisualStudio bereitstellen können](https://koukia.ca/deploy-ethereum-smart-contracts-using-c-and-visualstudio-5be188ae928c) **Möchten Sie die Einrichtung erst einmal überspringen und direkt zu den Beispielen gehen?** -- [Playground](http://playground.nethereum.com/) – Interagieren Sie mit Ethereum und erfahren Sie, wie Sie Nethereum über den Browser nutzen +- [Playground](http://playground.nethereum.com/) – Interagieren Sie mit Ethereum und lernen Sie, wie man Nethereum im Browser verwendet. - Kontostand abfragen [C#](http://playground.nethereum.com/csharp/id/1001) [VB.NET](http://playground.nethereum.com/vb/id/2001) - - ERC20-Smart-Contract-Kontostand abfragen [C#](http://playground.nethereum.com/csharp/id/1005) [VB.NET](http://playground.nethereum.com/vb/id/2004) - - Ether auf ein Konto übertragen [C#](http://playground.nethereum.com/csharp/id/1003) [VB.NET](http://playground.nethereum.com/vb/id/2003) + - ERC20-Smart-Contract-Guthaben abfragen [C#](http://playground.nethereum.com/csharp/id/1005) [VB.NET](http://playground.nethereum.com/vb/id/2004) + - Ether auf ein Konto überweisen [C#](http://playground.nethereum.com/csharp/id/1003) [VB.NET](http://playground.nethereum.com/vb/id/2003) - ... und mehr ## Artikel für Fortgeschrittene {#intermediate-articles} -- [Nethereum – Arbeitsbuch/Beispielliste](http://docs.nethereum.com/en/latest/Nethereum.Workbooks/docs/) -- [Eigene Entwickler-Testchains bereitstellen](https://github.com/Nethereum/Testchains) -- [VSCode Codegen-Plug-in für Solidity](https://docs.nethereum.com/en/latest/nethereum-codegen-vscodesolidity/) -- [Unity und Ethereum: warum und wie](https://www.raywenderlich.com/5509-unity-and-ethereum-why-and-how) -- [ASP.NET Core-Web-API für Ethereum-dApps erstellen](https://tech-mint.com/blockchain/create-asp-net-core-web-api-for-ethereum-dapps/) -- [Nethereum Web3 zur Implementierung eines Supply Chain-Tracking-Systems erstellen](http://blog.pomiager.com/post/using-nethereum-web3-to-implement-a-supply-chain-traking-system4) -- [Nethereum-Blockverarbeitung](https://nethereum.readthedocs.io/en/latest/nethereum-block-processing-detail/), mit [C# Playground-Beispiel](http://playground.nethereum.com/csharp/id/1025) -- [Nethereum Websocket Streaming](https://nethereum.readthedocs.io/en/latest/nethereum-subscriptions-streaming/) +- [Nethereum-Arbeitsmappe/Beispielliste](http://docs.nethereum.com/en/latest/Nethereum.Workbooks/docs/) +- [Stellen Sie Ihre eigenen Entwicklungs-Testchains bereit](https://github.com/Nethereum/Testchains) +- [VSCode-Codegen-Plugin für Solidity](https://docs.nethereum.com/en/latest/nethereum-codegen-vscodesolidity/) +- [Unity und Ethereum: Warum und Wie](https://www.raywenderlich.com/5509-unity-and-ethereum-why-and-how) +- [Erstellen einer ASP.NET Core Web API für Ethereum-Dapps](https://tech-mint.com/blockchain/create-asp-net-core-web-api-for-ethereum-dapps/) +- [Verwendung von Nethereum Web3 zur Implementierung eines Lieferketten-Verfolgungssystems](http://blog.pomiager.com/post/using-nethereum-web3-to-implement-a-supply-chain-traking-system4) +- [Nethereum-Blockverarbeitung](https://nethereum.readthedocs.io/en/latest/nethereum-block-processing-detail/), mit [C#-Playground-Beispiel](http://playground.nethereum.com/csharp/id/1025) +- [Nethereum-Websocket-Streaming](https://nethereum.readthedocs.io/en/latest/nethereum-subscriptions-streaming/) - [Kaleido und Nethereum](https://kaleido.io/kaleido-and-nethereum/) - [Quorum und Nethereum](https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Quorum/README.md) @@ -60,27 +60,27 @@ Benötigen Sie für den Einstieg erst einmal allgemeinere Informationen? Dann em - [Azure Key Vault und Nethereum](https://github.com/Azure-Samples/bc-community-samples/tree/master/akv-nethereum) - [Nethereum.DappHybrid](https://github.com/Nethereum/Nethereum.DappHybrid) -- [Ujo Nethereum-Backend-Referenzarchitektur](https://docs.nethereum.com/en/latest/nethereum-ujo-backend-sample/) +- [Ujo-Nethereum-Backend-Referenzarchitektur](https://docs.nethereum.com/en/latest/nethereum-ujo-backend-sample/) -## .NET-Projekte, Tools und andere interessante Dinge {#dot-net-projects-tools-and-other-fun-stuff} +## .NET-Projekte, Tools und andere tolle Dinge {#dot-net-projects-tools-and-other-fun-stuff} -- [Nethereum-Playground](http://playground.nethereum.com/) – _Nethereum-Code-Snippets im Browser kompilieren, erstellen und ausführen_ -- [Nethereum Codegen Blazor](https://github.com/Nethereum/Nethereum.CodeGen.Blazor) – _Nethereum-Codegenerator mit UI in Blazor_ -- [Nethereum Blazor](https://github.com/Nethereum/NethereumBlazor) – _Ein .NET Wasm SPA Light-Blockchain-Explorer und einfache Wallet_ -- [Wonka Business Rules Engine](https://docs.nethereum.com/en/latest/wonka/) – _Eine Business Rules-Engine (für die .NET-Plattform und die Ethereum-Plattform), die von Natur aus Metadaten-basiert ist_ -- [Nethermind](https://github.com/NethermindEth/nethermind) - _Ein .NET Core Ethereum-Client für Linux, Windows, MacOs_ -- [eth-utils](https://github.com/ethereum/eth-utils/) – _Dienstprogrammfunktionen für das Arbeiten mit Codebasen, die mit Ethereum verwandt sind_ -- [TestChains](https://github.com/Nethereum/TestChains) – _vorkonfigurierte .NET-Devchains für schnelles Feedback (PoA)_ +- [Nethereum Playground](http://playground.nethereum.com/) – _Kompilieren, Erstellen und Ausführen von Nethereum-Code-Snippets im Browser_ +- [Nethereum Codegen Blazor](https://github.com/Nethereum/Nethereum.CodeGen.Blazor) – _Nethereum-Codegen mit Benutzeroberfläche in Blazor_ +- [Nethereum Blazor](https://github.com/Nethereum/NethereumBlazor) – _Ein schlanker .NET Wasm SPA Blockchain-Explorer und eine einfache Wallet_ +- [Wonka Business Rules Engine](https://docs.nethereum.com/en/latest/wonka/) – _Eine Business-Rules-Engine (sowohl für die .NET- als auch für die Ethereum-Plattform), die von Natur aus metadatengesteuert ist_ +- [Nethermind](https://github.com/NethermindEth/nethermind) – _Ein .NET-Core-Ethereum-Client für Linux, Windows und macOS_ +- [eth-utils](https://github.com/ethereum/eth-utils/) – _Hilfsfunktionen für die Arbeit mit Ethereum-bezogenen Codebasen_ +- [TestChains](https://github.com/Nethereum/TestChains) – _Vorkonfigurierte .NET-Devchains für schnelle Antwortzeiten (PoA)_ -Sind Sie an weiteren Informationen interessiert? Sehen Sie sich [ethereum.org/developers](/developers/) an. +Sind Sie an weiteren Informationen interessiert? Schauen Sie sich [ethereum.org/developers](/developers/) an. -## .NET-Community-Mitwirkende {#dot-net-community-contributors} +## Mitwirkende der .NET-Community {#dot-net-community-contributors} -Bei Nethereum halten wir uns meistens bei [Gitter](https://gitter.im/Nethereum/Nethereum) auf, wo jeder gerne Fragen stellen oder beantworten, Hilfe bekommen oder einfach nur beobachten kann. Erstellen Sie gerne einen PR oder öffnen ein Problem im [Nethereum Github Repository](https://github.com/Nethereum) oder durchstöbern Sie einfach nur unsere vielen Seiten/Beispielprojekte. Sie können uns auch auf [Discord](https://discord.gg/jQPrR58FxX) finden. +Bei Nethereum sind wir meistens auf [Gitter](https://gitter.im/Nethereum/Nethereum) zu finden, wo jeder willkommen ist, Fragen zu stellen und zu beantworten, Hilfe zu erhalten oder einfach nur dabei zu sein. Erstellen Sie gerne einen PR oder eröffnen Sie ein Issue im [Nethereum-GitHub-Repository](https://github.com/Nethereum), oder stöbern Sie einfach durch die vielen Neben- und Beispielprojekte, die wir haben. Sie finden uns auch auf [Discord](https://discord.gg/jQPrR58FxX)! -Wenn Sie neu bei Nethermind sind und Hilfe beim Einstieg benötigen, treten Sie unserem [Discord](http://discord.gg/PaCMRFdvWT) bei. Unsere Entwickler stehen Ihnen gerne bei Fragen zur Verfügung. Zögern Sie nicht, einen PR zu eröffnen oder Probleme im [Nethermind GitHub-Repository](https://github.com/NethermindEth/nethermind) aufzuzeigen. +Wenn Sie neu bei Nethermind sind und Hilfe bei den ersten Schritten benötigen, treten Sie unserem [Discord](http://discord.gg/PaCMRFdvWT) bei. Unsere Entwickler stehen Ihnen gerne bei Fragen zur Verfügung. Zögern Sie nicht, einen PR zu eröffnen oder im [Nethermind-GitHub-Repository](https://github.com/NethermindEth/nethermind) Issues zu melden. ## Andere zusammengefasste Listen {#other-aggregated-lists} -[Offizielle Nethereum-Seite](https://nethereum.com/) -[Offizielle Nethermind-Seite](https://nethermind.io/) +[Offizielle Nethereum-Website](https://nethereum.com/) +[Offizielle Nethermind-Website](https://nethermind.io/) diff --git a/public/content/translations/de/developers/docs/programming-languages/elixir/index.md b/public/content/translations/de/developers/docs/programming-languages/elixir/index.md new file mode 100644 index 00000000000..0105be9105f --- /dev/null +++ b/public/content/translations/de/developers/docs/programming-languages/elixir/index.md @@ -0,0 +1,55 @@ +--- +title: Ethereum für Elixir-Entwickler +description: Lernen Sie, wie Sie für Ethereum entwickeln, mit Elixir-basierten Projekten und Werkzeugen. +lang: de +incomplete: false +--- + +Lernen Sie, wie Sie für Ethereum entwickeln, mit Elixir-basierten Projekten und Werkzeugen. + +Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. + +## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} + +**Starten Sie Ihre ersten Schritte, um Elixir in Ethereum-Projekte zu integrieren.** + +Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). + +- [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) + +## Artikel für Anfänger {#beginner-articles} + +- [Ethereum-Accounts endlich verstehen](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) +- [Ethers — Eine erstklassige Ethereum-Web3-Bibliothek für Elixir](https://medium.com/@alisinabh/announcing-ethers-a-first-class-ethereum-web3-library-for-elixir-1d64e9409122) + +## Artikel für Fortgeschrittene {#intermediate-articles} + +- [Wie Sie rohe Ethereum-Contract-Transaktionen mit Elixir signieren](https://kohlerjp.medium.com/how-to-sign-raw-ethereum-contract-transactions-with-elixir-f8822bcc813b) +- [Ethereum Smart Contracts und Elixir](https://medium.com/agile-alpha/ethereum-smart-contracts-and-elixir-c7c4b239ddb4) + +## Elixir Projekte und Werkzeuge {#elixir-projects-and-tools} + +### Aktiv {#active} + +- [block_keys](https://github.com/ExWeb3/block_keys) - _BIP32 & BIP44 Implementation in Elixir (Multi-Account Hierarchy for Deterministic Wallets)_ +- ethereumex](https://github.com/mana-ethereum/ethereumex) - _Elixir JSON-RPC client for the Ethereum blockchain_ +- ethers](https://github.com/ExWeb3/elixir_ethers) - _A comprehensive Web3 library for interacting with smart contracts on Ethereum using Elixir_ +- [ethers_kms](https://github.com/ExWeb3/elixir_ethers_kms) - _A KMS signer library for Ethers (sign transactions with AWS KMS)_ +- [ex_abi](https://github.com/poanetwork/ex_abi) - _Ethereum ABI parser/decoder/encoder implementation in Elixir_ +- [ex_keccak](https://github.com/ExWeb3/ex_keccak) - _Elixir library for computing Keccak SHA3-256 hashes using a NIF built tiny-keccak Rust crate_ +- ex_rlp](https://github.com/mana-ethereum/ex_rlp) - _Elixir implementation of Ethereum's RLP (Recursive Length Prefix) encoding_ + +### Archiviert / Wird nicht mehr gepflegt {#archived--no-longer-maintained} + +- [eth](https://hex.pm/packages/eth) - _Ethereum utilities for Elixir_ +- [exw3](https://github.com/hswick/exw3) - _High level Ethereum RPC Client for Elixir_ +- [mana](https://github.com/mana-ethereum/mana) - _Ethereum full node implementation written in Elixir_ + +Sind Sie an weiteren Informationen interessiert? Besuchen Sie [unser Entwickler-Portal](/developers/). + +## Elixir Community Mitwirkende {#elixir-community-contributors} + +Der [Elixir's Slack #ethereum channel](https://elixir-lang.slack.com/archives/C5RPZ3RJL) bietet einer schnell wachsenden Community ein Zuhause und ist die Anlaufstelle für alle Diskussionen rund um die genannten Projekte und verwandte Themen. diff --git a/public/content/translations/de/developers/docs/programming-languages/golang/index.md b/public/content/translations/de/developers/docs/programming-languages/golang/index.md index 42bb427ee95..8c92290938f 100644 --- a/public/content/translations/de/developers/docs/programming-languages/golang/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/golang/index.md @@ -5,80 +5,80 @@ lang: de incomplete: true --- -Lernen, wie Sie mit Go-basierten Projekten und Werkzeugen für Ethereum entwickeln können +Lernen Sie, wie Sie mit Go-basierten Projekten und Tools für Ethereum entwickeln Verwenden Sie Ethereum, um dezentrale Anwendungen (oder "dApps") zu erstellen. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Sie sind dezentralisiert. Das bedeutet, dass sie auf einem Peer-to-Peer-Netzwerk laufen und es keine einzelne Fehlerquelle gibt. Keine einzelne Eintität oder Person kontrolliert sie und es ist fast unmöglich, sie zu zensieren. Sie können digitale Vermögenswerte kontrollieren, um neue Arten von Anwendungen zu erstellen. -## Erste Schritte mit Smart Contracts und der Solidity-Sprache {#getting-started-with-smart-contracts-and-solidity} +## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} **Starten Sie mit der Integration von Go mit Ethereum durch** -Sind Sie an einigen grundlegenden Informationen interessiert? Dann sehen Sie sich auf [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/) um. +Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Den ersten Smart Contract schreiben](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Kompilieren und Bereitstellen von Solidity Code lernen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) - [Vertrags-Tutorial](https://github.com/ethereum/go-ethereum/wiki/Contract-Tutorial) -## Artikel und Bücher für Einsteiger {#beginner-articles-and-books} +## Artikel und Bücher für Anfänger {#beginner-articles-and-books} - [Erste Schritte mit Geth](https://medium.com/@tzhenghao/getting-started-with-geth-c1a30b8d6458) -- [Golang für die Verbindung mit Ethereum verwenden](https://www.youtube.com/watch?v=-7uChuO_VzM) -- [Ethereum-Smart Contracts mit Golang bereitstellen](https://www.youtube.com/watch?v=pytGqQmDslE) -- [Eine Schritt-für-Schritt-Anleitung zum Testen und Verteilen von Ethereum Smart Contracts in Go](https://hackernoon.com/a-step-by-step-guide-to-testing-and-deploying-ethereum-smart-contracts-in-go-9fc34b178d78) +- [Mit Golang mit Ethereum verbinden](https://www.youtube.com/watch?v=-7uChuO_VzM) +- [Ethereum Smart Contracts mit Golang bereitstellen](https://www.youtube.com/watch?v=pytGqQmDslE) +- [Eine Schritt-für-Schritt-Anleitung zum Testen und Bereitstellen von Ethereum Smart Contracts in Go](https://hackernoon.com/a-step-by-step-guide-to-testing-and-deploying-ethereum-smart-contracts-in-go-9fc34b178d78) - [eBook: Ethereum-Entwicklung mit Go](https://goethereumbook.org/) – _Ethereum-Anwendungen mit Go entwickeln_ -## Artikel und Dokumente für Fortgeschrittene {#intermediate-articles-and-docs} +## Artikel und Dokumentationen für Fortgeschrittene {#intermediate-articles-and-docs} -- [Go-Ethereum-Dokumentation](https://geth.ethereum.org/docs/) – _Die Dokumentation für die offizielle Ethereum-Golang_ -- [Leitfaden für Erigon-Programmierer](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/guide.md) - _Illustrierter Leitfaden, einschließlich Zustandsbaum, Multi-Beweise und die Transaktionsverarbeitung_ -- [Erigon und zustandsloses Ethereum](https://youtu.be/3-Mn7OckSus?t=394) - _2020 Ethereum Community-Konferenz (EthCC 3)_ -- [Erigon: Optimierung von Ethereum-Clients](https://www.youtube.com/watch?v=CSpc1vZQW2Q) - _2018 Devcon 4_ +- [Go-Ethereum-Dokumentation](https://geth.ethereum.org/docs/) – _Die Dokumentation für das offizielle Ethereum Golang_ +- [Erigon Programmierleitfaden](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/guide.md) – _Illustrierter Leitfaden mit Zustandsbaum, Multi-Proofs und Transaktionsverarbeitung_ +- [Erigon und zustandsloses Ethereum](https://youtu.be/3-Mn7OckSus?t=394) – _Ethereum Community Conference 2020 (EthCC 3)_ +- [Erigon: Optimierung von Ethereum-Clients](https://www.youtube.com/watch?v=CSpc1vZQW2Q) – _Devcon 4, 2018_ - [Go Ethereum GoDoc](https://godoc.org/github.com/ethereum/go-ethereum) -- [Erstellen einer dApp in Go mit Geth](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/creating-a-dapp-in-go-with-geth/) -- [Mit einem privaten Ethereum-Netzwerk in Golang und Geth arbeiten](https://myhsts.org/tutorial-learn-how-to-work-with-ethereum-private-network-with-golang-with-geth.php) -- [Einheitentests für Solidity-Verträge auf Ethereum mit Go](https://medium.com/coinmonks/unit-testing-solidity-contracts-on-ethereum-with-go-3cc924091281) -- [Schnellreferenz für die Verwendung von Geth als Bibliothek](https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e) +- [Erstellen einer Dapp in Go mit Geth](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/creating-a-dapp-in-go-with-geth/) +- [Arbeiten mit einem privaten Ethereum-Netzwerk mit Golang und Geth](https://myhsts.org/tutorial-learn-how-to-work-with-ethereum-private-network-with-golang-with-geth.php) +- [Unit-Tests für Solidity-Verträge auf Ethereum mit Go](https://medium.com/coinmonks/unit-testing-solidity-contracts-on-ethereum-with-go-3cc924091281) +- [Kurzanleitung zur Verwendung von Geth als Bibliothek](https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e) ## Fortgeschrittene Nutzungsmuster {#advanced-use-patterns} -- [Das GETH-simulierte Backend](https://kauri.io/#collections/An%20ethereum%20test%20toolkit%20in%20Go/the-geth-simulated-backend/#_top) +- [Das simulierte GETH-Backend](https://kauri.io/#collections/An%20ethereum%20test%20toolkit%20in%20Go/the-geth-simulated-backend/#_top) - [Blockchain-as-a-Service-Apps mit Ethereum und Quorum](https://blockchain.dcwebmakers.com/blockchain-as-a-service-apps-using-ethereum-and-quorum.html) -- [Verteilte Speicher-IPFS und Swarm in Ethereum-Blockchain-Anwendungen](https://blockchain.dcwebmakers.com/work-with-distributed-storage-ipfs-and-swarm-in-ethereum.html) -- [Mobile Clients: Bibliotheken und Inproc-Ethereum-Nodes](https://github.com/ethereum/go-ethereum/wiki/Mobile-Clients:-Libraries-and-Inproc-Ethereum-Nodes) -- [Native dAapps: Go-Bindings für Ethereum-Verträge](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) +- [Verteilter Speicher IPFS und Swarm in Ethereum-Blockchain-Anwendungen](https://blockchain.dcwebmakers.com/work-with-distributed-storage-ipfs-and-swarm-in-ethereum.html) +- [Mobile Clients: Bibliotheken und Inproc-Ethereum-Knoten](https://github.com/ethereum/go-ethereum/wiki/Mobile-Clients:-Libraries-and-Inproc-Ethereum-Nodes) +- [Native Dapps: Go-Bindings für Ethereum-Verträge](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) -## Go-Projekte und Tools {#go-projects-and-tools} +## Go-Projekte und -Tools {#go-projects-and-tools} -- [Geth/Go Ethereum](https://github.com/ethereum/go-ethereum) - _Offizielle Go-Implementierung des Ethereum-Protokolls_ -- [Go Ethereum-Codeanalyse](https://github.com/ZtesoftCS/go-ethereum-code-analysis) – _Überprüfung und Analyse des Go Ethereum-Quellcodes_ -- [Erigon](https://github.com/ledgerwatch/erigon) - _Eine schnellere Variante von Go Ethereum mit Schwerpunkt auf Archivierungsknoten_ +- [Geth / Go Ethereum](https://github.com/ethereum/go-ethereum) – _Offizielle Go-Implementierung des Ethereum-Protokolls_ +- [Go Ethereum Code-Analyse](https://github.com/ZtesoftCS/go-ethereum-code-analysis) – _Überprüfung und Analyse des Go Ethereum-Quellcodes_ +- [Erigon](https://github.com/ledgerwatch/erigon) – _Eine schnellere Variante von Go Ethereum mit Schwerpunkt auf Archivierungsknoten_ - [Golem](https://github.com/golemfactory/golem) – _Golem schafft einen globalen Markt für Rechenleistung_ -- [Quorum](https://github.com/jpmorganchase/quorum) – _Eine private Implementierung von Ethereum, die Datenprivatsphäre unterstützt_ -- [Prysm](https://github.com/prysmaticlabs/prysm) – _Ethereum 'Serenity' 2.0 Go-Implementation_ -- [Eth Tweet](https://github.com/yep/eth-tweet) – _Dezentralisiertes Twitter: ein Microblogging-Service, der auf der Ethereum-Blockchain läuft_ -- [Plasma MVP Golang](https://github.com/kyokan/plasma) – _Golang-Implementierung und Erweiterung der Minimal Viable Plasma-Spezifikation_ -- [Offener Ethereum-Mining-Pool](https://github.com/sammy007/open-ethereum-pool) – _Ein Open-Source-Ethereum-Mining-Pool_ -- [Ethereum-HD Wallet](https://github.com/miguelmota/go-ethereum-hdwallet) – _Ethereum-HD Wallet Derivate im Go_ +- [Quorum](https://github.com/jpmorganchase/quorum) – _Eine zugangsbeschränkte Implementierung von Ethereum, die den Datenschutz unterstützt_ +- [Prysm](https://github.com/prysmaticlabs/prysm) – _Go-Implementierung von Ethereum „Serenity“ 2.0_ +- [Eth Tweet](https://github.com/yep/eth-tweet) – _Dezentralisiertes Twitter: Ein Microblogging-Dienst, der auf der Ethereum-Blockchain läuft_ +- [Plasma MVP Golang](https://github.com/kyokan/plasma) — _Golang-Implementierung und Erweiterung der Minimum Viable Plasma-Spezifikation_ +- [Open Ethereum Mining-Pool](https://github.com/sammy007/open-ethereum-pool) – _Ein Open-Source-Ethereum-Mining-Pool_ +- [Ethereum-HD-Wallet](https://github.com/miguelmota/go-ethereum-hdwallet) – _Ableitungen für Ethereum-HD-Wallets in Go_ - [Multi Geth](https://github.com/multi-geth/multi-geth) – _Unterstützung für viele Arten von Ethereum-Netzwerken_ -- [Geth Light Client](https://github.com/zsfelfoldi/go-ethereum/wiki/Geth-Light-Client) – _Light Ethereum-Subprotokoll-Geth-Implementierung_ -- [Ethereum Golang SDK](https://github.com/everFinance/goether) - _Eine einfache Ethereum-Wallet-Implementierung und Hilfsprogramme in Golang_ -- [Covalent Golang SDK](https://github.com/covalenthq/covalent-api-sdk-go) – _effizienter Blockchain-Datenzugriff via Go SDK für über 200 Blockchains_ +- [Geth Light Client](https://github.com/zsfelfoldi/go-ethereum/wiki/Geth-Light-Client) – _Geth-Implementierung des Light Ethereum Subprotocol_ +- [Ethereum Golang SDK](https://github.com/everFinance/goether) – _Eine einfache Ethereum-Wallet-Implementierung und Dienstprogramme in Golang_ +- [Covalent Golang SDK](https://github.com/covalenthq/covalent-api-sdk-go) – _Effizienter Zugriff auf Blockchain-Daten über das Go-SDK für über 200 Blockchains_ -Sind Sie an weiteren Informationen interessiert? Sehen Sie sich [ethereum.org/developers](/developers/) an. +Sind Sie an weiteren Informationen interessiert? Besuchen Sie [ethereum.org/developers](/developers/) -## Go-Community-Mitwirkende {#go-community-contributors} +## Mitwirkende der Go-Community {#go-community-contributors} - [Geth Discord](https://discordapp.com/invite/nthXNEv) - [Geth Gist](https://gitter.im/ethereum/go-ethereum) -- [Gophers Slack](https://invite.slack.golangbridge.org/) – [#ethereum channel](https://gophers.slack.com/messages/C9HP1S9V2) +- [Gophers Slack](https://invite.slack.golangbridge.org/) – [Kanal #ethereum](https://gophers.slack.com/messages/C9HP1S9V2) - [StackExchange – Ethereum](https://ethereum.stackexchange.com/) - [Multi Geth Gitter](https://gitter.im/ethoxy/multi-geth) - [Ethereum Gitter](https://gitter.im/ethereum/home) -- [Geth light Client Gitter](https://gitter.im/ethereum/light-client) +- [Geth Light Client Gitter](https://gitter.im/ethereum/light-client) ## Andere zusammengefasste Listen {#other-aggregated-lists} - [Awesome Ethereum](https://github.com/btomashvili/awesome-ethereum) -- [Consensys: eine maßgebliche Liste der Ethereum-Entwicklertools](https://media.consensys.net/an-definitive-list-of-ethereum-developer-tools-2159ce865974) | [GitHub-Quelle](https://github.com/ConsenSys/ethereum-developer-tools-list) +- [Consensys: Eine endgültige Liste von Ethereum-Entwickler-Tools](https://media.consensys.net/an-definitive-list-of-ethereum-developer-tools-2159ce865974) | [GitHub-Quelle](https://github.com/ConsenSys/ethereum-developer-tools-list) diff --git a/public/content/translations/de/developers/docs/programming-languages/index.md b/public/content/translations/de/developers/docs/programming-languages/index.md index 719f7cdcf48..1a2899b4301 100644 --- a/public/content/translations/de/developers/docs/programming-languages/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/index.md @@ -1,20 +1,22 @@ --- title: Programmiersprachen -description: +description: Entdecken Sie Ethereum-Entwicklungsressourcen für verschiedene Programmiersprachen, darunter JavaScript, Python, Go, Rust und mehr. lang: de --- -Ein häufiges Missverständnis ist, dass Entwickler [Smart Contracts](/developers/docs/smart-contracts/) schreiben müssen, um auf Ethereum aufzubauen. Doch das ist falsch. Einer der Vorteile des Ethereum-Netzwerks und der Ethereum-Community besteht darin, dass es möglich ist, in jeder Programmiersprache am Netzwerk und der Community [teilzunehmen](/community/). +Ein häufiges Missverständnis ist, dass Entwickler [Smart Contracts](/developers/docs/smart-contracts/) schreiben müssen, um auf Ethereum aufzubauen. Doch das ist falsch. +Einer der Vorteile des Ethereum-Netzwerks und der Community ist, dass man in so ziemlich jeder Programmiersprache [teilnehmen](/community/) kann. Die Community von Ethereum und Ethereum selbst ist offen für Open Source, also Quelloffenheit. Zu finden sind Community Projekte – Kundenumsetzungen, APIs (Programmierschnittstellen), Entwickleroberflächen, Tools zu Testzwecken – in einer großen Auswahl an Sprachen. -## Ihre Sprache wählen {#data} +## Wählen Sie Ihre Sprache {#data} Wählen Sie eine Programmiersprache, um Projekte, Ressourcen und virtuelle Communitys zu finden: - [Ethereum für Dart-Entwickler](/developers/docs/programming-languages/dart/) - [Ethereum für Delphi-Entwickler](/developers/docs/programming-languages/delphi/) - [Ethereum für .NET-Entwickler](/developers/docs/programming-languages/dot-net/) +- [Ethereum für Elixir-Entwickler](/developers/docs/programming-languages/elixir/) - [Ethereum für Go-Entwickler](/developers/docs/programming-languages/golang/) - [Ethereum für Java-Entwickler](/developers/docs/programming-languages/java/) - [Ethereum für JavaScript-Entwickler](/developers/docs/programming-languages/javascript/) @@ -26,4 +28,5 @@ Wählen Sie eine Programmiersprache, um Projekte, Ressourcen und virtuelle Commu Wenn Sie auf Ressourcen verlinken oder auf eine virtuelle Gemeinschaft für eine weitere Programmiersprache hinweisen möchten, können Sie eine neue Seite beantragen, indem Sie [ein Thema eröffnen](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -Wenn Sie nur Code schreiben möchten, um mit einer derzeit nicht unterstützten Sprache mit der Blockchain zu kommunizieren, können Sie die [JSON-RPC-Schnittstelle](/developers/docs/apis/json-rpc/) verwenden, um sich mit dem Ethereum-Netzwerk zu verbinden. Jede Programmiersprache, die TCP/IP verwenden kann, kann diese Schnittstelle nutzen. +Wenn Sie nur Code schreiben möchten, um mit einer derzeit nicht unterstützten Sprache mit der Blockchain zu kommunizieren, +können Sie die [JSON-RPC-Schnittstelle](/developers/docs/apis/json-rpc/) verwenden, um sich mit dem Ethereum-Netzwerk zu verbinden. Jede Programmiersprache, die TCP/IP verwenden kann, kann diese Schnittstelle nutzen. diff --git a/public/content/translations/de/developers/docs/programming-languages/java/index.md b/public/content/translations/de/developers/docs/programming-languages/java/index.md index 6bd66f3d937..b573d6f5341 100644 --- a/public/content/translations/de/developers/docs/programming-languages/java/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/java/index.md @@ -5,59 +5,60 @@ lang: de incomplete: true --- -Lernen, wie Sie mit Java-basierten Projekten und Werkzeugen für Ethereum entwickeln können +Lernen Sie, wie Sie mit Java-basierten Projekten und Tools für Ethereum entwickeln Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. -## Erste Schritte mit Smart Contracts und der Solidity-Sprache {#getting-started-with-smart-contracts-and-solidity} +## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} **Erste Schritte bei der Integration von Java mit Ethereum** -Sind Sie an einigen grundlegenden Informationen interessiert? Dann sehen Sie sich auf [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/) um. +Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers.](/developers/) - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Den ersten Smart Contract schreiben](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Kompilieren und Bereitstellen von Solidity Code lernen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -## Mit Ethereum Clients arbeiten {#working-with-ethereum-clients} +## Arbeiten mit Ethereum-Clients {#working-with-ethereum-clients} Lernen Sie, wie Sie [Web3J](https://github.com/web3j/web3j) und Hyperledger Besu, zwei führende Java-Ethereum-Clients, nutzen - [Verbindung zu einem Ethereum-Client mit Java, Eclipse und Web3J](https://kauri.io/article/b9eb647c47a546bc95693acc0be72546/connecting-to-an-ethereum-client-with-java-eclipse-and-web3j) -- [Ein Ethereum-Konto mit Java und Web3j verwalten](https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3j) -- [Einen Java-Wrapper aus Ihrem Smart Contract erstellen](https://kauri.io/article/84475132317d4d6a84a2c42eb9348e4b/generate-a-java-wrapper-from-your-smart-contract) -- [Integration mit einem Ethereum-Smart Contact](https://kauri.io/article/14dc434d11ef4ee18bf7d57f079e246e/interacting-with-an-ethereum-smart-contract-in-java) -- [Empfangsbereitschaft für Ethereum-Smart-Contract-Ereignisse](https://kauri.io/article/760f495423db42f988d17b8c145b0874/listening-for-ethereum-smart-contract-events-in-java) -- [Besu (Pantheon), den Java-Ethereum-Client, mit Linux verwenden](https://kauri.io/article/276dd27f1458443295eea58403fd6965/using-pantheon-the-java-ethereum-client-with-linux) -- [Einen Hyperledger-Besu-(Pantheon)-Node in Java-Integrationstests ausführen](https://kauri.io/article/7dc3ecc391e54f7b8cbf4e5fa0caf780/running-a-pantheon-node-in-java-integration-tests) -- [Web3j Cheat Sheet](https://kauri.io/web3j-cheat-sheet-(java-ethereum)/5dfa1ea941ac3d0001ce1d90/c) +- [Verwaltung eines Ethereum-Kontos mit Java und Web3j](https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3j) +- [Generieren eines Java-Wrappers aus Ihrem Smart Contract](https://kauri.io/article/84475132317d4d6a84a2c42eb9348e4b/generate-a-java-wrapper-from-your-smart-contract) +- [Interagieren mit einem Ethereum Smart Contract](https://kauri.io/article/14dc434d11ef4ee18bf7d57f079e246e/interacting-with-an-ethereum-smart-contract-in-java) +- [Warten auf Ethereum Smart Contract-Ereignisse](https://kauri.io/article/760f495423db42f988d17b8c145b0874/listening-for-ethereum-smart-contract-events-in-java) +- [Verwendung von Besu (Pantheon), dem Java-Ethereum-Client, unter Linux](https://kauri.io/article/276dd27f1458443295eea58403fd6965/using-pantheon-the-java-ethereum-client-with-linux) +- [Ausführen eines Hyperledger Besu (Pantheon)-Nodes in Java-Integrationstests](https://kauri.io/article/7dc3ecc391e54f7b8cbf4e5fa0caf780/running-a-pantheon-node-in-java-integration-tests) +- [Web3j-Spickzettel](https://kauri.io/web3j-cheat-sheet-\(java-ethereum\)/5dfa1ea941ac3d0001ce1d90/c) Lernen Sie, wie Sie [ethers-kt](https://github.com/Kr1ptal/ethers-kt) verwenden – eine asynchrone, hochleistungsfähige Kotlin-Bibliothek zur Interaktion mit EVM-basierten Blockchains. Ausgelegt für JVM und Android-Plattfomen. -- [ERC20-Token übertragen](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/abi/TransferERC20.kt) -- [UniswapV2-Tausch mit Ereignisüberwachung](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/tokenswapwitheventlistening/TokenSwapWithEventListening.kt) -- [ETH-/ERC20-Saldo-Tracker](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/balancetracker/BalanceTracker.kt) + +- [Übertragen von ERC20-Tokens](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/abi/TransferERC20.kt) +- [UniswapV2-Swap mit Ereignisüberwachung](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/tokenswapwitheventlistening/TokenSwapWithEventListening.kt) +- [ETH / ERC20-Guthaben-Tracker](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/balancetracker/BalanceTracker.kt) ## Artikel für Fortgeschrittene {#intermediate-articles} -- [Speicher in einer Java-Anwendung mit IPFS verwalten](https://kauri.io/article/3e8494f4f56f48c4bb77f1f925c6d926/managing-storage-in-a-java-application-with-ipfs) -- [ERC20-Token in Java mit Web3j verwalten](https://kauri.io/article/d13e911bbf624108b1d5718175a5e0a0/manage-erc20-tokens-in-java-with-web3j) +- [Speicherverwaltung in einer Java-Anwendung mit IPFS](https://kauri.io/article/3e8494f4f56f48c4bb77f1f925c6d926/managing-storage-in-a-java-application-with-ipfs) +- [Verwaltung von ERC20-Tokens in Java mit Web3j](https://kauri.io/article/d13e911bbf624108b1d5718175a5e0a0/manage-erc20-tokens-in-java-with-web3j) - [Web3j-Transaktionsmanager](https://kauri.io/article/4cb780bb4d0846438d11885a25b6d7e7/web3j-transaction-managers) ## Fortgeschrittene Nutzungsmuster {#advanced-use-patterns} -- [Eventeum verwenden, um einen Java-Smart-Contract-Daten-Cache zu erstellen](https://kauri.io/article/fe81ee9612eb4e5a9ab72790ef24283d/using-eventeum-to-build-a-java-smart-contract-data-cache) +- [Verwendung von Eventeum zum Erstellen eines Java-Smart-Contract-Datencaches](https://kauri.io/article/fe81ee9612eb4e5a9ab72790ef24283d/using-eventeum-to-build-a-java-smart-contract-data-cache) -## Java-Projekte und Tools {#java-projects-and-tools} +## Java-Projekte und -Tools {#java-projects-and-tools} -- [Web3J (Bibliothek für Interaktion mit Ethereum-Clients)](https://github.com/web3j/web3j) -- [ethers-kt (eine asynchrone, hochleistungsfähige Kotlin-/Java-/Android-Bibliothek für EVM-basierte Blockchains.)](https://github.com/Kr1ptal/ethers-kt) -- [Eventeum (Event Listener)](https://github.com/ConsenSys/eventeum) -- [Mahuta (IPFS-Entwicklertools)](https://github.com/ConsenSys/mahuta) +- [Web3J (Bibliothek für die Interaktion mit Ethereum-Clients)](https://github.com/web3j/web3j) +- [ethers-kt (Asynchrone, hochleistungsfähige Kotlin-/Java-/Android-Bibliothek für EVM-basierte Blockchains.)](https://github.com/Kr1ptal/ethers-kt) +- [Eventeum (Event-Listener)](https://github.com/ConsenSys/eventeum) +- [Mahuta (IPFS-Entwickler-Tools)](https://github.com/ConsenSys/mahuta) -Sind Sie an weiteren Informationen interessiert? Sehen Sie sich [ethereum.org/developers](/developers/) an. +Sind Sie an weiteren Informationen interessiert? Schauen Sie sich [ethereum.org/developers.](/developers/) an. -## Java-Community-Mitwirkende {#java-community-contributors} +## Mitwirkende der Java-Community {#java-community-contributors} - [IO Builders](https://io.builders) - [Kauri](https://kauri.io) diff --git a/public/content/translations/de/developers/docs/programming-languages/javascript/index.md b/public/content/translations/de/developers/docs/programming-languages/javascript/index.md index 4ac1dd46c30..817db545e85 100644 --- a/public/content/translations/de/developers/docs/programming-languages/javascript/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/javascript/index.md @@ -4,35 +4,36 @@ description: Lernen, wie Sie JavaScript-basierte Projekte und Tools für die Eth lang: de --- -JavaScript ist eine der beliebtesten Sprachen im Ethereum-Ökosystem. Es gibt sogar ein [-Team](https://github.com/ethereumjs), das sich dafür einsetzt, so viel von Ethereum wie möglich auf JavaScript zu bringen. +JavaScript ist eine der beliebtesten Sprachen im Ethereum-Ökosystem. Tatsächlich gibt es ein [Team](https://github.com/ethereumjs), das sich dafür einsetzt, so viel von Ethereum wie möglich auf JavaScript zu bringen. -Es gibt Möglichkeiten, JavaScript (oder etwas Ahnliches) auf [allen Ebenen des Stacks](/developers/docs/ethereum-stack/) zu schreiben. +Es gibt Möglichkeiten, JavaScript (oder etwas Ähnliches) auf [allen Ebenen des Stacks](/developers/docs/ethereum-stack/) zu schreiben. ## Mit Ethereum interagieren {#interact-with-ethereum} ### JavaScript-API-Bibliotheken {#javascript-api-libraries} -Wenn Sie mit JavaScript Abfragen für die Blockchain, das Senden von Transaktionen und weitere Aktionen vornehmen möchten, ist es am einfachsten, dafür eine [JavaScript-API-Bibliothek](/developers/docs/apis/javascript/) zu verwenden. Diese APIs ermöglichen Entwicklern die einfache Interaktion mit den [Nodes im Ethereum-Netzwerk](/developers/docs/nodes-and-clients/). +Wenn du JavaScript schreiben möchtest, um die Blockchain abzufragen, Transaktionen zu senden und mehr, ist die Verwendung einer [JavaScript-API-Bibliothek](/developers/docs/apis/javascript/) der bequemste Weg. Diese APIs ermöglichen es Entwicklern, einfach mit den [Nodes im Ethereum-Netzwerk](/developers/docs/nodes-and-clients/) zu interagieren. Sie können diese Bibliotheken verwenden, um mit Smart Contracts auf Ethereum zu interagieren. Das ermöglicht es, eine dApp für Fälle zu erstellen, in denen Sie nur JavaScript verwenden, um mit bereits bestehenden Verträgen zu interagieren. -**Wissenswertes** +**Ansehen** -- [Web3.js](https://web3js.readthedocs.io/) -- [Ethers.js](https://docs.ethers.io/) _– beinhaltet die Implementierung von Ethereum-Wallets und -Utilities in JavaScript und TypeScript._ -- [Viem](https://viem.sh) – Eine TypeScript-Schnittstelle für Ethereum, die zustandslose Primitive auf unterer Ebene für die Interaktion mit Ethereum bereitstellt. +- [Web3.js](https://web3js.readthedocs.io) +- [Ethers.js](https://ethers.org) – _beinhaltet die Implementierung von Ethereum-Wallets und Utilities in JavaScript und TypeScript._ +- [viem](https://viem.sh) – _eine TypeScript-Schnittstelle für Ethereum, die zustandslose Low-Level-Primitive für die Interaktion mit Ethereum bereitstellt._ +- [Drift](https://ryangoree.github.io/drift/) – _eine TypeScript-Meta-Bibliothek mit integriertem Caching, Hooks und Test-Mocks für eine mühelose Ethereum-Entwicklung über Web3-Bibliotheken hinweg._ ### Smart Contracts {#smart-contracts} -Wenn Sie ein JavaScript-Entwickler sind und Ihren eigenen Smart Contract schreiben möchten, sollten Sie sich mit [Solidity](https://solidity.readthedocs.io) vertraut machen. Das ist die am weitesten verbreitete Smart-Contract-Sprache. Sie ist syntaktisch ähnlich wie JavaScript und erleichtert damit das Lernen. +Wenn du ein JavaScript-Entwickler bist und deinen eigenen Smart Contract schreiben möchtest, solltest du dich mit [Solidity](https://solidity.readthedocs.io) vertraut machen. Das ist die am weitesten verbreitete Smart-Contract-Sprache. Sie ist syntaktisch ähnlich wie JavaScript und erleichtert damit das Lernen. -Mehr erfahren über [Smart Contracts](/developers/docs/smart-contracts/). +Mehr über [Smart Contracts](/developers/docs/smart-contracts/). ## Das Protokoll verstehen {#understand-the-protocol} -### Die Ethereum-Virtual Machine (EVM) {#the-ethereum-virtual-machine} +### Die Ethereum Virtual Machine {#the-ethereum-virtual-machine} -Es gibt eine JavaScript-Implementierung der [Ethereum-Virtual Machine (EVM)](/developers/docs/evm/). Sie unterstützt die neuesten Fork-Regeln. Fork-Regeln beziehen sich auf Änderungen, die durch geplante Upgrades an EVM vorgenommen wurden. +Es gibt eine JavaScript-Implementierung der [Ethereum Virtual Machine](/developers/docs/evm/). Sie unterstützt die neuesten Fork-Regeln. Fork-Regeln beziehen sich auf Änderungen, die durch geplante Upgrades an EVM vorgenommen wurden. Aufteteilt wird sie in verschiedene JavaScript-Pakete. Die können Sie sich ansehen, um ein besseres Verständnis zu erlangen: @@ -46,28 +47,26 @@ Auf diese Weise werden Fragen wie "Was ist die Datenstruktur eines Kontos?" leic Wenn Sie sich lieber den geschriebenen Code durchlesen, ist dieses JavaScript eine gute Alternative, um sich all unsere Dokumente durchzulesen. -**Sehen Sie sich das monorepo an** -[`ethereumjs`](https://github.com/ethereumjs/ethereumjs-vm) +**Schau dir die EVM an** +[`@ethereumjs/evm`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/evm) -### Knotenpunkte (Nodes) und Anwendungen (Clients) {#nodes-and-clients} +### Nodes und Clients {#nodes-and-clients} Einer der Clients von Ethereum befindet sich derzeit in der aktiven Entwicklungsphase, sodass Sie einen Einblick in die Funktionsweise der Ethereum-Clients erhalten können, in einer Programmiersprache, die Sie verstehen: JavaScript! -Früher wurde es auf unabhängigen [`Repositories`](https://github.com/ethereumjs/ethereumjs-client) aufgebaut, später wurde es jedoch als Paket in die Monorepo der virtuellen Maschine von Ethereum implementiert. +**Schau dir den Client an** +[`@ethereumjs/client`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/client) -**Sehen Sie sich den Client** -[`ethereumjs-client`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/client) an - -## Andere Projekte {#other-projects} +## Weitere Projekte {#other-projects} Im Bereich Ethereum-JavaScript gibt es noch weitere Neuerungen, darunter: - Bibliotheken mit Wallet-Dienstprogrammen - Tools zum Erstellen, Importieren und Exportieren von Ethereum-Schlüsseln -- Eine Implementierung des `merkle-patricia-Baumes` – Eine Datenstruktur, die im Yellow-Paper von Ethereum skizziert wird. +- eine Implementierung des `merkle-patricia-tree` – eine Datenstruktur, die im Ethereum Yellow Paper beschrieben wird. -Forschen Sie in dem Bereich, der Sie am meisten interessiert, im [EthereumJS-Repository](https://github.com/ethereumjs) +Tauche im [EthereumJS-Repo](https://github.com/ethereumjs) in das ein, was dich am meisten interessiert. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} _Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/programming-languages/python/index.md b/public/content/translations/de/developers/docs/programming-languages/python/index.md index 0ba8e42c693..dcb6cf77de9 100644 --- a/public/content/translations/de/developers/docs/programming-languages/python/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/python/index.md @@ -1,90 +1,99 @@ --- title: Ethereum für Python-Entwickler -description: Lernen, wie Sie mit Python-basierten Projekten und Tools für Ethereum entwickeln können +description: Erfahre, wie du mit Python-basierten Projekten und Werkzeugen für Ethereum entwickeln kannst lang: de incomplete: true --- -Erfahren Sie, wie Sie mit Python-basierten Projekten und Werkzeugen für Ethereum entwickeln können +Lernen Sie, wie Sie mit Python-basierten Projekten und Tools für Ethereum entwickeln -Sie können mit Ethereum dezentrale Anwendungen (oder "dApps") erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. -## Erste Schritte mit Smart Contracts und der Solidity-Sprache {#getting-started-with-smart-contracts-and-solidity} +## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} **Starten Sie mit der Integration von Python mit Ethereum durch** -Sind Sie an einigen grundlegenden Informationen interessiert? Dann sehen Sie sich auf [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/) um. +Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Den ersten Smart Contract schreiben](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Kompilieren und Bereitstellen von Solidity Code lernen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Bericht über den Stand von Python in der Blockchain 2023](https://tradingstrategy.ai/blog/the-state-of-python-in-blockchain-in-2023) -## Informationen für Einsteiger {#beginner-articles} +## Artikel für Anfänger {#beginner-articles} -- [Ein (Python)-Entwicklerhandbuch für Ethereum](https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/) -- [Bericht über den Zustand von Python im Jahr 2023](https://tradingstrategy.ai/blog/the-state-of-python-in-blockchain-in-2023) +- [web3.py-Überblick](https://web3py.readthedocs.io/en/latest/overview.html) +- [Tour durch das Ethereum-Python-Ökosystem](https://snakecharmers.ethereum.org/python-ecosystem/) +- [Ein Leitfaden für (Python-)Entwickler zu Ethereum](https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/) +- [Preiswürdig: Ein Leitfaden für den Ethereum-Python-Hackathon](https://snakecharmers.ethereum.org/prize-worthy/) - [Eine Einführung in Smart Contracts mit Vyper](https://kauri.io/#collections/Getting%20Started/an-introduction-to-smart-contracts-with-vyper/) -- [Einen eigenen ERC20-Token mit Python und Brownie bereitstellen](https://betterprogramming.pub/python-blockchain-token-deployment-tutorial-create-an-erc20-77a5fd2e1a58) - [Wie entwickelt man einen Ethereum-Vertrag mit Python Flask?](https://medium.com/coinmonks/how-to-develop-ethereum-contract-using-python-flask-9758fe65976e) - [Einführung in Web3.py · Ethereum für Python-Entwickler](https://www.dappuniversity.com/articles/web3-py-intro) - [Wie man eine Smart Contract-Funktion mit Python und web3.py aufruft](https://stackoverflow.com/questions/57580702/how-to-call-a-smart-contract-function-using-python-and-web3-py) -## Vertiefende Artikel {#intermediate-articles} +## Artikel für Fortgeschrittene {#intermediate-articles} -- [dApp-Entwicklung für Python-Programmierer](https://levelup.gitconnected.com/dapps-development-for-python-developers-f52b32b54f28) -- [Eine Python-Ethereum-Schnittstelle erstellen: Teil 1](https://hackernoon.com/creating-a-python-ethereum-interface-part-1-4d2e47ea0f4d) -- [Ethereum-Smart Contracts in Python: ein umfassendes Tutorial](https://hackernoon.com/ethereum-smart-contracts-in-python-a-comprehensive-ish-guide-771b03990988) -- [Brownie und Python zur Bereitstellung von Smart Contracts nutzen](https://dev.to/patrickalphac/using-brownie-for-to-deploy-smart-contracts-1kkp) -- [NFTs mit Brownie auf OpenSea erstellen](https://www.freecodecamp.org/news/how-to-make-an-nft-and-render-on-opensea-marketplace/) +- [Freunde von web3.py: Einführung in Ape](https://snakecharmers.ethereum.org/intro-to-ape/) +- [Dapp-Entwicklung für Python-Programmierer](https://levelup.gitconnected.com/dapps-development-for-python-developers-f52b32b54f28) +- [Erstellen einer Python-Ethereum-Schnittstelle: Teil 1](https://hackernoon.com/creating-a-python-ethereum-interface-part-1-4d2e47ea0f4d) +- [Ethereum Smart Contracts in Python: ein (fast) umfassender Leitfaden](https://hackernoon.com/ethereum-smart-contracts-in-python-a-comprehensive-ish-guide-771b03990988) ## Fortgeschrittene Nutzungsmuster {#advanced-use-patterns} -- [Ethereum-Smart Contracts mit Python kompilieren, bereistellen und aufrufen](https://yohanes.gultom.id/2018/11/28/compiling-deploying-and-calling-ethereum-smartcontract-using-python/) -- [Solidity-Smart Contracts mit Slither analysieren](https://kauri.io/#collections/DevOps/analyze-solidity-smart-contracts-with-slither/#analyze-solidity-smart-contracts-with-slither) -- [Blockchain-Fintech-Tutorial: Kreditvergabe und ‑aufnahme mit Python](https://blog.chain.link/blockchain-fintech-defi-tutorial-lending-borrowing-python/) +- [web3.py-Muster: Echtzeit-Ereignis-Abonnements](https://snakecharmers.ethereum.org/subscriptions/) +- [web3.py-Muster: WebSocketProvider](https://snakecharmers.ethereum.org/websocketprovider/) +- [Kompilieren, Bereitstellen und Aufrufen von Ethereum-Smart-Contracts mit Python](https://yohanes.gultom.id/2018/11/28/compiling-deploying-and-calling-ethereum-smartcontract-using-python/) +- [Analysieren von Solidity Smart Contracts mit Slither](https://kauri.io/#collections/DevOps/analyze-solidity-smart-contracts-with-slither/#analyze-solidity-smart-contracts-with-slither) +- [Blockchain-Fintech-Tutorial: Leihen und Verleihen mit Python](https://blog.chain.link/blockchain-fintech-defi-tutorial-lending-borrowing-python/) -## Python-Projekte und Tools {#python-projects-and-tools} +## Archivierte Artikel + +- [Bereitstellen Ihres eigenen ERC20-Tokens mit Python und Brownie](https://betterprogramming.pub/python-blockchain-token-deployment-tutorial-create-an-erc20-77a5fd2e1a58) +- [Verwendung von Brownie und Python zur Bereitstellung von Smart Contracts](https://dev.to/patrickalphac/using-brownie-for-to-deploy-smart-contracts-1kkp) +- [Erstellen von NFTs auf OpenSea mit Brownie](https://www.freecodecamp.org/news/how-to-make-an-nft-and-render-on-opensea-marketplace/) + +## Python-Projekte und -Tools {#python-projects-and-tools} ### Aktiv: {#active} - [Web3.py](https://github.com/ethereum/web3.py) – _Python-Bibliothek für die Interaktion mit Ethereum_ -- [Vyper](https://github.com/ethereum/vyper/) – _Pythonic Smart Contract-Sprache für EVM_ -- [Ape](https://github.com/ApeWorX/ape) – _Das Smart Contract-Entwicklungstool für Python-Experten, Datenwissenschaftler und Sicherheitsexperten_ -- [py-evm](https://github.com/ethereum/py-evm) – _Implementierung der Ethereum -Virtual Machine_ -- [eth-tester](https://github.com/ethereum/eth-tester) – _Tools zum Testen von Ethereum-basierten Anwendungen_ -- [eth-utils](https://github.com/ethereum/eth-utils/) – _Dienstprogrammfunktionen für das Arbeiten mit Codebasen, die mit Ethereum verwandt sind_ -- [py-solc-x](https://pypi.org/project/py-solc-x/) – _Python-Wrapper um den Solc Solidity-Compiler mit 0.5.x Unterstützung_ +- [Vyper](https://github.com/ethereum/vyper/) – _Pythonische Smart-Contract-Sprache für die EVM_ +- [Ape](https://github.com/ApeWorX/ape) – _Das Entwicklungstool für Smart Contracts für Python-Experten, Datenwissenschaftler und Sicherheitsexperten_ +- [py-evm](https://github.com/ethereum/py-evm) – _Implementierung der Ethereum Virtual Machine_ +- [eth-tester](https://github.com/ethereum/eth-tester) – _Tools zum Testen Ethereum-basierter Anwendungen_ +- [eth-utils](https://github.com/ethereum/eth-utils/) – _Hilfsfunktionen für die Arbeit mit Ethereum-bezogenen Codebasen_ +- [py-solc-x](https://pypi.org/project/py-solc-x/) – _Python-Wrapper um den solc Solidity-Compiler mit Unterstützung für 0.5.x_ - [pymaker](https://github.com/makerdao/pymaker) – _Python-API für Maker-Verträge_ -- [siwe](https://github.com/signinwithethereum/siwe-py) – _Mit Ethereum (siwe) für Python anmelden_ -- [Web3 DeFi für Ethereum-Integrationen](https://github.com/tradingstrategy-ai/web3-ethereum-defi) - _Ein Python-Paket mit fertigen Integrationen für ERC-20, Uniswap und andere populäre Projekte_ -- [Wake](https://getwake.io) – _All-in-One-Python-Framework für das Testen von Contracts, Fuzzing, die Bereitstellung, Schwachstellenscans und die Code-Navigation (Sprachserver – [Tools for Solidity](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity))_ +- [siwe](https://github.com/signinwithethereum/siwe-py) – _Sign in with Ethereum (siwe) für Python_ +- [Web3 DeFi für Ethereum-Integrationen](https://github.com/tradingstrategy-ai/web3-ethereum-defi) – _Ein Python-Paket mit fertigen Integrationen für ERC-20, Uniswap und andere beliebte Projekte_ +- [Wake](https://getwake.io) – _All-in-one Python-Framework zum Testen von Verträgen, Fuzzing, Bereitstellung, Scannen von Sicherheitslücken und Code-Navigation (Sprachserver – [Tools für Solidity](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity))_ -### Archiviert/Nicht mehr verwaltet: {#archived--no-longer-maintained} +### Archiviert / Wird nicht mehr gepflegt: {#archived--no-longer-maintained} - [Trinity](https://github.com/ethereum/trinity) – _Ethereum-Python-Client_ - [Mamba](https://github.com/arjunaskykok/mamba) – _Framework zum Schreiben, Kompilieren und Bereitstellen von Smart Contracts in der Sprache Vyper_ - [Brownie](https://github.com/eth-brownie/brownie) – _Python-Framework zum Bereitstellen, Testen und Interagieren mit Ethereum Smart Contracts_ - [pydevp2p](https://github.com/ethereum/pydevp2p) – _Implementierung des Ethereum-P2P-Stacks_ -- [py-wasm](https://github.com/ethereum/py-wasm) – _Python-Implementierung des Web Assembly Interpreters_ +- [py-wasm](https://github.com/ethereum/py-wasm) – _Python-Implementierung des Web-Assembly-Interpreters_ -Sind Sie an weiteren Informationen interessiert? Sehen Sie sich [ethereum.org/developers](/developers/) an. +Sind Sie an weiteren Informationen interessiert? Schauen Sie sich [ethereum.org/developers](/developers/) an. -## Projekte mit Python-Tools {#projects-using-python-tooling} +## Projekte, die Python-Tools verwenden {#projects-using-python-tooling} Die folgenden Ethereum-basierten Projekte verwenden die auf dieser Seite erwähnten Tools. Die zugehörigen Open-Source-Repositorys dienen als gute Referenz für Beispielcode und Best-Practice -Ansätze. -- [Yearn Finance](https://yearn.finance/) und [Yearn Vault Contracts Repository](https://github.com/yearn/yearn-vaults) -- [Curve](https://curve.fi/) und [Curve Smart Contracts Repository](https://github.com/curvefi/curve-contract) -- [BadgerDAO](https://badger.com/) und [Smart Contract mit Brownie-Toolchain](https://github.com/Badger-Finance/badger-system) -- [Sushi](https://sushi.com/) verwendet [Python zum Verwalten und Bereitstellen ihrer Übertragungsverträge](https://github.com/sushiswap/sushi-vesting-protocols) -- [Alpha Finance](https://alphafinance.io/) von Alpha Homora verwendet [ Brownie zum Testen und Bereitstellen von Smart Contracts](https://github.com/AlphaFinanceLab/alpha-staking-contract) +- [Yearn Finance](https://yearn.finance/) und [Yearn Vault Contracts-Repository](https://github.com/yearn/yearn-vaults) +- [Curve](https://www.curve.finance/) und [Curve-Smart-Contracts-Repository](https://github.com/curvefi/curve-contract) +- [BadgerDAO](https://badger.com/) und [Smart Contracts, die die Brownie-Toolchain verwenden](https://github.com/Badger-Finance/badger-system) +- [Sushi](https://sushi.com/) verwendet [Python bei der Verwaltung und Bereitstellung seiner Vesting-Verträge](https://github.com/sushiswap/sushi-vesting-protocols) +- [Alpha Finance](https://alphafinance.io/), bekannt für Alpha Homora, verwendet [Brownie zum Testen und Bereitstellen von Smart Contracts](https://github.com/AlphaFinanceLab/alpha-staking-contract) -## Python Community-Diskussionen {#python-community-contributors} +## Python-Community-Diskussion {#python-community-contributors} -- [Ethereum Python Community Discord](https://discord.gg/9zk7snTfWe) für Web3.py und andere Python Framework-Diskussionen -- [Vyper Discord](https://discord.gg/SdvKC79cJk) für Diskussionen zur Vyper-Smart-Contract-Programmierung +- [Ethereum Python Community Discord](https://discord.gg/9zk7snTfWe) für Diskussionen über Web3.py und andere Python-Frameworks +- [Vyper Discord](https://discord.gg/SdvKC79cJk) für Diskussionen zur Programmierung von Vyper Smart Contracts -## Andere aggregierte Listen {#other-aggregated-lists} +## Andere zusammengefasste Listen {#other-aggregated-lists} -Das Vyper-Wiki verfügt über eine [umfangreiche Liste mit Ressourcen für Vyper](https://github.com/vyperlang/vyper/wiki/Vyper-tools-and-resources) \ No newline at end of file +Das Vyper-Wiki enthält eine [unglaubliche Liste von Ressourcen für Vyper](https://github.com/vyperlang/vyper/wiki/Vyper-tools-and-resources) \ No newline at end of file diff --git a/public/content/translations/de/developers/docs/programming-languages/ruby/index.md b/public/content/translations/de/developers/docs/programming-languages/ruby/index.md index 4324733ac0a..bf5a417351c 100644 --- a/public/content/translations/de/developers/docs/programming-languages/ruby/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/ruby/index.md @@ -5,56 +5,56 @@ lang: de incomplete: false --- -Lernen, wie Sie mit Ruby-basierten Projekten und Tools für Ethereum entwickeln +Lernen Sie, wie Sie mit Ruby-basierten Projekten und Werkzeugen für Ethereum entwickeln. -Sie können mit Ethereum dezentrale Anwendungen (oder "dApps") erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. -## Erste Schritte mit Smart Contracts und der Solidity-Sprache {#getting-started-with-smart-contracts-and-solidity} +## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} **Starten Sie mit der Integration von Ruby mit Ethereum durch** -Sind Sie an einigen grundlegenden Informationen interessiert? Dann sehen Sie sich auf [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/) um. +Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Den ersten Smart Contract schreiben](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Kompilieren und Bereitstellen von Solidity Code lernen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -## Informationen für Einsteiger {#beginner-articles} +## Artikel für Anfänger {#beginner-articles} -- [Endlich Ethereum-Konten verstehen](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) +- [Ethereum-Accounts endlich verstehen](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) - [Endlich Rails-Benutzer mit MetaMask authentifizieren](https://dev.to/q9/finally-authenticating-rails-users-with-metamask-3fj) -- [So verbinden Sie sich über Ruby mit dem Ethereum-Netzwerk](https://www.quicknode.com/guides/web3-sdks/how-to-connect-to-the-ethereum-network-using-ruby) -- [So erzeugen Sie eine neue Ethereum-Adresse in Ruby](https://www.quicknode.com/guides/web3-sdks/how-to-generate-a-new-ethereum-address-in-ruby) +- [Wie man sich mit Ruby mit dem Ethereum-Netzwerk verbindet](https://www.quicknode.com/guides/web3-sdks/how-to-connect-to-the-ethereum-network-using-ruby) +- [Wie man eine neue Ethereum-Adresse in Ruby generiert](https://www.quicknode.com/guides/web3-sdks/how-to-generate-a-new-ethereum-address-in-ruby) ## Artikel für Fortgeschrittene {#intermediate-articles} -- [Blockchain - mit Ruby](https://www.nopio.com/blog/blockchain-app-ruby/) -- [Verwenden Sie Ruby, das mit Ethereum verbunden ist, um den Smart Contract auszuführen](https://titanwolf.org/Network/Articles/Article?AID=87285822-9b25-49d5-ba2a-7ad95fff7ef9) +- [Blockchain-App mit Ruby](https://www.nopio.com/blog/blockchain-app-ruby/) +- [Den Smart Contract mit Ruby ausführen, das mit Ethereum verbunden ist](https://titanwolf.org/Network/Articles/Article?AID=87285822-9b25-49d5-ba2a-7ad95fff7ef9) -## Ruby-Projekte und Tools {#ruby-projects-and-tools} +## Ruby-Projekte und -Werkzeuge {#ruby-projects-and-tools} ### Aktiv {#active} - [eth.rb](https://github.com/q9f/eth.rb) – _Ruby-Bibliothek und RPC-Client zur Verwaltung von Ethereum-Konten, Nachrichten und Transaktionen_ -- [keccak.rb](https://github.com/q9f/keccak.rb) – _Der von Ethereum verwendete Keccak (SHA3) Hash_ -- [siwe-ruby](https://github.com/signinwithethereum/siwe-ruby) – _Ruby-Implementierung der Anmeldung mit Ethereum_ +- [keccak.rb](https://github.com/q9f/keccak.rb) – _Der von Ethereum verwendete Keccak-(SHA3-)Hash_ +- [siwe-ruby](https://github.com/signinwithethereum/siwe-ruby) – _Ruby-Implementierung von „Sign-In with Ethereum“_ - [siwe-rails](https://github.com/signinwithethereum/siwe-rails) – _Rails-Gem, das lokale SIWE-Anmelderouten hinzufügt_ -- [siwe-rails-examples](https://github.com/signinwithethereum/siwe-rails-examples) – _SIWE-Beispiel mit Ruby on Rails und benutzerdefiniertem Controller_ -- [omniauth-siwe](https://github.com/signinwithethereum/omniauth-siwe) – _OmniAuth-Strategie für Anmelden mit Ethereum (SIWE)_ +- [siwe-rails-examples](https://github.com/signinwithethereum/siwe-rails-examples) – _SIWE-Beispiel unter Verwendung von Ruby on Rails mit benutzerdefiniertem Controller_ +- [omniauth-siwe](https://github.com/signinwithethereum/omniauth-siwe) – _OmniAuth-Strategie für Sign In With Ethereum (SIWE)_ - [omniauth-nft](https://github.com/valthon/omniauth-nft) – _OmniAuth-Strategie für die Authentifizierung über NFT-Besitz_ -- [ethereum-on-rails](https://github.com/q9f/ethereum-on-rails) – _Ethereum on Rails-Vorlage, um MetaMask mit Ruby on Rails zu verbinden_ +- [ethereum-on-rails](https://github.com/q9f/ethereum-on-rails) – _Ethereum on Rails-Vorlage, die es ermöglicht, MetaMask mit Ruby on Rails zu verbinden_ -### Archiviert/Nicht mehr verwaltet {#archived--no-longer-maintained} +### Archiviert / Wird nicht mehr gepflegt {#archived--no-longer-maintained} -- [web3-eth](https://github.com/spikewilliams/vtada-ethereum) – _RPC-Methoden des Ethereum-Nodes mit Ruby aufrufen_ +- [web3-eth](https://github.com/spikewilliams/vtada-ethereum) – _Aufrufen von RPC-Methoden eines Ethereum-Nodes mit Ruby_ - [ethereum_tree](https://github.com/longhoangwkm/ethereum_tree) – _Ruby-Bibliothek zur Generierung von ETH-Adressen aus einer Hierarchical Deterministic Wallet nach dem BIP32-Standard_ - [etherlite](https://github.com/budacom/etherlite) – _Ethereum-Integration für Ruby on Rails_ -- [ethereum.rb](https://github.com/EthWorks/ethereum.rb) – _Ruby-Ethereum-Client verwendet die JSON-RPC-Schnittstelle zum Versenden von Transaktionen, zum Erstellen von und Interagieren mit Verträgen und ist ein nützliches Toolkit für die Arbeit mit dem Ethereum-Node_ +- [ethereum.rb](https://github.com/EthWorks/ethereum.rb) – _Ruby-Ethereum-Client mit JSON-RPC-Schnittstelle zum Senden von Transaktionen, Erstellen und Interagieren mit Verträgen sowie ein nützliches Toolkit für die Arbeit mit einem Ethereum-Node_ - [omniauth-ethereum.rb](https://github.com/q9f/omniauth-ethereum.rb) – _Implementiert die Ethereum-Anbieterstrategie für OmniAuth_ -Sind Sie an weiteren Informationen interessiert? Besuchen Sie [unsere Entwickler-Homepage](/developers/). +Sind Sie an weiteren Informationen interessiert? Besuchen Sie [unser Entwickler-Portal](/developers/). ## Mitwirkende der Ruby-Community {#ruby-community-contributors} -Die [Ethereum-Ruby-Telegram-Gruppe](https://t.me/ruby_eth) ist eine schnell wachsende Community und genau die richtige Anlaufstelle für Diskussionen über die oben genannten Projekte und verwandte Themen. +Die [Ethereum Ruby Telegram-Gruppe](https://t.me/ruby_eth) beherbergt eine schnell wachsende Community und ist die zentrale Anlaufstelle für Diskussionen über die oben genannten Projekte und verwandte Themen. diff --git a/public/content/translations/de/developers/docs/programming-languages/rust/index.md b/public/content/translations/de/developers/docs/programming-languages/rust/index.md index 50bfd54d92f..437094e44c9 100644 --- a/public/content/translations/de/developers/docs/programming-languages/rust/index.md +++ b/public/content/translations/de/developers/docs/programming-languages/rust/index.md @@ -5,57 +5,59 @@ lang: de incomplete: true --- -Erfahren Sie, wie Sie mit Rust-basierten Projekten und Tools für Ethereum entwickeln können +Lernen Sie, wie Sie für Ethereum mit Rust-basierten Projekten und Werkzeugen entwickeln -Sie können mit Ethereum dezentrale Anwendungen (oder "dApps") erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. +Sie können mit Ethereum dezentrale Anwendungen (oder „dApps“) erstellen, die von den Vorteilen der Kryptowährung und der Blockchain-Technologie profitieren. Solche dApps sind vertrauenswürdig. Das bedeutet, dass sie, sobald sie auf Ethereum hochgeladen wurden, immer exakt wie programmiert ausgeführt werden. Darüber lassen sich digitale Vermögenswerte verwalten und neuartige Finanzanwendungen erschaffen. Sie können dezentralisiert sein. Das bedeutet, dass keine einzelne Einheit oder Person sie kontrollieren kann. Damit ist es fast unmöglich, sie zu zensieren. -## Erste Schritte mit Smart Contracts und der Solidity-Sprache {#getting-started-with-smart-contracts-and-solidity} +## Erste Schritte mit Smart Contracts und der Sprache Solidity {#getting-started-with-smart-contracts-and-solidity} **Starten Sie mit der Integration von Rust mit Ethereum durch** -Sind Sie an einigen grundlegenden Informationen interessiert? Dann sehen Sie sich auf [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/) um. +Sind Sie an einigen grundlegenden Informationen interessiert? Besuchen Sie [ethereum.org/learn](/learn/) oder [ethereum.org/developers](/developers/). - [Blockchain erklärt](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Smart Contracts verstehen](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Den ersten Smart Contract schreiben](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Kompilieren und Bereitstellen von Solidity Code lernen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Schreiben Sie Ihren ersten Smart Contract](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Lernen Sie Solidity zu kompilieren und bereitstellen](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -## Informationen für Einsteiger {#beginner-articles} +## Artikel für Anfänger {#beginner-articles} -- [Der Rust-Ethereum-Client](https://openethereum.github.io/) \* **Beachten Sie, dass OpenEthereum [veraltet](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd) ist und nicht mehr gepflegt wird.** Nutzen Sie es mit Vorsicht und wechseln Sie besser zu einer anderen Client-Implementierung. -- [Transaktion mit Rust an Ethereum senden](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/sending-ethereum-transactions-with-rust/) -- [Ein Schritt-für-Schritt-Tutorial dazu, wie Sie Contracts in Rust Wasm für Kovan verfassen können](https://github.com/paritytech/pwasm-tutorial) +- [Der Rust Ethereum-Client](https://openethereum.github.io/) \* **Bitte beachten Sie, dass OpenEthereum [veraltet ist](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd) und nicht mehr gewartet wird.** Verwenden Sie es mit Vorsicht und wechseln Sie vorzugsweise zu einer anderen Client-Implementierung. +- [Senden einer Transaktion an Ethereum mit Rust](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/sending-ethereum-transactions-with-rust/) +- [Eine Schritt-für-Schritt-Anleitung, wie Sie Contracts in Rust Wasm für Kovan schreiben](https://github.com/paritytech/pwasm-tutorial) ## Artikel für Fortgeschrittene {#intermediate-articles} ## Fortgeschrittene Nutzungsmuster {#advanced-use-patterns} -- [pwasm_ethereum Bibliothek von Externen, um mit dem Ethereum-ähnlichen Netzwerk zu interagieren](https://github.com/openethereum/pwasm-ethereum) -- [Einen dezentralisierten Chat mit JavaScript und Rust erstellen](https://medium.com/perlin-network/build-a-decentralized-chat-using-javascript-rust-webassembly-c775f8484b52) -- [Erstelle eine dezentralisierte Todo-App mit Vue.js & Rust](https://medium.com/@jjmace01/build-a-decentralized-todo-app-using-vue-js-rust-webassembly-5381a1895beb) +- [pwasm_ethereum externs-Bibliothek zur Interaktion mit einem Ethereum-ähnlichen Netzwerk](https://github.com/openethereum/pwasm-ethereum) -- [Erstellen einer Blockchain in Rust](https://blog.logrocket.com/how-to-build-a-blockchain-in-rust/) +- [Erstellen eines dezentralen Chats mit JavaScript und Rust](https://medium.com/perlin-network/build-a-decentralized-chat-using-javascript-rust-webassembly-c775f8484b52) -## Rust-Projekte und Tools {#rust-projects-and-tools} +- [Erstellen einer dezentralen To-do-App mit Vue.js & Rust](https://medium.com/@jjmace01/build-a-decentralized-todo-app-using-vue-js-rust-webassembly-5381a1895beb) -- [pwasm-ethereum](https://github.com/paritytech/pwasm-ethereum) - _Sammlung von Externen zur Interaktion mit einem Ethereum-ähnlichen Netzwerk_ -- [Lighthouse](https://github.com/sigp/lighthouse) – _Schneller Ethereum-Client auf Konsensebene_ -- [Ethereum WebAssembly](https://ewasm.readthedocs.io/en/mkdocs/) - _Vorgeschlagene Neugestaltung der Ausführungsebene für Ethereum Smart-Contracts mit einer deterministischen Teilmenge von WebAssembly_ -- [oasis_std](https://docs.rs/oasis-std/latest/oasis_std/index.html) – _OASIS-API-Referenz_ -- [Solaris](https://github.com/paritytech/sol-rs) - _Testumgebung für Solidity Smart Contracts Einheitstests unter Verwendung der nativen Parity Client EVM._ -- [SputnikVM](https://github.com/rust-blockchain/evm) – _Implementierung der virtuellen Maschine von Rust Ethereum_ +- [Eine Blockchain in Rust erstellen](https://blog.logrocket.com/how-to-build-a-blockchain-in-rust/) + +## Rust-Projekte und -Werkzeuge {#rust-projects-and-tools} + +- [pwasm-ethereum](https://github.com/paritytech/pwasm-ethereum) – _Sammlung von externen Komponenten zur Interaktion mit einem Ethereum-ähnlichen Netzwerk_ +- [Lighthouse](https://github.com/sigp/lighthouse) - _Schneller Client für die Ethereum-Konsens-Ebene_ +- [Ethereum WebAssembly](https://ewasm.readthedocs.io/en/mkdocs/) – _Vorgeschlagene Neugestaltung der Ausführungsebene für Ethereum Smart Contracts mit einer deterministischen Teilmenge von WebAssembly_ +- [oasis_std](https://docs.rs/oasis-std/latest/oasis_std/index.html) - _OASIS API-Referenz_ +- [Solaris](https://github.com/paritytech/sol-rs) – _Testumgebung für Solidity Smart Contracts Einheitstests unter Verwendung der nativen Parity Client EVM._ +- [SputnikVM](https://github.com/rust-blockchain/evm) - _Rust-Implementierung der Ethereum Virtual Machine_ - [Wavelet](https://wavelet.perlin.net/docs/smart-contracts) - _Wavelet Smart Contract in Rust_ -- [Foundry](https://github.com/foundry-rs/foundry) – _Toolkit für Ethereum-Anwendungsentwicklung_ +- [Foundry](https://github.com/foundry-rs/foundry) - _Toolkit für die Entwicklung von Ethereum-Anwendungen_ - [Alloy](https://alloy.rs) – _Hochleistungsfähige, gut getestete und dokumentierte Bibliotheken zur Interaktion mit Ethereum und anderen EVM-basierten Ketten._ -- [Ethers_rs](https://github.com/gakonst/ethers-rs) – _Ethereum-Bibliothek und Wallet-Implementierung_ -- [SewUp](https://github.com/second-state/SewUp) – _Eine Bibliothek, die Ihnen hilft, Ihren Ethereum-Webassembly-Vertrag mit Rust zu erstellen und genau wie in einem gemeinsamen Backend zu entwickeln_ -- [Substreams](https://github.com/streamingfast/substreams) - _Indexierungstechnologie für parallele Blockchain-Daten_ +- [Ethers_rs](https://github.com/gakonst/ethers-rs) - _Ethereum-Bibliothek und Wallet-Implementierung_ +- [SewUp](https://github.com/second-state/SewUp) – _Eine Bibliothek, die Ihnen hilft, Ihren Ethereum-Webassembly-Vertrag mit Rust zu erstellen und genau wie in einem gängigen Backend zu entwickeln_ +- [Substreams](https://github.com/streamingfast/substreams) - _Parallelisierte Technologie zur Indexierung von Blockchain-Daten_ - [Reth](https://github.com/paradigmxyz/reth) – Reth (kurz für Rust Ethereum) ist eine neue Full-Node-Implementierung für Ethereum -- [Awesome Ethereum Rust](https://github.com/Vid201/awesome-ethereum-rust) – _eine kuratierte Sammlung von Projekten im Ethereum-Ökosystem, die in Rust geschrieben sind_ +- [Awesome Ethereum Rust](https://github.com/Vid201/awesome-ethereum-rust) – _Eine kuratierte Sammlung von Projekten im Ethereum-Ökosystem, die in Rust geschrieben sind_ -Sind Sie an weiteren Informationen interessiert? Sehen Sie sich [ethereum.org/developers](/developers/) an. +Sind Sie an weiteren Informationen interessiert? Schauen Sie sich [ethereum.org/developers.](/developers/) an. -## Mitwirkende der Rust-Community {#rust-community-contributors} +## Rust-Community-Mitwirkende {#rust-community-contributors} - [Ethereum WebAssembly](https://gitter.im/ewasm/Lobby) - [Oasis Gitter](https://gitter.im/Oasis-official/Lobby) diff --git a/public/content/translations/de/developers/docs/scaling/index.md b/public/content/translations/de/developers/docs/scaling/index.md index 0bafa5539ce..3f2e98dee3c 100644 --- a/public/content/translations/de/developers/docs/scaling/index.md +++ b/public/content/translations/de/developers/docs/scaling/index.md @@ -9,103 +9,105 @@ sidebarDepth: 3 Da die Zahl der Nutzer von Ethereum gestiegen ist, hat die Blockchain gewisse Kapazitätsgrenzen erreicht. Dies hat die Kosten für die Nutzung des Netzes in die Höhe getrieben und den Bedarf an „Skalierungslösungen" geschaffen. Es gibt mehrere Lösungen, die erforscht, getestet und umgesetzt werden, die unterschiedliche Ansätze verfolgen, um ähnliche Ziele zu erreichen. -Das Hauptziel der Skalierbarkeit ist die Erhöhung der Transaktionsgeschwindigkeit (schnellere Endgültigkeit) und des Transaktionsdurchsatzes (viele Transaktionen pro Sekunde), ohne dabei die Dezentralisierung oder die Sicherheit zu opfern (mehr zur [Ethereum Vision](/roadmap/vision/)). Hohe Nachfrage auf der Layer-1 Ethereum Blockchain, führt zu langsameren Transaktionen und untragbaren [Gas Preisen](/developers/docs/gas/). Die Erhöhung der Netzwerkkapazität in Bezug auf Geschwindigkeit und Durchsatz ist von grundlegender Bedeutung für eine sinnvolle und massenhafte Einführung von Ethereum. +Das Hauptziel der Skalierbarkeit besteht darin, die Transaktionsgeschwindigkeit (schnellere Finalität) und den Transaktionsdurchsatz (höhere Anzahl von Transaktionen pro Sekunde) zu erhöhen, ohne die Dezentralisierung oder die Sicherheit zu beeinträchtigen. Auf der Layer-1-Ethereum-Blockchain führt eine hohe Nachfrage zu langsameren Transaktionen und untragbaren [Gaspreisen](/developers/docs/gas/). Die Erhöhung der Netzwerkkapazität in Bezug auf Geschwindigkeit und Durchsatz ist von grundlegender Bedeutung für eine sinnvolle und massenhafte Einführung von Ethereum. Geschwindigkeit und Durchsatz sind zwar von Bedeutung, aber es ist entscheidend, dass Skalierungslösungen, die diese Ziele ermöglichen, dezentralisiert und sicher bleiben. Eine niedrige Einstiegshürde für die Betreiber von Knotenpunkten ist von entscheidender Bedeutung, um eine Entwicklung hin zu zentralisierter und unsicherer Rechenleistung zu verhindern. -Konzeptionell unterteilen wir die Skalierung zunächst in On-Chain-Skalierung und Off-Chain-Skalierung. +Konzeptionell kategorisieren wir Skalierung zunächst entweder als Onchain-Skalierung oder Offchain-Skalierung. ## Voraussetzungen {#prerequisites} Sie sollten über ein gutes Verständnis aller grundlegenden Themen verfügen. Die Umsetzung von Skalierungslösungen ist weit fortgeschritten, da die Technologie weniger erprobt ist und weiter erforscht und entwickelt wird. -## On-Chain Skalierung {#on-chain-scaling} +## Onchain-Skalierung {#onchain-scaling} -Diese Methode der Skalierung erfordert Änderungen am Ethereum-Protokoll (Layer 1 [Mainnet](/glossary/#mainnet)). Dem Sharding gilt derzeit das Hauptaugenmerk für diese Skalierungsmethode. +Onchain-Skalierung erfordert Änderungen am Ethereum-Protokoll (Layer-1-[Mainnet](/glossary/#mainnet)). Seit langem wurde die Partitionierung von Ethereum erwartet: Eine Skalierungslösung für Ethereum. Dies würde beinhalten, die Blockchain in diskrete Stücke (Shards) aufzuteilen, die von Teilgruppen von Validatoren verifiziert werden. Jedoch hat das Skalieren durch Layer-2 Rollups als primäre Skalierungstechnik die Führung übernommen. Dies wird durch die Hinzufügung einer neuen kostengünstigeren Form von Daten unterstützt, die an Ethereum-Blöcke angehängt ist und speziell entwickelt wurde, um Rollups für Benutzer kostengünstig zu machen. ### Sharding {#sharding} -Unter Sharding versteht man die horizontale Aufteilung einer Datenbank, um die Last zu verteilen. Im Ethereum-Kontext wird das Sharding die Netzwerküberlastung reduzieren und die Transaktionen pro Sekunde erhöhen, indem neue Ketten, die sogenannten „Shards", geschaffen werden. Dies entlastet auch die einzelnen Prüfer, die nicht mehr die Gesamtheit aller Transaktionen im Netz bearbeiten müssen. +Sharding ist ein Prozess der Datenverwaltung, bei dem alle gespeicherten Daten in mehrere Fragmente aufgeteilt werden. Unterklassen von Validatoren wären für ihre eigenen Shards verantwortlich, anstatt dafür zu sorgen, dass die Gesamtlast des Ethereum-Systems aufrechterhalten wird. Sharding war lange Zeit Teil der Ethereum-[Roadmap](/roadmap/) und sollte ursprünglich vor The Merge zum Proof-of-Stake-Verfahren implementiert werden. Die schnelle Entwicklung von [Layer-2-Rollups](#layer-2-scaling) und die Erfindung von [Danksharding](/roadmap/danksharding) (das Hinzufügen von Blobs mit Rollup-Daten zu Ethereum-Blöcken, die von Validatoren sehr effizient verifiziert werden können) hat jedoch dazu geführt, dass die Ethereum-Community eine Rollup-zentrierte Skalierung anstelle der Skalierung durch Sharding bevorzugt. Dies wird auch dazu beitragen, die Konsenslogik von Ethereum einfacher zu halten. -Erfahren Sie mehr über [Sharding](/roadmap/danksharding/). +## Offchain-Skalierung {#offchain-scaling} -## Off-Chain-Skalierung {#off-chain-scaling} +Offchain-Lösungen werden separat von Layer 1 Mainnet implementiert – sie erfordern keine Änderungen am bestehenden Ethereum-Protokoll. Einige Lösungen, die als „Layer-2“-Lösungen bekannt sind, leiten ihre Sicherheit direkt vom Layer-1-Ethereum-Konsens ab, wie z. B. [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/), [Zero-Knowledge-Rollups](/developers/docs/scaling/zk-rollups/) oder [State Channels](/developers/docs/scaling/state-channels/). Andere Lösungen umfassen die Erstellung neuer Chains in verschiedenen Formen, die ihre Sicherheit separat vom Mainnet ableiten, wie z. B. [Sidechains](#sidechains), [Validiums](#validium) oder [Plasma-Chains](#plasma). Diese Lösungen kommunizieren mit dem Mainnet, leiten aber ihre Sicherheit anders ab, um eine Vielzahl von Zielen zu erreichen. -Off-Chain-Lösungen werden getrennt vom Layer 1 Mainnet implementiert - sie erfordern keine Änderungen am bestehenden Ethereum-Protokoll. Einige Lösungen, die als „Layer-2"-Lösungen bekannt sind, leiten ihre Sicherheit direkt vom Layer-1 Ethereum Konsens her, wie zum Beispiel [optimistische Rollups](/developers/docs/scaling/optimistic-rollups/),[Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups/) oder [State Channels](/developers/docs/scaling/state-channels/). Andere Lösungen beinhalten die Schaffung neuer Ketten in verschiedenen Formen, die ihre Sicherheit getrennt vom Mainnet beziehen, wie [Sidechains](#sidechains) oder [Plasma](#plasma) Ketten. Diese Lösungen kommunizieren mit dem Mainnet, leiten aber ihre Sicherheit anders ab, um eine Vielzahl von Zielen zu erreichen. +### Layer-2-Skalierung {#layer-2-scaling} -### Layer-2 Skalierung {#layer-2-scaling} - -Diese Kategorie von Off-Chain-Lösungen bezieht ihre Sicherheit aus dem Mainnet Ethereum. +Diese Kategorie von Offchain-Lösungen bezieht ihre Sicherheit aus dem Ethereum-Mainnet. Layer-2 ist ein Sammelbegriff für Lösungen, die dazu dienen, Ihre Anwendung zu skalieren, indem sie Transaktionen außerhalb des Ethereum Mainnet (Layer-1) abwickeln und gleichzeitig das robuste dezentrale Sicherheitsmodell vom Mainnet nutzen. Die Transaktionsgeschwindigkeit leidet, wenn das Netzwerk ausgelastet ist, was die Benutzererfahrung im Umgang mit bestimmten Arten von dApps verschlechtert. Und wenn die Netzwerk-Aktivitäten steigen, dann steigen auch die Gaspreise, während sich Transaktionsabsender gegenseitig überbieten wollen. Dies kann die Verwendung von Ethereum sehr teuer machen. -Die meisten Layer-2-Lösungen basieren auf einem Server oder einer Gruppe von Servern, von denen jeder als Knotenpunkt, Validator, Operator, Sequenzer, Blockproduzent oder ähnlich bezeichnet wird. Je nach Implementierung können diese Layer-2-Knotenpunkte von Einzelpersonen, Unternehmen oder Einrichtungen, die sie nutzen, oder von einem Drittanbieter oder von einer großen Gruppe von Einzelpersonen (ähnlich wie beim Mainnet) betrieben werden. Im Allgemeinen werden die Transaktionen an diese Layer-2-Knotenpunkte übermittelt, anstatt direkt an Layer-1 (Mainnet) übermittelt zu werden. Bei einigen Lösungen fasst die Layer-2-Instanz diese dann in Gruppen zusammen, bevor sie sie in Layer-1 verankert werden, woraufhin sie wiederum von Layer-1 gesichert werden und nicht mehr verändert werden können. Die Details, wie dies geschieht, variieren erheblich zwischen verschiedenen Layer-2-Technologien und -Implementierungen. +Die meisten Layer-2-Lösungen basieren auf einem Server oder einer Gruppe von Servern, von denen jeder als Knotenpunkt, Validator, Operator, Sequenzer, Blockproduzent oder ähnlich bezeichnet wird. Je nach Implementierung können diese Layer-2-Knotenpunkte von Einzelpersonen, Unternehmen oder Einrichtungen, die sie nutzen, oder von einem Drittanbieter oder von einer großen Gruppe von Einzelpersonen (ähnlich wie beim Mainnet) betrieben werden. Im Allgemeinen werden die Transaktionen an diese Layer-2-Knotenpunkte übermittelt, anstatt direkt an Layer-1 (Mainnet) übermittelt zu werden. Bei einigen Lösungen fasst die Layer-2-Instanz diese dann in Gruppen zusammen, bevor sie sie an Layer 1 anheftet, wonach sie durch Layer 1 gesichert sind und nicht mehr geändert werden können. Die Details, wie dies geschieht, variieren erheblich zwischen verschiedenen Layer-2-Technologien und -Implementierungen. Eine bestimmte Layer-2-Instanz kann offen sein und von vielen Anwendungen gemeinsam genutzt werden, oder sie kann von einem Projekt bereitgestellt werden und nur dessen Anwendung unterstützen. #### Warum wird Layer-2 gebraucht? {#why-is-layer-2-needed} - Mehr Transaktionen pro Sekunde verbessern die Benutzererfahrung erheblich und reduzieren die Netzwerküberlastung auf dem Ethereum Mainnet. -- Transaktionen werden zu einer einzigen Transaktion auf dem Ethereum Mainnet zusammengefasst, wodurch die Gasgebühren für Benutzer gesenkt werden. Dadurch wiederum wird Ethereum für die Menschen überall integrativer und zugänglicher. +- Transaktionen werden in einer einzigen Transaktion an das Ethereum-Mainnet gebündelt, was die Gasgebühren für die Nutzer reduziert und Ethereum für Menschen überall integrativer und zugänglicher macht. - Keine Aktualisierungen der Skalierbarkeit sollten auf Kosten der Dezentralisierung oder Sicherheit gehen - Layer-2 baut auf Ethereum auf. - Es gibt anwendungsspezifische Layer-2-Netzwerke, die ihre eigenen Vorteile im Umgang mit Assets im großen Maßstab mit sich bringen. +[Mehr über Layer 2](/layer-2/). + #### Rollups {#rollups} Rollups führen Transaktionen außerhalb von Layer-1 aus, und die Daten werden dann an Layer-1 weitergeleitet, wo ein Konsens erzielt wird. Da die Transaktionsdaten in Layer-1-Blöcken enthalten sind, können Rollups durch die eigene Ethereum-Sicherheit gesichert werden. Es gibt zwei Arten von Rollups mit verschiedenen Sicherheitsmodellen: -- **Optimistische Rollups**: geht davon aus, dass Transaktionen standardmäßig gültig sind, und führt nur im Falle einer Anfechtung Berechnungen über einen [**Betrugsnachweis**](/glossary/#fraud-proof) durch. [Mehr über Optimistische Rollups](/Developers/Docs/Scaling/Optimistic-Rollups/). -- **Zero-Knowledge Rollups**: Führt die Berechnung außerhalb der Kette durch und reicht einen [**Gültigkeitsnachweis**](/glossary/#validity-proof) an die Kette ein. [Mehr zu Zero-Knowledge Rollups](/Developers/Docs/Scaling/Zk-Rollups/). +- **Optimistic Rollups**: Gehen standardmäßig davon aus, dass Transaktionen gültig sind, und führen Berechnungen nur im Falle einer Anfechtung mittels eines [**Betrugsbeweises**](/glossary/#fraud-proof) durch. [Mehr über Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/). +- **Zero-Knowledge-Rollups**: Führen Berechnungen offchain durch und übermitteln einen [**Gültigkeitsnachweis**](/glossary/#validity-proof) an die Chain. [Mehr über Zero-Knowledge-Rollups](/developers/docs/scaling/zk-rollups/). -#### Zustandskanäle {#channels} +#### State Channels {#channels} -Zustandskanäle nutzen Multisig-Verträge, um den Teilnehmenden die Möglichkeit zu geben, schnell und frei Transaktionen außerhalb der Kette durchzuführen und diese dann über das Mainnet abzurechnen. Dadurch werden Netzwerküberlastungen, Gebühren und Verzögerungen auf ein Minimum reduziert. Die beiden Arten von Kanälen sind derzeit Zustandskanäle und Zahlungskanäle. +State Channels nutzen Multisig-Verträge, um Teilnehmern schnelle und freie Transaktionen offchain zu ermöglichen, bevor sie die Endgültigkeit mit dem Mainnet abwickeln. Dadurch werden Netzwerküberlastungen, Gebühren und Verzögerungen auf ein Minimum reduziert. Die beiden Arten von Kanälen sind derzeit Zustandskanäle und Zahlungskanäle. -Erfahren Sie mehr über [Zustandskanäle](/Developers/Docs/Scaling/State-Channels/). +Erfahren Sie mehr über [State Channels](/developers/docs/scaling/state-channels/). -### Seitenketten {#sidechains} +### Sidechains {#sidechains} -Eine Seitenkette ist eine unabhängige EVM-kompatible Blockchain, die parallel zum Mainnet läuft. Diese sind über Zweiseitige Brücken mit Ethereum kompatibel und laufen nach ihren eigenen Konsensregeln und Blockparametern. +Eine Sidechain ist eine unabhängige, EVM-kompatible Blockchain, die parallel zum Mainnet läuft. Diese sind über zweiseitige kettenübergreifende Brücken mit Ethereum kompatibel und laufen nach ihren eigenen gewählten Konsensregeln und Blockparametern. -Erfahren Sie mehr über [Seitenketten](/developers/docs/scaling/sidechains/). +Erfahren Sie mehr über [Sidechains](/developers/docs/scaling/sidechains/). ### Plasma {#plasma} -Eine Plasmakette ist eine separate Blockchain, die an der Ethereum-Blockchain verankert ist und Betrugsnachweise (wie [Optimistische Rollups](/developers/docs/scaling/optimistic-rollups/)) verwendet, um Streitigkeiten zu schlichten. +Eine Plasma-Chain ist eine separate Blockchain, die an der Ethereum-Hauptchain verankert ist und Betrugsbeweise (wie [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/)) verwendet, um Streitigkeiten beizulegen. -Erfahren Sie mehr über [Plasma](/Developers/Docs/Scaling/Plasma/). +Erfahren Sie mehr über [Plasma](/developers/docs/scaling/plasma/). ### Validium {#validium} Eine Validium-Kette nutzt Gültigkeitsnachweise wie Zero-Knowledge-Rollups, aber Daten werden nicht auf der Main Layer-1 Ethereum Chain gespeichert. Dies kann zu 10.000 Transaktionen pro Sekunde pro Validium-Kette führen, zudem können mehrere Ketten parallel laufen. -Lernen Sie mehr über [Validium](/developers/docs/scaling/validium/). +Erfahren Sie mehr über [Validium](/developers/docs/scaling/validium/). ## Warum werden so viele Skalierungslösungen benötigt? {#why-do-we-need-these} -- Mehrere Lösungen können dazu beitragen, die Gesamtüberlastung in einem Teil des Netzes zu verringern, und verhindern außerdem einzelne Fehlerquellen. +- Mehrere Lösungen können helfen, die allgemeine Überlastung eines Teils des Netzwerks zu reduzieren und einzelne Fehlerquellen zu vermeiden. - Das Ganze ist größer als die Summe seiner Teile. Es können verschiedene Lösungen existieren und miteinander harmonieren, was einen exponentiellen Effekt auf die künftige Transaktionsgeschwindigkeit und den Durchsatz ermöglicht. - Nicht alle Lösungen erfordern die direkte Nutzung des Ethereum-Konsens-Algorithmus, und Alternativen können Vorteile bieten, die sonst nur schwer zu erreichen wären. -- Eine einzige Skalierungslösung reicht nicht aus, um die [Ethereum Vision](/roadmap/vision/) zu erfüllen. ## Eher der visuelle Lernende? {#visual-learner} -_Beachten Sie, dass in der Erklärung im Video der Begriff „Layer 2" für alle Off-Chain-Skalierungslösungen verwendet wird, während wir „Layer-2" als eine Off-Chain-Lösung bezeichnen, die ihre Sicherheit aus dem Layer 1 Mainnet-Konsens bezieht._ +_Beachten Sie, dass die Erklärung im Video den Begriff "Layer 2" verwendet, um alle Offchain-Skalierungslösungen zu beschreiben, während wir "Layer 2" als eine Offchain-Lösung differenzieren, die ihre Sicherheit durch das Layer-1-Mainnet-Konsensverfahren erhält._ -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Eine Rollup-zentrische Ethereum Roadmap](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698)_Vitalik Buterin_ -- [Aktuelle Analysen zu Layer 2 Skalierungslösungen für Ethereum](https://www.l2beat.com/) -- [Evaluierung von Ethereum Layer 2 Skalierungslösungen: Ein Vergleichsrahmen](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) +- [Eine Rollup-zentrierte Ethereum-Roadmap](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ +- [Aktuelle Analysen zu Layer-2-Skalierungslösungen für Ethereum](https://www.l2beat.com/) +- [Bewertung von Ethereum-Layer-2-Skalierungslösungen: Ein Vergleichsrahmen](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) - [Ein unvollständiger Leitfaden für Rollups](https://vitalik.eth.limo/general/2021/01/05/rollup.html) -- [Ethereum-betriebene ZK-Rollups: Weltmeister](https://hackmd.io/@canti/rkUT0BD8K) -- [Optimistische Rollups ggü. ZK-Rollups](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Warum Rollups + Daten-Shards die einzige nachhaltige Lösung für hohe Skalierbarkeit sind](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - -_Kennen Sie eine Community Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +- [Ethereum-betriebene ZK-Rollups: Weltklasse](https://hackmd.io/@canti/rkUT0BD8K) +- [Optimistic Rollups vs. ZK-Rollups](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) +- [Warum Rollups + Data Shards die einzig nachhaltige Lösung für hohe Skalierbarkeit sind](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) +- [Welche Art von Layer-3s sind sinnvoll?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) +- [Data Availability Or: How Rollups Learned To Stop Worrying And Love Ethereum](https://web.archive.org/web/20250515194659/https://web.archive.org/web/20241108192208/https://research.2077.xyz/data-availability-or-how-rollups-learned-to-stop-worrying-and-love-ethereum) +- [Der praktische Leitfaden für Ethereum-Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) + +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md index abfd1faf2c1..2a892aee405 100644 --- a/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/de/developers/docs/scaling/optimistic-rollups/index.md @@ -1,50 +1,265 @@ --- -title: Optimistische Rollups -description: Einführung in optimistische Rollups +title: Optimistische Rollups (Optimistic Rollups) +description: Eine Einführung in optimistische Rollups – eine Skalierungslösung, die von der Ethereum-Community verwendet wird. lang: de --- +Optimistic Rollups sind Layer-2-Protokolle (L2-Protokolle), die den Durchsatz des Ethereum Base Layers erhöhen sollen. Sie reduzieren den Rechenaufwand in der Ethereum-Hauptkette, indem sie Transaktionen außerhalb der Kette verarbeiten, und bieten so erhebliche Verbesserungen der Verarbeitungsgeschwindigkeit. Im Gegensatz zu anderen Skalierungslösungen, wie zum Beispiel [Sidechains](/developers/docs/scaling/sidechains/), leiten Optimistic Rollups ihre Sicherheit vom Mainnet ab, indem sie Transaktionsergebnisse onchain veröffentlichen, oder [Plasmaketten](/developers/docs/scaling/plasma/), die ebenfalls Transaktionen auf Ethereum mit Betrugsnachweisen verifizieren, aber Transaktionsdaten an anderer Stelle speichern. + +Da die Berechnung der langsame und teure Teil der Nutzung von Ethereum ist, können Optimistic Rollups eine bis zu 10-100-fache Verbesserung der Skalierbarkeit bieten. Optimistic Rollups schreiben Transaktionen auch als `calldata` oder in [Blobs](/roadmap/danksharding/) nach Ethereum und reduzieren so die Gaskosten für die Nutzer. + ## Voraussetzungen {#prerequisites} -Sie sollten ein gutes Verständnis aller grundlegenden Themen und ein umfassendes Verständnis für [Ethereum-Skalierung](/developers/docs/scaling/) haben. Die Implementierung von Skalierungslösungen wie Rollups ist ein fortgeschrittenes Thema, da die Technologie weniger erprobt ist und weiter erforscht und entwickelt wird. +Sie sollten unsere Seiten zu [Skalierungslösungen für Ethereum](/developers/docs/scaling/) und [Layer 2](/layer-2/) gelesen und verstanden haben. + +## Was ist ein Optimistic Rollup? {#what-is-an-optimistic-rollup} + +Ein optimistischer Rollup ist ein Ansatz zur Skalierung von Ethereum, bei dem Berechnungen und Statusspeicherung außerhalb der Kette verschoben werden. Optimistic Rollups führen Transaktionen außerhalb von Ethereum aus, aber veröffentlichen Transaktionsdaten im Mainnet als `calldata` oder in [Blobs](/roadmap/danksharding/). + +Optimistische Rollup Operatoren bündeln mehrere Offchain Transaktionen in großen Stapeln, bevor sie an Ethereum übermittelt werden. Dieser Ansatz ermöglicht es, die Fixkosten auf mehrere Transaktionen in jedem Batch zu verteilen und so die Gebühren für die Endnutzer zu senken. Optimistic Rollups verwenden auch Komprimierungstechniken, um die Menge der auf Ethereum veröffentlichten Daten zu reduzieren. + +Optimistische Rollups gelten als „optimistisch“, da sie davon ausgehen, dass Offchain Transaktionen gültig sind, und keine Gültigkeitsnachweise für Offchain Transaktionsstapel veröffentlichen. Dies unterscheidet Optimistic Rollups von [Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups), die kryptografische [Gültigkeitsnachweise](/glossary/#validity-proof) für Offchain-Transaktionen veröffentlichen. + +Optimistische Rollups basieren stattdessen auf einem Betrugserkennungssystem, um Fälle zu erkennen, in denen Transaktionen nicht korrekt berechnet werden. Nachdem ein Rollup-Batch auf Ethereum eingereicht wurde, gibt es ein Zeitfenster (eine sogenannte Anfechtungsfrist), in dem jeder die Ergebnisse einer Rollup-Transaktion anfechten kann, indem er einen [Betrugsnachweis](/glossary/#fraud-proof) berechnet. + +Wenn der Betrugsnachweis erfolgreich ist, führt das Rollup Protokoll die Transaktion(en) erneut aus und aktualisiert den Status des Rollups entsprechend. Die andere Auswirkung eines erfolgreichen Betrugsnachweises besteht darin, dass der Sequenzer, der für die Aufnahme der falsch ausgeführten Transaktion in einen Block verantwortlich ist, eine Strafe erhält. + +Wenn der Rollup Batch nach Ablauf der Einspruchsfrist unbestritten bleibt (d. h. alle Transaktionen korrekt ausgeführt werden), gilt er als gültig und wird auf Ethereum akzeptiert. Andere können weiterhin auf einem unbestätigten Rollup Block aufbauen, allerdings mit einer Einschränkung: Transaktionsergebnisse werden rückgängig gemacht, wenn sie auf einer zuvor veröffentlichten, falsch ausgeführten Transaktion basieren. + +## Wie interagieren optimistische Rollups mit Ethereum? Optimistic Rollups und Ethereum {#optimistic-rollups-and-Ethereum} + +Optimistic Rollups sind [Offchain-Skalierungslösungen](/developers/docs/scaling/#offchain-scaling), die für den Betrieb auf Ethereum ausgelegt sind. Jeder optimistische Rollup wird durch eine Reihe von Smart Contracts verwaltet, die im Ethereum-Netzwerk bereitgestellt werden. Optimistische Rollups verarbeiten Transaktionen außerhalb der Ethereum-Hauptkette, buchen Offchain Transaktionen jedoch (stapelweise) in einen Offchain Rollup Vertrag. Wie die Ethereum-Blockchain ist dieser Transaktionsdatensatz unveränderlich und bildet die „optimistische Rollup Kette“. + +Die Architektur eines optimistischen Rollups umfasst die folgenden Teile: + +**Onchain-Verträge**: Der Betrieb des Optimistic Rollups wird durch Smart Contracts gesteuert, die auf Ethereum laufen. Dazu gehören Verträge, die Rollup Blöcke speichern, Statusaktualisierungen des Rollups überwachen und Benutzereinzahlungen verfolgen. In diesem Sinne dient Ethereum als Basisschicht oder „Schicht 1“ für optimistische Rollups. + +**Offchain Virtual Machine (VM)**: Obwohl die Verträge, die das Optimistic-Rollup-Protokoll verwalten, auf Ethereum laufen, führt das Rollup-Protokoll Berechnungen und Zustandsspeicherung auf einer anderen virtuellen Maschine durch, die von der [Ethereum Virtual Machine](/developers/docs/evm/) getrennt ist. Die Offchain VM ist der Ort, an dem Anwendungen ausgeführt werden und Statusänderungen ausgeführt werden. Sie dient als obere Schicht oder „Schicht 2“ für ein optimistisches Rollup. + +Da optimistische Rollups zum Ausführen von Programmen konzipiert sind, die entweder für die EVM geschrieben oder kompiliert wurden, enthält die Offchain VM viele EVM Designspezifikationen. Darüber hinaus ermöglichen onchain berechnete Betrugsnachweise dem Ethereum-Netzwerk, die Gültigkeit von Zustandsänderungen durchzusetzen, die in der Offchain-VM berechnet werden. + +Optimistische Rollups werden als „hybride Skalierungslösungen“ bezeichnet, da sie zwar als separate Protokolle existieren, ihre Sicherheitseigenschaften jedoch von Ethereum abgeleitet sind. Ethereum garantiert unter anderem die Richtigkeit der Offchain Berechnung eines Rollups und die Verfügbarkeit der der Berechnung zugrunde liegenden Daten. Dies macht Optimistic Rollups sicherer als reine Offchain-Skalierungsprotokolle (z. B. [Sidechains](/developers/docs/scaling/sidechains/)), die sich für die Sicherheit nicht auf Ethereum verlassen. + +Optimistische Rollups basieren für Folgendes auf dem Hauptprotokoll von Ethereum: + +### Datenverfügbarkeit {#data-availability} + +Wie bereits erwähnt, veröffentlichen Optimistic Rollups Transaktionsdaten als `calldata` oder in [Blobs](/roadmap/danksharding/) auf Ethereum. Da die Ausführung der Rollup Kette auf übermittelten Transaktionen basiert, kann jeder diese Informationen – verankert in der Basisschicht von Ethereum – verwenden, um den Status des Rollups auszuführen und die Richtigkeit der Statusübergänge zu überprüfen. + +[Datenverfügbarkeit](/developers/docs/data-availability/) ist von entscheidender Bedeutung, da Herausforderer ohne Zugriff auf Zustandsdaten keine Betrugsnachweise erstellen können, um ungültige Rollup-Operationen anzufechten. Da Ethereum Datenverfügbarkeit bietet, verringert sich das Risiko, dass Rollup Betreiber mit böswilligen Handlungen (z. B. dem Einreichen ungültiger Blöcke) davonkommen. + +### Zensurresistenz {#censorship-resistance} + +Optimistische Rollups verlassen sich auch auf Ethereum, um Zensur zu widerstehen. Bei einem optimistischen Rollup ist eine zentrale Einheit (der Betreiber) für die Verarbeitung von Transaktionen und die Übermittlung von Rollup Blöcken an Ethereum verantwortlich. Dies hat einige Auswirkungen: + +- Rollup Betreiber können Benutzer zensieren, indem sie vollständig offline gehen oder sich weigern, Blöcke zu erstellen, die bestimmte Transaktionen enthalten. + +- Rollup Betreiber können Benutzer daran hindern, im Rollup Vertrag hinterlegte Gelder abzuheben, indem sie die für Merkle Eigentumsnachweise erforderlichen Statusdaten zurückhalten. Durch das Zurückhalten von Statusdaten kann außerdem der Status des Rollups vor Benutzern verborgen werden und sie daran gehindert werden, mit dem Rollup zu interagieren. + +Optimistische Rollups lösen dieses Problem, indem sie die Betreiber zwingen, Daten zu veröffentlichen, die mit Statusaktualisierungen auf Ethereum verbunden sind. Die Veröffentlichung von Rollup Daten in der Kette bietet folgende Vorteile: + +- Wenn ein optimistischer Rollup Operator offline geht oder die Produktion von Transaktionsstapeln einstellt, kann ein anderer Knoten die verfügbaren Daten verwenden, um den letzten Zustand des Rollups zu reproduzieren und die Blockproduktion fortzusetzen. + +- Benutzer können Transaktionsdaten verwenden, um Merkle Beweise zu erstellen, die den Besitz von Geldern belegen, und ihre Vermögenswerte aus der Zusammenfassung abheben. + +- Benutzer können Transaktionsdaten verwenden, um Merkle Beweise zu erstellen, die den Besitz von Geldern belegen, und ihre Vermögenswerte aus der Zusammenfassung abheben. + +### Abwicklung {#settlement} + +Eine weitere Rolle, die Ethereum im Zusammenhang mit optimistischen Rollups spielt, ist die einer Abwicklungsschicht. Eine Abwicklungsebene verankert das gesamte Blockchain-Ökosystem, sorgt für Sicherheit und bietet objektive Endgültigkeit, wenn auf einer anderen Kette ein Streitfall auftritt (in diesem Fall optimistische Rollups), der ein Schiedsverfahren erfordert. + +Das Ethereum Mainnet bietet einen Hub für optimistische Rollups, um Betrugsnachweise zu überprüfen und Streitigkeiten beizulegen. Darüber hinaus sind auf dem Rollup durchgeführte Transaktionen erst _nachdem_ der Rollup-Block auf Ethereum akzeptiert wurde, endgültig. Sobald eine Rollup Transaktion in der Basisschicht von Ethereum festgeschrieben ist, kann sie nicht mehr zurückgesetzt werden (außer im höchst unwahrscheinlichen Fall einer Kettenneuorganisation). + +## Wie funktionieren optimistische Rollups? {#how-optimistic-rollups-work} + +### Transaktionsausführung und -aggregation {#transaction-execution-and-aggregation} + +Benutzer übermitteln Transaktionen an „Operatoren“, bei denen es sich um Knoten handelt, die für die Verarbeitung von Transaktionen im optimistischen Rollup verantwortlich sind. Der Betreiber, auch als „Validator“ oder „Aggregator“ bezeichnet, aggregiert Transaktionen, komprimiert die zugrunde liegenden Daten und veröffentlicht den Block auf Ethereum. + +Obwohl jeder ein Validator werden kann, müssen die Validatoren von Optimistic Rollups eine Kaution hinterlegen, bevor sie Blöcke produzieren, ähnlich wie bei einem [Proof-of-Stake-System](/developers/docs/consensus-mechanisms/pos/). Diese Bindung kann gekürzt werden, wenn der Prüfer einen ungültigen Block postet oder auf einem alten, aber ungültigen Block aufbaut (auch wenn sein Block gültig ist). Auf diese Weise nutzen optimistische Rollups kryptoökonomische Anreize, um sicherzustellen, dass die Validierer ehrlich handeln. + +Von anderen Validatoren in der optimistischen Rollup Kette wird erwartet, dass sie die übermittelten Transaktionen mithilfe ihrer Kopie der Rollup Statistik ausführen. Wenn der Endzustand eines Validators vom vorgeschlagenen Zustand des Betreibers abweicht, kann dieser eine Herausforderung starten und einen Betrugsnachweis berechnen. + +Einige optimistische Rollups verzichten möglicherweise auf ein erlaubnisfreies Validierungs system und verwenden einen einzelnen „Sequenzer“ zur Ausführung der Kette. Wie ein Validator verarbeitet der Sequenzer Transaktionen, erstellt Rollup Blöcke und übermittelt Rollup Transaktionen an die L1-Kette (Ethereum). + +Der Sequenzer unterscheidet sich von einem normalen Rollup Operator, da er eine größere Kontrolle über die Reihenfolge der Transaktionen hat. Darüber hinaus hat der Sequenzer vorrangigen Zugriff auf die Rollup Kette und ist die einzige Entität, die berechtigt ist, Transaktionen an den Onchain Vertrag zu übermitteln. Transaktionen von Nicht-Sequenzer knoten oder regulären Benutzern werden einfach in einem separaten Posteingang in die Warteschlange gestellt, bis der Sequenzer sie in einen neuen Stapel aufnimmt. + +#### Einreichen von Rollup-Blöcken bei Ethereum {#submitting-blocks-to-ethereum} + +Wie bereits erwähnt, bündelt der Betreiber eines optimistischen Rollups Offchain Transaktionen in einem Stapel und sendet diesen zur notariellen Beglaubigung an Ethereum. Dieser Prozess beinhaltet das Komprimieren von transaktionsbezogenen Daten und deren Veröffentlichung auf Ethereum als `calldata` oder in Blobs. + +`calldata` ist ein nicht veränderbarer, nicht persistenter Bereich in einem Smart Contract, der sich größtenteils wie der [Speicher](/developers/docs/smart-contracts/anatomy/#memory) verhält. Obwohl `calldata` onchain als Teil der [Verlaufsprotokolle](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) der Blockchain bestehen bleibt, wird es nicht als Teil des Zustands von Ethereum gespeichert. Da `calldata` keinen Teil des Ethereum-Zustands berührt, ist es für die Speicherung von Daten onchain günstiger als der Zustand. + +Das `calldata`-Schlüsselwort wird auch in Solidity verwendet, um Argumente zur Ausführungszeit an eine Smart-Contract-Funktion zu übergeben. `calldata` identifiziert die Funktion, die während einer Transaktion aufgerufen wird, und enthält die Eingaben für die Funktion in Form einer beliebigen Byte-Sequenz. + +Im Kontext von Optimistic Rollups wird `calldata` verwendet, um komprimierte Transaktionsdaten an den Onchain-Vertrag zu senden. Der Rollup Operator fügt einen neuen Stapel hinzu, indem er die erforderliche Funktion im Rollup Vertrag aufruft und die komprimierten Daten als Funktionsargumente übergibt. Die Verwendung von `calldata` reduziert die Nutzergebühren, da die meisten Kosten, die bei Rollups anfallen, durch die Speicherung von Daten onchain entstehen. + +Hier ist [ein Beispiel](https://eth.blockscout.com/tx/0x9102bfce17c58b5fc1c974c24b6bb7a924fb5fbd7c4cd2f675911c27422a5591) für die Einreichung eines Rollup-Batches, um zu zeigen, wie dieses Konzept funktioniert. Der Sequencer rief die Methode `appendSequencerBatch()` auf und übergab die komprimierten Transaktionsdaten als Eingaben mittels `calldata`. + +Einige Rollups verwenden jetzt blobs, um Transaktionsstapel an Ethereum zu senden. + +Blobs sind nicht modifizierbar und nicht persistent (genau wie `calldata`), werden aber nach ca. 18 Tagen aus dem Verlauf entfernt. Weitere Informationen zu Blobs finden Sie unter [Danksharding](/roadmap/danksharding). + +### Zustands-Commitments {#state-commitments} + +Zu jedem Zeitpunkt ist der Zustand des Optimistic Rollups (Konten, Guthaben, Vertragscode usw.) als ein [Merkle Tree](/whitepaper/#merkle-trees) organisiert, der „Zustandsbaum“ genannt wird. Die Wurzel dieses Merkle Baums (Statuswurzel), die auf den neuesten Status des Rollups verweist, wird gehasht und im Rollup Vertrag gespeichert. Jeder Zustandsübergang in der Kette erzeugt einen neuen Rollup Zustand, den ein Operator durch Berechnung einer neuen Zustandswurzel festlegt. + +Der Betreiber ist verpflichtet, bei der Stapelveröffentlichung sowohl alte als auch neue Statuswurzeln anzugeben. Wenn die alte State Root mit der bestehenden State Root im Offchain Vertrag übereinstimmt, wird letztere verworfen und durch die neue State Root ersetzt. + +Der Rollup Operator muss außerdem eine Merkle Wurzel für den Transaktionsstapel selbst festlegen. Dies ermöglicht es jedem, die Aufnahme einer Transaktion in den Batch (auf L1) durch Vorlage eines [Merkle-Beweises](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) nachzuweisen. + +Zustandsverpflichtungen, insbesondere Zustandswurzeln, sind notwendig, um die Richtigkeit von Zustandsänderungen in einem optimistischen Rollup nachzuweisen. Der Rollup Vertrag akzeptiert neue Statuswurzeln von Operatoren unmittelbar nach ihrer Veröffentlichung, kann jedoch später ungültige Statuswurzeln löschen, um das Rollup wieder in den richtigen Zustand zu versetzen. + +### Betrugsnachweisverfahren {#fraud-proving} + +Wie erläutert, ermöglichen optimistische Rollups jedem, Blöcke zu veröffentlichen, ohne Gültigkeitsnachweise vorlegen zu müssen. Um jedoch sicherzustellen, dass die Kette sicher bleibt, legen optimistische Rollups ein Zeitfenster fest, in dem jeder einen Zustandsübergang anfechten kann. Daher werden Rollup Blöcke als „Behauptungen“ bezeichnet, da jeder ihre Gültigkeit bestreiten kann. + +Wenn jemand eine Behauptung bestreitet, leitet das Rollup Protokoll die Betrugsschutzberechnung ein. Jede Art von Betrugsnachweis ist interaktiv – jemand muss eine Behauptung posten, bevor eine andere Person sie anfechten kann. Der Unterschied liegt darin, wie viele Interaktionsrunden erforderlich sind, um den Betrugsnachweis zu berechnen. + +Interaktive Einzelrunden-Beweisschemata spielen umstrittene Transaktionen auf L1 erneut ab, um ungültige Behauptungen zu erkennen. Das Rollup Protokoll emuliert die erneute Ausführung der umstrittenen Transaktion auf L1 (Ethereum) mithilfe eines Prüfer Vertrags, wobei die berechnete Statuswurzel bestimmt, wer die Herausforderung gewinnt. Wenn die Behauptung des anfechters über den korrekten Zustand des Rollups zutrifft, wird der Betreiber mit einer Kürzung seiner Kaution bestraft. + +Die erneute Ausführung von Transaktionen auf L1 zur Erkennung von Betrug erfordert jedoch die Veröffentlichung von Statusverpflichtungen für einzelne Transaktionen und erhöht die Daten Rollups, die in der Kette veröffentlicht werden müssen. Auch die Wiederholung von Transaktionen verursacht erhebliche Gaskosten. Aus diesen Gründen wechseln optimistische Rollups zu interaktiven Beweisverfahren mit mehreren Runden, mit denen das gleiche Ziel (d. h. das Erkennen ungültiger Rollup Vorgänge) effizienter erreicht wird. + +#### Interaktives Beweisverfahren mit mehreren Runden {#multi-round-interactive-proving} + +Bei der interaktiven Beweisführung über mehrere Runden handelt es sich um ein Hin- und Her-Protokoll zwischen dem behauptet und dem Herausforderer, das von einem L1-Prüfer vertrag überwacht wird, der letztendlich über die lügende Partei entscheidet. Nachdem ein L2-Knoten eine Behauptung angefochten hat, muss der behauptet die umstrittene Behauptung in zwei gleiche Hälften teilen. Jede einzelne Behauptung enthält in diesem Fall genauso viele Berechnungsschritte wie die anderen. + +Der Herausforderer wählt dann aus, welche Behauptung er anfechten möchte. Der Teilungsprozess (ein sogenanntes „Bisektionsprotokoll“) wird fortgesetzt, bis beide Parteien eine Behauptung über einen _einzigen_ Ausführungsschritt anfechten. An diesem Punkt wird der L1-Vertrag den Streit beilegen, indem er die Anweisung (und ihr Ergebnis) auswertet, um die betrügerische Partei zu fassen. + +Der behauptet muss einen „Ein-Schritt-Beweis“ vorlegen, der die Gültigkeit der umstrittenen Ein-Schritt-Berechnung bestätigt. Wenn der behauptet den Ein-Schritt-Beweis nicht vorlegen kann oder der L1-Verifizierer den Beweis für ungültig hält, verliert er die Anfechtung. + +Einige Hinweise zu dieser Art des Betrugsnachweises: + +1. Der interaktive Betrugsnachweis in mehreren Runden gilt als effizient, da er den Aufwand der L1-Kette bei der Streitschlichtung minimiert. Anstatt die gesamte Transaktion erneut abzuspielen, muss die L1-Kette nur einen Schritt bei der Ausführung des Rollups erneut ausführen. + +2. Halbierung Protokoll reduzieren die Menge der in der Kette veröffentlichten Daten (es ist nicht erforderlich, für jede Transaktion Status-Commits zu veröffentlichen). Darüber hinaus unterliegen optimistische Rollup Transaktionen nicht der Gasgrenze von Ethereum. Umgekehrt müssen optimistische Rollups, die Transaktionen erneut ausführen, sicherstellen, dass eine L2-Transaktion ein niedrigeres Gaslimit hat, um ihre Ausführung innerhalb einer einzelnen Ethereum-Transaktion zu emulieren. + +3. Ein Teil der Anleihe des böswilligen Behauptet wird dem Herausforderer zugesprochen, während der andere Teil verbrannt wird. Das Verbrennen verhindert Absprachen zwischen Validatoren. Wenn zwei Validierer zusammenarbeiten, um Scheinherausforderungen zu initiieren, verlieren sie dennoch einen beträchtlichen Teil des gesamten Einsatzes. + +4. Bei der interaktiven Beweisführung über mehrere Runden müssen beide Parteien (der Behauptet und der Challenger) innerhalb des angegebenen Zeitfensters ihre Züge machen. Wird die Frist nicht eingehalten, verfällt die Anfechtung für die säumige Partei. + +#### Warum Betrugsnachweise für Optimistic Rollups wichtig sind {#fraud-proof-benefits} + +Betrugsnachweise sind wichtig, weil sie die _vertrauenslose Finalität_ in Optimistic Rollups ermöglichen. Vertrauenslose Endgültigkeit ist eine Eigenschaft optimistischer Rollups, die garantiert, dass eine Transaktion sofern sie gültig ist letztendlich bestätigt wird. + +Böswillige Knoten können versuchen, die Bestätigung eines gültigen Rollup Blocks durch das Starten falscher Herausforderungen zu verzögern. Betrugsnachweise werden jedoch letztendlich die Gültigkeit des Rollup Blocks beweisen und zu seiner Bestätigung führen. + +Dies bezieht sich auch auf eine weitere Sicherheitseigenschaft von Optimistic Rollups: Die Gültigkeit der Kette hängt von der Existenz _eines_ ehrlichen Knotens ab. Der ehrliche Knoten kann die Kette korrekt voranbringen, indem er entweder gültige Behauptungen postet oder ungültige Behauptungen bestreitet. Wie dem auch sei, böswillige Knoten, die in einen Streit mit dem ehrlichen Knoten geraten, verlieren im Laufe des Betrugsnachweisprozesses ihren Einsatz. + +### L1/L2-Interoperabilität {#l1-l2-interoperability} + +Optimistische Rollups sind für die Interoperabilität mit dem Ethereum-Mainnet konzipiert und ermöglichen Benutzern die Übertragung von Nachrichten und beliebigen Daten zwischen L1 und L2. Sie sind auch mit der EVM kompatibel, sodass Sie bestehende [Dapps](/developers/docs/dapps/) auf Optimistic Rollups portieren oder mit den Entwicklungstools von Ethereum neue Dapps erstellen können. + +#### 1. Asset-Bewegung {#asset-movement} + +##### Eingabe des Rollups + +Um einen Optimistic Rollup zu verwenden, zahlen Nutzer ETH, ERC-20-Token und andere akzeptierte Vermögenswerte in den Vertrag der [kettenübergreifenden Brücke](/developers/docs/bridges/) des Rollups auf L1 ein. Der Brückenvertrag leitet die Transaktion an L2 weiter, wo ein entsprechender Betrag an Vermögenswerten geprägt und an die vom Benutzer gewählte Adresse im optimistischen Rollup gesendet wird. + +Vom Benutzer generierte Transaktionen (wie eine L1 > L2 Einzahlung) werden normalerweise in eine Warteschlange gestellt, bis der Sequencer sie erneut an den Rollup-Vertrag übermittelt. Um jedoch die Zensurresistenz aufrechtzuerhalten, ermöglichen optimistische Rollups den Benutzern, eine Transaktion direkt an den Onchain Rollup Vertrag zu senden, wenn sie über die maximal zulässige Zeit hinaus verzögert wurde. + +Einige optimistische Rollups verfolgen einen direkteren Ansatz, um zu verhindern, dass Sequenzer Benutzer zensieren. Hier wird ein Block durch alle Transaktionen definiert, die seit dem vorherigen Block an den L1-Vertrag übermittelt wurden (z. B. Einzahlungen), zusätzlich zu den Transaktionen, die in der Rollup Kette verarbeitet wurden. Wenn ein Sequenzer eine L1-Transaktion ignoriert, veröffentlicht er den (nachweislich) falschen Statusstamm. Daher können Sequenzer benutzergenerierte Nachrichten nicht verzögern, sobald sie auf L1 gepostet wurden. + +##### Beenden des Rollups + +Aufgrund des Betrugsnachweissystems ist die Auszahlung aus einem optimistischen Rollup auf Ethereum schwieriger. Wenn ein Nutzer eine L2 > L1 Transaktion initiiert, um auf L1 hinterlegte Gelder abzuheben, muss er warten, bis die Anfechtungsfrist – die ungefähr sieben Tage dauert – abgelaufen ist. Der Auszahlungsprozess selbst ist jedoch ziemlich unkompliziert. + +Nachdem die Auszahlungsanforderung auf dem L2 Rollup initiiert wurde, wird die Transaktion in den nächsten Stapel aufgenommen, während die Vermögenswerte des Benutzers auf dem Rollup verbrannt werden. Sobald der Stapel auf Ethereum veröffentlicht ist, kann der Benutzer einen Merkle Beweis berechnen, der die Aufnahme seiner Exit-Transaktion in den Block bestätigt. Dann muss die Verzögerungszeit abgewartet werden, um die Transaktion auf L1 abzuschließen und die Gelder auf das Mainnet abzuheben. + +Um eine Woche Wartezeit vor der Abhebung von Geldern auf Ethereum zu vermeiden, können Nutzer von Optimistic Rollups einen **Liquiditätsanbieter** (LP) einsetzen. Ein Liquiditätsanbieter übernimmt das Eigentum an einer ausstehenden L2-Auszahlung und zahlt den Benutzer auf L1 aus (gegen eine Gebühr). + +Liquiditätsanbieter können die Gültigkeit der Auszahlungsanforderung des Benutzers überprüfen (indem sie die Kette selbst ausführen), bevor sie Gelder freigeben. Auf diese Weise haben sie die Gewissheit, dass die Transaktion letztendlich bestätigt wird (d. h. vertrauenslose Endgültigkeit). + +#### 2. EVM-Kompatibilität {#evm-compatibility} + +Für Entwickler liegt der Vorteil von Optimistic Rollups in ihrer Kompatibilität – oder, besser noch, Äquivalenz – mit der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/). EVM-kompatible Rollups entsprechen den Spezifikationen im [Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) und unterstützen die EVM auf Bytecode-Ebene. + +Die EVM Kompatibilität in optimistischen Rollups bietet die folgenden Vorteile: + +ich. Entwickler können vorhandene Smart Contracts auf Ethereum auf optimistische Rollup Ketten migrieren, ohne die Codebasis umfassend ändern zu müssen. Dies kann Entwicklungsteams Zeit sparen, wenn sie Ethereum Smart Contracts auf L2 bereitstellen. + +ii. Entwickler und Projektteams, die optimistische Rollups verwenden, können die Infrastruktur von Ethereum nutzen. Dazu gehören Programmiersprachen, Codebibliotheken, Testtools, Clientsoftware, Bereitstellungsinfrastruktur usw. + +Die Verwendung vorhandener Tools ist wichtig, da diese Tools im Laufe der Jahre umfassend geprüft, debuggt und verbessert wurden. Außerdem müssen Ethereum-Entwickler nicht mehr lernen, wie man mit einem völlig neuen Entwicklungs-Stack erstellt. + +#### 3. Kettenübergreifende Vertragsaufrufe {#cross-chain-contract-calls} + +Benutzer (externe Konten) interagieren mit L2-Verträgen, indem sie eine Transaktion an den Rollup Vertrag übermitteln oder dies von einem Sequenzer oder Validator für sie erledigen lassen. Optimistische Rollups ermöglichen Vertragskonten auf Ethereum außerdem die Interaktion mit L2-Verträgen mithilfe von Überbrückungsverträgen, um Nachrichten weiterzuleiten und Daten zwischen L1 und L2 zu übertragen. Das bedeutet, dass Sie einen L1 Vertrag im Ethereum Mainnet so programmieren können, dass er Funktionen aufruft, die zu Verträgen in einem optimistischen L2 Rollup gehören. + +Kreuzkette Vertragsaufrufe erfolgen asynchron, d. h. der Aufruf wird zuerst initiiert und dann zu einem späteren Zeitpunkt ausgeführt. Dies unterscheidet sich von Aufrufen zwischen den beiden Verträgen auf Ethereum, bei denen der Aufruf sofort Ergebnisse liefert. + +Ein Beispiel für einen kettenübergreifenden Vertragsaufruf ist die zuvor beschriebene Token-Einzahlung. Ein Vertrag auf L1 verwaltet die Token des Benutzers treuhänderisch und sendet eine Nachricht an einen gepaarten L2 Vertrag, um eine gleiche Anzahl von Token auf der Rollup Liste zu prägen. + +Da kettenübergreifende Nachrichtenaufrufe zur Ausführung von Verträgen führen, muss der Absender in der Regel die [Gaskosten](/developers/docs/gas/) für die Berechnung übernehmen. Es ist ratsam, ein hohes Gaslimit festzulegen, um zu verhindern, dass die Transaktion in der Zielkette fehlschlägt. Das Token Überbrückung Szenario ist ein gutes Beispiel: Wenn die L1-Seite der Transaktion (Hinterlegung der Token) funktioniert, die L2-Seite (Prägung neuer Token) jedoch aufgrund von niedrigem Gasstand ausfällt, ist die Einzahlung nicht wiederherstellbar. + +Schließlich ist zu beachten, dass L2 > L1-Nachrichtenaufrufe zwischen Verträgen Verzögerungen berücksichtigen müssen (L1 > L2-Aufrufe werden in der Regel nach einigen Minuten ausgeführt). Dies liegt daran, dass Nachrichten, die vom optimistischen Rollup an Mainnet gesendet werden, erst ausgeführt werden können, wenn das Challenge-Fenster abgelaufen ist. + +## Wie funktionieren optimistische Rollup Gebühren? {#how-do-optimistic-rollup-fees-work} + +Optimistische Rollups verwenden ein Gasgebührenschema, ähnlich wie Ethereum, um anzugeben, wie viel Benutzer pro Transaktion zahlen. Die auf Optimistic Rollups erhobenen Gebühren hängen von den folgenden Komponenten ab: + +1. **Zustandsschreiben**: Optimistic Rollups veröffentlichen Transaktionsdaten und Block-Header (bestehend aus dem vorherigen Block-Header-Hash, dem Zustands-Root und dem Batch-Root) als `Blob` oder "Binary Large Object" auf Ethereum. [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) führte eine kostengünstige Lösung für die Einbeziehung von Daten onchain ein. Ein `Blob` ist ein neues Transaktionsfeld, das es Rollups ermöglicht, komprimierte Zustandsübergangsdaten an Ethereum L1 zu senden. Im Gegensatz zu `calldata`, das permanent onchain verbleibt, sind Blobs kurzlebig und können nach [4096 Epochen](https://github.com/ethereum/consensus-specs/blob/81f3ea8322aff6b9fb15132d050f8f98b16bdba4/configs/mainnet.yaml#L147) (ungefähr 18 Tage) von den Clients entfernt werden. Durch die Verwendung von Klecks zum Posten von Batches komprimierter Transaktionen können optimistische Rollups die Kosten für das Schreiben von Transaktionen in L1 erheblich reduzieren. + +2. **Verwendetes Blob-Gas**: Blob-tragende Transaktionen verwenden einen dynamischen Gebührenmechanismus, ähnlich dem, der durch [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) eingeführt wurde. Die Gasgebühr für Typ-3-Transaktionen berücksichtigt die Grundgebühr für Klecks, die vom Netzwerk basierend auf der Klecks-Speicherplatznachfrage und der Klecks-Speicherplatznutzung der gesendeten Transaktion bestimmt wird. -Suchen Sie nach einer anfängerfreundlicheren Einführung? Siehe unsere [Einführung in Layer 2](/layer-2/). +3. **L2-Betreibergebühren**: Dies ist der Betrag, der an die Rollup-Knoten als Ausgleich für die Rechenkosten gezahlt wird, die bei der Verarbeitung von Transaktionen anfallen, ähnlich wie die Gasgebühren auf Ethereum. Rollup Knoten erheben niedrigere Transaktionsgebühren, da L2s über höhere Verarbeitungskapazitäten verfügen und nicht mit den Netzwerküberlastungen konfrontiert sind, die Validierer auf Ethereum dazu zwingen, Transaktionen mit höheren Gebühren zu priorisieren. -## Optimistische Rollups {#optimistic-rollups} +Optimistic Rollups wenden verschiedene Mechanismen zur Reduzierung der Gebühren für Nutzer an, einschließlich der Bündelung von Transaktionen und der Komprimierung von `calldata`, um die Kosten für die Datenveröffentlichung zu senken. Sie können den [L2-Gebühren-Tracker](https://l2fees.info/) für eine Echtzeit-Übersicht über die Kosten der Nutzung von Ethereum-basierten Optimistic Rollups überprüfen. -Optimistische Rollups laufen parallel zur Ethereum-Hauptkette auf Layer 2. Sie bieten Verbesserungen in der Skalierbarkeit, da sie standardmäßig keine Berechnungen durchführen. Stattdessen schlagen sie nach einer Transaktion dem Mainnet den neuen Zustand vor oder „beglaubigen" die Transaktion. +## Wie skalieren optimistische Rollups Ethereum? Skalierung von Ethereum mit Optimistic Rollups {#scaling-ethereum-with-optimistic-rollups} -Mit optimistischen Rollups werden Transaktionen als `Calldata` in die Ethereum-Hauptkette geschrieben, wodurch sie weiter optimiert werden, indem die Gaskosten reduziert werden. +Wie erläutert, veröffentlichen optimistische Rollups komprimierte Transaktionsdaten auf Ethereum, um die Datenverfügbarkeit zu gewährleisten. Die Fähigkeit, in der Kette veröffentlichte Daten zu komprimieren, ist entscheidend für die Skalierung des Durchsatzes auf Ethereum mit optimistischen Rollups. -Da die Berechnung der langsame und teure Teil der Verwendung von Ethereum ist, können optimistische Rollups die Skalierbarkeit je nach Transaktion bis zu 10-100x verbessern. Diese Zahl wird mit der Einführung von [Shard-Chains](/roadmap/danksharding) noch weiter steigen, da mehr Daten verfügbar sein werden, wenn eine Transaktion angefochten wird. +Die Haupt-Ethereum-Kette begrenzt, wie viele Datenblöcke enthalten können, ausgedrückt in Gaseinheiten (die [durchschnittliche Blockgröße](/developers/docs/blocks/#block-size) beträgt 15 Millionen Gas). Dadurch wird zwar der Gasverbrauch jeder Transaktion eingeschränkt, es bedeutet aber auch, dass wir die Anzahl der pro Block verarbeiteten Transaktionen erhöhen können, indem wir die Transaktion bezogenen Daten reduzieren – was die Skalierbarkeit direkt verbessert. -### Transaktionen bestreiten {#disputing-transactions} +Optimistische Rollups verwenden mehrere Techniken, um eine Komprimierung der Transaktionsdaten zu erreichen und die TPS Raten zu verbessern. Dieser [Artikel](https://vitalik.eth.limo/general/2021/01/05/rollup.html) vergleicht beispielsweise die Daten, die eine einfache Nutzertransaktion (Senden von Ether) auf dem Mainnet generiert, mit der Datenmenge, die dieselbe Transaktion auf einem Rollup generiert: -Optimistische Rollups berechnen die Transaktion nicht, so dass es einen Mechanismus geben muss, der sicherstellt, dass die Transaktionen rechtmäßig und nicht betrügerisch sind. Hier kommen Betrugsbeweise ins Spiel. Wenn jemand eine betrügerische Transaktion bemerkt, führt der Rollup die Berechnung eines Betrugsbeweises durch und nutzt die verfügbaren Zustandsdaten. Dies bedeutet, dass Sie möglicherweise längere Wartezeiten für die Transaktionsbestätigung haben als bei einem ZK-Rollup, da die Transaktion angefochten werden könnte. +| Parameter | Ethereum (L1) | Rollup (L2) | +| ------------ | --------------------------------------------------------- | ------------------------------------ | +| Nonce | ~3 | 0 | +| Benzinpreis | ~8 | 0-0.5 | +| Gas | 3 | 0-0.5 | +| Zu | 21 | 4 | +| Wert | 9 | ~3 | +| Unterschrift | ~68 (2 + 33 + 33) | ~0.5 | +| Aus | 0 (aus der Signatur wiederhergestellt) | 4 | +| **Gesamt** | **~112 Bytes** | **~12 Byte** | -![Das Diagramm zeigt, was passiert, wenn eine betrügerische Transaktion in einem optimistischen Rollup in Ethereum auftritt](./optimistic-rollups.png) +Durch grobe Berechnungen dieser Zahlen können die durch ein optimistisches Rollup erzielten Skalierbar keitsverbesserungen aufgezeigt werden: -Das Gas, das Sie brauchen, um die Berechnung des Betrugsnachweises durchzuführen, wird sogar erstattet. Ben Jones von Optimism beschreibt das bestehende Bonding-System: +1. Die Zielgröße für jeden Block beträgt 15 Millionen Gas und die Überprüfung eines Datenbytes kostet 16 Gas. Die Division der durchschnittlichen Blockgröße durch 16 Gas (15.000.000/16) zeigt, dass der durchschnittliche Block **937.500 Bytes an Daten** aufnehmen kann. +2. Wenn eine einfache Rollup-Transaktion 12 Bytes verwendet, kann der durchschnittliche Ethereum-Block **78.125 Rollup-Transaktionen** (937.500/12) oder **39 Rollup-Batches** verarbeiten (wenn jeder Batch durchschnittlich 2.000 Transaktionen enthält). +3. Wenn alle 15 Sekunden ein neuer Block auf Ethereum produziert wird, würde die Verarbeitungsgeschwindigkeit des Rollups ungefähr **5.208 Transaktionen pro Sekunde** betragen. Dies geschieht, indem die Anzahl der grundlegenden Rollup-Transaktionen, die ein Ethereum-Block aufnehmen kann (**78.125**), durch die durchschnittliche Blockzeit (**15 Sekunden**) geteilt wird. -"_Jeder, der eine Aktion ergreifen könnte, die Sie zur Sicherung Ihres Geldes als Betrug nachweisen müssten, muss eine Anleihe hinterlegen. Sie nehmen im Grunde etwas ETH, verriegeln es und sagen „Hey, ich verspreche die Wahrheit zu sagen"... Wenn ich nicht die Wahrheit sage und ein Betrug nachgewiesen wird, wird dieses Geld unwiederbringlich eingezogen. Nicht nur wird ein Teil dieses Geldes eingezogen, sondern ein Teil wird für das Gas bezahlen, das die Leute ausgegeben haben, die den Betrugsnachweis_ erbringen." +Dies ist eine ziemlich optimistische Schätzung, da optimistische Rollup Transaktionen unmöglich einen ganzen Block auf Ethereum umfassen können. Es kann jedoch eine ungefähre Vorstellung davon vermitteln, wie viel Skalierbar keits gewinn optimistische Rollups Ethereum-Benutzern bieten können (aktuelle Implementierungen bieten bis zu 2.000 TPS). -Sie sehen also die Anreize: Die Teilnehmer werden für die Durchführung von Betrug bestraft und für den Nachweis von Betrug entschädigt. +Die Einführung von [Data Sharding](/roadmap/danksharding/) auf Ethereum wird voraussichtlich die Skalierbarkeit von Optimistic Rollups verbessern. Da Rollup Transaktionen den Block Raum mit anderen Nicht Rollup Transaktionen teilen müssen, ist ihre Verarbeitungskapazität durch den Datendurchsatz in der Hauptkette von Ethereum begrenzt. Danksharding wird den für L2-Ketten verfügbaren Platz zur Veröffentlichung von Daten pro Block erhöhen, indem es günstigeren, nicht-permanenten "Blob"-Speicher anstelle von teurem, permanentem `CALLDATA` verwendet. -### Vor- und Nachteile {#optimistic-pros-and-cons} +### Vor- und Nachteile von Optimistic Rollups {#optimistic-rollups-pros-and-cons} -| Vorteile | Kontra | -| ------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------- | -| Alles, was Sie mit Ethereum Layer 1 tun können, ist auch mit optimistischen Rollups umsetzbar, da es mit EVM und Solidität kompatibel ist. | Lange Wartezeiten für On-Chain-Transaktionen aufgrund möglicher Betrugsprobleme. | -| Alle Transaktionsdaten werden in der Layer-1-Kette gespeichert, was bedeutet, dass sie sicher und dezentralisiert sind. | Ein Betreiber kann die Reihenfolge der Transaktionen beeinflussen. | +| Pro | Nachteile | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Bietet massive Verbesserungen der Skalierbarkeit ohne Einbußen bei Sicherheit oder Vertrauenslosigkeit. | Verzögerungen bei der Transaktionsabwicklung aufgrund potenzieller Betrugsprobleme. | +| Transaktionsdaten werden in der Layer-1-Kette gespeichert, was Transparenz, Sicherheit, Zensurresistenz und Dezentralisierung verbessert. | Zentralisierte Rollup Operatoren (Sequenzer) können die Reihenfolge der Transaktionen beeinflussen. | +| Der Betrugsnachweis garantiert eine vertrauenslose Endgültigkeit und ermöglicht es ehrlichen Minderheiten, die Kette zu sichern. | Wenn es keine ehrlichen Knoten gibt, kann ein böswilliger Betreiber Geld stehlen, indem er ungültige Blöcke und Statusverpflichtungen veröffentlicht. | +| Die Berechnung von Betrugsnachweisen steht regulären L2-Knoten offen, im Gegensatz zu Gültigkeitsnachweisen (die in ZK-Rollups verwendet werden), die spezielle Hardware erfordern. | Das Sicherheitsmodell basiert darauf, dass mindestens ein ehrlicher Knoten Rollup Transaktionen ausführt und Betrugsnachweise einreicht, um ungültige Zustandsübergänge anzufechten. | +| Rollups profitieren von vertrauens loser Lebendigkeit“ (jeder kann die Kette zum Fortschreiten zwingen, indem er Transaktionen ausführt und Behauptungen postet). | Benutzer müssen warten, bis die einwöchige Heraus forderung phase abgelaufen ist, bevor sie Gelder zurück auf Ethereum abheben können. | +| Optimistische Rollups basieren auf gut konzipierten Krypton wirtschaftlich Anreizen, um die Sicherheit in der Kette zu erhöhen. | Rollups müssen alle Transaktionsdaten in der Kette veröffentlichen, was die Kosten erhöhen kann. | +| Durch die Kompatibilität mit EVM und Solidity können Entwickler Ethereum-native Smart Contracts auf Rollups portieren oder vorhandene Tools zum Erstellen neuer Dapp verwenden. | | -### Eine visuelle Erklärung von optimistischen Rollups {#optimistic-video} +### Eine visuelle Erklärung von Optimistic Rollups {#optimistic-video} -Sehen Sie, wie Finematics optimistische Rollups erklärt: +Eher der visuelle Lernende? Sehen Sie, wie Finematics optimistische Rollups erklärt: -**Optimistische Rollups verstehen** +## Weitere Informationen zu optimistischen Rollups -- [Der Leitfaden zu Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) -- [Wie funktioniert das Rollup von Optimismus wirklich?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) +- [Wie funktionieren Optimistic Rollups (Der komplette Leitfaden)](https://www.alchemy.com/overviews/optimistic-rollups) +- [Was ist ein Blockchain Rollup? Eine technische Einführung](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) +- [Der unverzichtbare Leitfaden zu Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) +- [Der praktische Leitfaden für Ethereum Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) +- [Der Stand der Betrugsnachweise in Ethereum L2s](https://web.archive.org/web/20241124154627/https://research.2077.xyz/the-state-of-fraud-proofs-in-ethereum-l2s) +- [Wie funktioniert der Rollup von Optimism wirklich?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) - [OVM Deep Dive](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) +- [Was ist die Optimistic Virtual Machine?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/de/developers/docs/scaling/plasma/index.md b/public/content/translations/de/developers/docs/scaling/plasma/index.md index 89f0ddb0263..b511bf121c4 100644 --- a/public/content/translations/de/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/de/developers/docs/scaling/plasma/index.md @@ -6,32 +6,171 @@ incomplete: true sidebarDepth: 3 --- -Eine Plasma-Kette ist eine separate Blockchain, die in der Hauptkette von Ethereum verankert ist und Betrugsnachweise (wie [Optimistische Rollups](/developers/docs/scaling/optimistic-rollups/)) verwendet, um Streitigkeiten zu schlichten. Diese Ketten werden manchmal auch als „Kinderketten" bezeichnet, da sie im Wesentlichen kleinere Kopien des Ethereum Mainnet sind. Merkle-Bäume ermöglichen die Erstellung eines unbegrenzten Stapels dieser Ketten, welche die Bandbreite der übergeordneten Kette (einschließlich Mainnet) entlasten können. Diese erhalten ihre Sicherheit durch [Betrugsnachweise](/glossary/#fraud-proof), und jede untergeordnete Kette hat ihren eigenen Mechanismus zur Blockvalidierung. +Eine Plasma-Chain ist eine separate Blockchain, die an das Ethereum-Mainnet angebunden ist, aber Transaktionen Off-Chain mit ihrem eigenen Mechanismus zur Block-Validierung ausführt. Plasmaketten werden manchmal als "Kind"-Ketten bezeichnet, im Wesentlichen kleinere Kopien des Ethereum-Mainnets. Plasma-Chains verwenden [Betrugsbeweise](/glossary/#fraud-proof) (wie [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/)), um Streitigkeiten zu schlichten. + +Merkle-Bäume ermöglichen die Erstellung eines endlosen Stapels dieser Ketten, die dazu dienen können, Bandbreite von übergeordneten Ketten (einschließlich des Ethereum-Mainnets) zu entlasten. Allerdings leiten diese Ketten zwar einige Sicherheitsaspekte von Ethereum ab (über Betrugsbeweise), jedoch werden ihre Sicherheit und Effizienz durch mehrere Designbeschränkungen beeinflusst. ## Voraussetzungen {#prerequisites} -Sie sollten ein gutes Verständnis aller grundlegenden Themen und ein umfassendes Verständnis für [Ethereum-Skalierung](/developers/docs/scaling/) haben. Die Umsetzung von Skalierungslösungen wie Plasma ist ein fortgeschrittenes Thema, da die Technologie noch nicht so sehr erprobt ist und weiter erforscht und entwickelt wird. +Sie sollten ein gutes Verständnis aller grundlegenden Themen und ein allgemeines Verständnis der [Ethereum-Skalierung](/developers/docs/scaling/) haben. + +## Was ist Plasma? + +Plasma ist ein Framework zur Verbesserung der Skalierbarkeit in öffentlichen Blockchains wie Ethereum. Wie im ursprünglichen [Plasma-Whitepaper](http://plasma.io/plasma.pdf) beschrieben, werden Plasma-Ketten auf einer anderen Blockchain (einer sogenannten „Root-Chain“) aufgebaut. Jede "Kind-Kette" erstreckt sich von der Wurzelkette und wird in der Regel von einem Smart Contract verwaltet, der auf der übergeordneten Kette bereitgestellt wird. + +Der Plasma-Vertrag fungiert unter anderem als [kettenübergreifende Brücke](/developers/docs/bridges/), die es Benutzern ermöglicht, Vermögenswerte zwischen dem Ethereum Mainnet und der Plasma-Chain zu bewegen. Obwohl sie dadurch [Sidechains](/developers/docs/scaling/sidechains/) ähneln, profitieren Plasma-Chains – zumindest bis zu einem gewissen Grad – von der Sicherheit des Ethereum Mainnets. Dies unterscheidet sich von Sidechains, die allein für ihre Sicherheit verantwortlich sind. + +## Wie funktioniert Plasma? + +Die grundlegenden Komponenten des Plasma-Frameworks sind: + +### Off-Chain-Berechnung {#offchain-computation} + +Die aktuelle Verarbeitungsgeschwindigkeit von Ethereum ist auf etwa 15-20 Transaktionen pro Sekunde begrenzt, was die kurzfristige Möglichkeit der Skalierung zur Bewältigung von mehr Nutzern verringert. Dieses Problem besteht hauptsächlich, weil der [Konsensmechanismus](/developers/docs/consensus-mechanisms/) von Ethereum erfordert, dass viele Peer-to-Peer-Knoten jede Aktualisierung des Blockchain-Zustands überprüfen. + +Obwohl der Konsensmechanismus von Ethereum für die Sicherheit notwendig ist, ist er möglicherweise nicht für jeden Anwendungsfall geeignet. Zum Beispiel benötigt Alice möglicherweise nicht, dass ihre täglichen Zahlungen an Bob für eine Tasse Kaffee vom gesamten Ethereum-Netzwerk überprüft werden, da zwischen beiden Parteien bereits ein gewisses Vertrauen besteht. + +Plasma geht davon aus, dass das Ethereum-Mainnet nicht alle Transaktionen überprüfen muss. Stattdessen können wir Transaktionen außerhalb des Mainnets verarbeiten, wodurch die Knoten nicht jede Transaktion validieren müssen. + +Offchain-Berechnungen sind notwendig, da Plasma-Chains für Geschwindigkeit und Kosten optimiert werden können. Zum Beispiel kann eine Plasma-Chain – und tut dies in den meisten Fällen – einen einzigen "Operator" verwenden, um die Reihenfolge und Ausführung von Transaktionen zu verwalten. Da nur eine einzige Entität die Transaktionen überprüft, sind die Verarbeitungszeiten auf einer Plasma-Chain schneller als auf dem Ethereum-Mainnet. + +### Zustands-Commitments {#state-commitments} + +Während Plasma Transaktionen Off-Chain ausführt, werden sie auf der Haupt-Ethereum-Ausführungsschicht abgerechnet – andernfalls können Plasma-Chains nicht von den Sicherheitsgarantien von Ethereum profitieren. Aber das Finalisieren von Offchain-Transaktionen, ohne den Zustand der Plasma-Chain zu kennen, würde das Sicherheitsmodell untergraben und die Verbreitung ungültiger Transaktionen ermöglichen. Aus diesem Grund ist der Operator, die für die Erstellung von Blöcken auf der Plasma-Chain verantwortliche Entität, verpflichtet, in regelmäßigen Abständen "Zustandsverpflichtungen" (State Commitments) auf Ethereum zu veröffentlichen. + +Ein [Commitment-Schema](https://en.wikipedia.org/wiki/Commitment_scheme) ist eine kryptografische Technik, um sich auf einen Wert oder eine Aussage festzulegen, ohne diesen einer anderen Partei preiszugeben. Verpflichtungen sind „bindend“ in dem Sinne, dass man den Wert oder die Aussage nicht mehr ändern kann, sobald man sich darauf festgelegt hat. Zustands-Commitments in Plasma nehmen die Form von "Merkle-Wurzeln" an (abgeleitet von einem [Merkle-Baum](/whitepaper/#merkle-trees)), die der Betreiber in Intervallen an den Plasma-Vertrag auf der Ethereum-Chain sendet. + +Merkle-Wurzeln sind kryptografische Primitiven, die die Komprimierung großer Informationsmengen ermöglichen. Merkle-Wurzeln sind kryptografische Primitiven, die die Komprimierung großer Informationsmengen ermöglichen. Merkle-Wurzeln erleichtern auch die Überprüfung, ob ein kleiner Teil der Daten Teil des größeren Datensatzes ist. Ein Benutzer kann beispielsweise einen [Merkle-Beweis](/developers/tutorials/merkle-proofs-for-offline-data-integrity/#main-content) erbringen, um die Aufnahme einer Transaktion in einen bestimmten Block nachzuweisen. + +Merkle-Wurzeln sind wichtig, um Informationen über den Off-Chain-Zustand an Ethereum zu übermitteln. Man kann sich Merkle-Wurzeln als „Speicherpunkte“ vorstellen: Der Operator sagt: „Dies ist der Zustand der Plasma-Chain zum Zeitpunkt x, und dies ist die Merkle-Wurzel als Beweis.“. Der Betreiber verpflichtet sich mit einer Merkle-Root auf den _aktuellen Zustand_ der Plasma-Chain, weshalb dies als "Zustands-Commitment" bezeichnet wird. + +### Ein- und Austritte {#entries-and-exits} + +Damit Ethereum-Benutzer Plasma nutzen können, muss es einen Mechanismus geben, um Gelder zwischen dem Mainnet und Plasma-Chains zu verschieben. Wir können jedoch nicht willkürlich Ether an eine Adresse auf der Plasma-Chain senden – diese Chains sind inkompatibel, sodass die Transaktion entweder fehlschlagen oder zu verlorenen Geldern führen würde. + +Plasma verwendet einen Mastervertrag, der auf Ethereum läuft, um Benutzereinträge und -austritte zu verarbeiten. Dieser Mastervertrag ist auch dafür verantwortlich, Statuszusagen zu verfolgen (früher erklärt) und unehrliches Verhalten durch Betrugsnachweise zu bestrafen (mehr dazu später). + +#### Eintritt in die Plasma-Chain {#entering-the-plasma-chain} + +Um in die Plasma-Chain einzutreten, muss Alice (die Nutzerin) ETH oder einen beliebigen ERC-20 Token in den Plasma-Vertrag einzahlen. Der Plasma-Operator, der die Vertragseinzahlungen überwacht, stellt einen Betrag in Höhe von Alice' ursprünglicher Einzahlung wieder her und gibt ihn an ihre Adresse in der Plasma-Chain frei. Alice muss den Empfang der Gelder auf der Neben-Chain bestätigen und kann diese dann für Transaktionen verwenden. + +#### Austritt aus der Plasma-Chain {#exiting-the-plasma-chain} + +Der Austritt aus der Plasma-Chain ist aus mehreren Gründen komplizierter als der Eintritt. Der größte Grund ist, dass Ethereum zwar Informationen über den Zustand der Plasma-Chain hat, aber nicht überprüfen kann, ob die Informationen wahr sind oder nicht. Ein böswilliger Benutzer könnte eine falsche Behauptung aufstellen ("Ich habe 1000 ETH") und damit durchkommen, indem er gefälschte Nachweise vorlegt, um die Behauptung zu stützen. + +Um böswillige Abhebungen zu verhindern, wird eine "Herausforderungsperiode" eingeführt. Während der Herausforderungsperiode (normalerweise eine Woche) kann jeder einen Abhebungsantrag mithilfe eines Betrugsnachweises anfechten. Wenn die Herausforderung erfolgreich ist, wird der Abhebungsantrag abgelehnt. + +Es ist jedoch normalerweise der Fall, dass Benutzer ehrlich sind und korrekte Angaben über die von ihnen besessenen Gelder machen. In diesem Szenario wird Alice eine Abhebungsanforderung auf der Haupt-Chain (Ethereum) einleiten, indem sie eine Transaktion an den Plasma-Vertrag sendet. + +Sie muss auch einen Merkle-Nachweis erbringen, der bestätigt, dass eine Transaktion, die ihre Gelder auf der Plasma-Chain erstellt hat, in einem Block enthalten war. Dies ist für Iterationen von Plasma, wie z. B. [Plasma MVP](https://www.learnplasma.org/en/learn/mvp.html), erforderlich, die ein [Unspent Transaction Output (UTXO)](https://en.wikipedia.org/wiki/Unspent_transaction_output)-Modell verwenden. + +Andere, wie [Plasma Cash](https://www.learnplasma.org/en/learn/cash.html), stellen Gelder als [nicht-fungible Token](/developers/docs/standards/tokens/erc-721/) anstelle von UTXOs dar. In diesem Fall erfordert der Austritt den Nachweis des Eigentums an Token auf der Plasma-Chain. Dies wird durch das Einreichen der beiden letzten Transaktionen, die den Token betreffen, und durch das Vorlegen eines Merkle-Nachweises, der die Einbeziehung dieser Transaktionen in einen Block bestätigt, durchgeführt. + +Der Benutzer muss auch eine Sicherheit zur Abholanfrage als Garantie für ehrliches Verhalten hinzufügen. Wenn ein Herausforderer beweist, dass Alices Abholanfrage ungültig ist, wird ihre Sicherheit beschlagnahmt, und ein Teil davon wird als Belohnung an den Herausforderer überwiesen. + +Wenn die Challengeperiode abgelaufen ist, ohne dass jemand einen Betrugsbeweis vorgelegt hat, gilt Alices Abholanfrage als gültig. Dies ermöglicht ihr, ihre Einlagen aus dem Plasma-Vertrag auf Ethereum zurückzubekommen. + +### Streitschlichtung {#dispute-arbitration} + +Wie jede Blockchain benötigen Plasma-Chains einen Mechanismus, um die Integrität der Transaktionen zu gewährleisten, falls Teilnehmer böswillig handeln (z. B. durch doppeltes Ausgeben von Geldern). Zu diesem Zweck verwenden Plasma-Chains Betrugsbeweise, um Streitigkeiten bezüglich der Gültigkeit von Zustandsübergängen zu schlichten und schädigendes Verhalten zu bestrafen. Betrugsbeweise dienen als Mechanismus, durch den eine Plasma-Child-Chain eine Beschwerde an ihre Parent-Chain oder an die Root-Chain einreicht. + +Ein Betrugsbeweis ist einfach eine Behauptung, dass ein spezifischer Zustandsübergang ungültig ist. Ein Beispiel ist, wenn ein Benutzer (Alice) versucht, das gleiche Guthaben doppelt auszugeben. Vielleicht hat sie das UTXO in einer Transaktion mit Bob ausgegeben und möchte dasselbe UTXO (das nun Bobs ist) in einer anderen Transaktion erneut ausgeben. + +Um die Abholung zu verhindern, wird Bob einen Betrugsbeweis erstellen, indem er Beweise vorlegt, dass Alice das genannte UTXO in einer vorherigen Transaktion ausgegeben hat, sowie einen Merkle-Beweis für die Aufnahme der Transaktion in einen Block. Der gleiche Prozess funktioniert auch in Plasma Cash—Bob müsste einen Betrugsbeweis erbringen, indem er nachweist, dass Alice die Tokens, die sie zurückholen möchte, bereits zuvor an jemand anderen übertragen hat. + +Wenn Bobs Herausforderung erfolgreich ist, wird Alices Abholanfrage storniert. Allerdings beruht dieser Ansatz darauf, dass Bob die Chain nach Abholanfragen überwachen kann. Wenn Bob offline ist, kann Alice die schädliche Abholung durchführen, sobald die Challengeperiode abgelaufen ist. + +## Das Massenabwanderungsproblem in Plasma {#the-mass-exit-problem-in-plasma} + +Das Massenausstiegsproblem tritt auf, wenn eine große Anzahl von Benutzern gleichzeitig versuchen, von einer Plasma-Chain abzuheben. Der Grund für dieses Problem hängt mit einem der größten Probleme von Plasma zusammen: **Datenunverfügbarkeit**. + +Datenverfügbarkeit ist die Fähigkeit, zu überprüfen, dass die Informationen für einen vorgeschlagenen Block tatsächlich im Blockchain-Netzwerk veröffentlicht wurden. Ein Block ist "nicht verfügbar", wenn sein Ersteller zwar den Block selbst veröffentlicht, die zum Erstellen des Blocks verwendeten Daten jedoch zurückhält. + +Blocks müssen verfügbar sein, damit Knoten den Block herunterladen und die Gültigkeit von Transaktionen überprüfen können. Blockchains gewährleisten die Datenverfügbarkeit, indem sie die Blockproduzenten dazu zwingen, alle Transaktionsdaten On-Chain zu veröffentlichen. + +Die Datenverfügbarkeit hilft auch dabei, Offchain-Skalierungsprotokolle zu sichern, die auf der Basisschicht von Ethereum aufbauen. Durch die Verpflichtung der Betreiber dieser Chains, Transaktionsdaten auf Ethereum zu veröffentlichen, kann jeder ungültige Blöcke durch die Erstellung von Betrugsbeweisen anfechten, die auf den korrekten Zustand der Chain verweisen. + +Plasma-Chains speichern Transaktionsdaten hauptsächlich beim Betreiber und **veröffentlichen keine Daten auf dem Mainnet** (d.h. außer periodischen Zustands-Commitments). Dies bedeutet, dass Benutzer auf den Operator angewiesen sind, um Blockdaten bereitzustellen, falls sie Betrugsbeweise erstellen müssen, die ungültige Transaktionen anfechten. Wenn dieses System funktioniert, können Benutzer ihre Guthaben stets durch Betrugsbeweise sichern. + +Das Problem tritt auf, wenn der Operator – und nicht nur ein beliebiger Benutzer – schädigend handelt. Da der Operator die exklusive Kontrolle über die Blockchain hat, hat er einen stärkeren Anreiz, ungültige Zustandsübergänge in größerem Umfang durchzusetzen, wie zum Beispiel Guthaben der Benutzer auf der Plasma-Chain zu stehlen. + +In diesem Fall funktioniert das klassische Betrugsbeweissystem nicht. Der Operator könnte leicht eine ungültige Transaktion durchführen, die die Guthaben von Alice und Bob auf ihr eigenes Wallet überträgt, und die zur Erstellung eines Betrugsbeweises erforderlichen Daten zurückhalten. Das ist möglich, da der Operator nicht verpflichtet ist, Daten für Benutzer oder Mainnet verfügbar zu machen. + +Die optimistischste Lösung besteht darin, einen "Massenausstieg" der Benutzer aus der Plasma-Chain zu versuchen. Der Massenausstieg verlangsamt die Pläne des schädigenden Operators, Guthaben zu stehlen, und bietet ein gewisses Maß an Schutz für die Benutzer. Abholanfragen werden gemäß der Erstellungszeit jedes UTXO (oder Tokens) sortiert, was schädigende Betreiber daran hindert, ehrliche Benutzer durch Front-running zu schädigen. + +Dennoch benötigen wir eine Methode, um die Gültigkeit von Abholanfragen während eines Massenausstiegs zu überprüfen – um opportunistiche Individuen daran zu hindern, vom Chaos durch die Bearbeitung ungültiger Ausstiege zu profitieren. Die Lösung ist einfach: die Benutzer müssen den letzten **gültigen Zustand der Chain** veröffentlichen, um ihr Geld abzuheben. + +Aber dieser Ansatz hat jedoch weiterhin Probleme. Zum Beispiel, wenn alle Benutzer einer Plasma-Chain einen Austritt benötigen (was im Falle eines schädigenden Operators möglich ist), muss der gesamte gültige Zustand der Plasma-Chain auf Ethereums Basislayer auf einmal hochgeladen werden. Bei der beliebigen Größe von Plasma-Chains (hoher Durchsatz = mehr Daten) und den Beschränkungen bei den Verarbeitungsgeschwindigkeiten von Ethereum ist dies keine ideale Lösung. + +Obwohl Exit-Games in der Theorie verlockend klingen, könnten realisierte Massenausstiege vermutlich Netzwerkauslastung auf Ethereum selbst auslösen. Zusätzlich zur Beeinträchtigung der Funktionalität von Ethereum bedeutet ein ungenügend koordinierter Massenausstieg, dass Benutzer möglicherweise nicht in der Lage sind, ihr Geld abzuheben, bevor der Betreiber alle Konten auf der Plasma-Chain entleert. + +## Vor- und Nachteile von Plasma {#pros-and-cons-of-plasma} + +| Pro | Nachteile | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Bietet hohen Durchsatz und niedrige Kosten pro Transaktion. | Unterstützt keine allgemeine Berechnung (kann keine Smart Contracts ausführen). Nur grundlegende Token-Transfers, Swaps und ein paar andere Transaktionstypen werden über Prädikatslogik unterstützt. | +| Gut für Transaktionen zwischen beliebigen Benutzern (kein Overhead pro Benutzer-Paar, wenn beide auf der Plasma-Chain festgelegt sind) | Benötigt ein regelmäßiges Beobachten des Netzwerks (Lebendigkeitserfordernis) oder das Delegieren dieser Verantwortung an andere, um die Sicherheit der eingesetzten Gelder zu gewährleisten. | +| Plasma-Chains können an spezifische Use-Cases angepasst werden, die unabhängig von der Main-Chain sind. Jeder, einschließlich Unternehmen, kann Plasma-Smart-Contracts anpassen, um skalierbare Infrastruktur bereitzustellen, die in verschiedenen Kontexten funktioniert. | Verlässt sich auf einen oder mehrere Operatoren, um Daten zu speichern und abzufragen. | +| Entlastet das Ethereum-Mainnet, indem Rechenleistung und Speicher offchain verlagert werden. | Auszahlungen werden um mehrere Tage verzögert, um Herausforderungen zu ermöglichen und potenzielle Streitigkeiten zu lösen. Für fungible Vermögenswerte kann dies durch Liquiditätsanbieter gemindert werden, aber es entstehen damit verbundene Kapitalkosten. | +| | Wenn zu viele Benutzer gleichzeitig einen Austritt beantragen, könnte Ethereum Mainnet überlastet werden. | + +## Plasma vs. Layer-2-Skalierungsprotokolle {#plasma-vs-layer-2} + +Obwohl Plasma einst als nützliche Skalierungslösung für Ethereum galt, wurde es inzwischen zugunsten von [Layer-2 (L2)-Skalierungsprotokollen](/layer-2/) aufgegeben. L2-Skalierungsprotokolle beheben mehrere Probleme von Plasma: + +### Effizienz {#efficiency} + +[Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups/) erzeugen kryptografische Beweise für die Gültigkeit jedes Transaktionsstapels, der off-chain verarbeitet wird. Dies verhindert, dass Benutzer (und Betreiber) ungültige Zustandsübergänge vorantreiben, was die Notwendigkeit von Challengeperioden und Exit-Games beseitigt. Damit müssen Benutzer ihre Guthaben nicht mehr regelmäßig über die Chain überwachen, um sie zu schützen. + +### Unterstützung für Smart Contracts {#support-for-smart-contracts} + +Ein weiteres Problem mit dem Plasma-Framework war [die Unfähigkeit, die Ausführung von Ethereum Smart Contracts zu unterstützen](https://ethresear.ch/t/why-smart-contracts-are-not-feasible-on-plasma/2598/4). Daher wurden die meisten Plasma-Implementierungen hauptsächlich für einfache Zahlungen oder den Austausch von ERC-20-Tokens entwickelt. + +Im Gegensatz dazu sind Optimistic Rollups mit der [Ethereum Virtual Machine](/developers/docs/evm/) kompatibel und können native Ethereum-[Smart Contracts](/developers/docs/smart-contracts/) ausführen, was sie zu einer nützlichen und _sicheren_ Lösung für die Skalierung [dezentralisierter Anwendungen](/developers/docs/dapps/) macht. In ähnlicher Weise gibt es Pläne, eine [Zero-Knowledge-Implementierung der EVM (zkEVM) zu erstellen](https://ethresear.ch/t/a-zk-evm-specification/11549), die es ZK-Rollups ermöglichen würde, beliebige Logik zu verarbeiten und Smart Contracts auszuführen. + +### Datenunverfügbarkeit {#data-unavailability} + +Wie bereits erläutert, leidet Plasma unter einem Datenverfügbarkeitsproblem. Wenn ein schädigender Operator einen ungültigen Zustandsübergang in der Plasma-Chain vorantreibt, könnten Benutzer ihn nicht anfechten, da der Operator die zum Erstellen eines Betrugsbeweises benötigten Daten zurückhalten kann. Rollups lösen dieses Problem, indem sie Betreiber verpflichten, Transaktionsdaten auf Ethereum zu veröffentlichen. Dies ermöglicht es jedem, den Zustand der Chain zu überprüfen und gegebenenfalls Betrugsbeweise zu erstellen. + +### Massenabwanderungsproblem {#mass-exit-problem} + +ZK-Rollups und Optimistische Rollups lösen das Massenausstiegsproblem von Plasma auf verschiedene Weise. Ein ZK-Rollup verlässt sich auf kryptografische Mechanismen, die gewährleisten, dass Betreiber keine Guthaben von Nutzern stehlen können, unabhängig vom Szenario. + +Optimistische Rollups legen eine Verzögerungsperiode für Abhebungen fest, in der jeder eine Herausforderung einleiten und schädliche Abhebeanträge verhindern kann. Obwohl dies ähnlich wie Plasma ist, besteht der Unterschied jedoch darin, dass Verifizierer auf die benötigten Daten zum Erstellen von Betrugsbeweisen zugreifen können. Daher besteht für Benutzer von Rollups kein Grund, eine panische "Erstausstiegs"-Migration nach Ethereum Mainnet zu starten. + +## Wie unterscheidet sich Plasma von Sidechains und Sharding? {#plasma-sidechains-sharding} + +Plasma, Sidechains und Sharding sind ziemlich ähnlich, da sie alle auf unterschiedliche Weise mit Ethereum Mainnet verbunden sind. Allerdings variieren die Stufe und Stärke dieser Verbindungen, was die Sicherheitsmerkmale jeder Skalierungslösung beeinflusst. + +### Plasma vs. Sidechains {#plasma-vs-sidechains} + +Eine [Sidechain](/developers/docs/scaling/sidechains/) ist eine unabhängig betriebene Blockchain, die über eine bidirektionale kettenübergreifende Brücke mit dem Ethereum Mainnet verbunden ist. [Kettenübergreifende Brücken](/bridges/) ermöglichen es Benutzern, Token zwischen den beiden Blockchains auszutauschen, um Transaktionen auf der Sidechain durchzuführen. Dies reduziert die Überlastung des Ethereum Mainnets und verbessert die Skalierbarkeit. +Sidechains verwenden einen eigenen Konsensmechanismus und sind im Allgemeinen deutlich kleiner als Ethereum Mainnet. Als Ergebnis birgt das Übertragen von Assets über Bridges auf diese Ketten ein erhöhtes Risiko; da die Sicherheitsgarantien von Ethereum Mainnet im Sidechain-Modell nicht übernommen werden, riskieren Benutzer bei einem Angriff auf die Sidechain den Verlust ihrer Guthaben. + +Im Gegensatz dazu leiten Plasma-Chains ihre Sicherheit von Mainnet ab. Dies macht sie messbar sicherer als Sidechains. Sowohl Sidechains als auch Plasma-Chains können unterschiedliche Konsensprotokolle haben, aber der Unterschied besteht darin, dass Plasma-Chains die Merkle-Wurzel jedes Blocks auf Ethereum Mainnet veröffentlichen. Merkle-Wurzeln sind kleine Datenstücke, die wir verwenden können, um Informationen über Transaktionen zu überprüfen, die auf einer Plasma-Chain durchgeführt werden. Falls auf einer Plasma-Chain ein Angriff geschieht, können Benutzer ihr Guthaben sicher zurück auf Mainnet abheben, indem sie die entsprechenden Beweise verwenden. + +### Plasma vs. Sharding {#plasma-vs-sharding} + +Sowohl Plasma-Chains als auch Shard-Chains veröffentlichen periodisch kryptografische Beweise auf Ethereum Mainnet. Beide haben jedoch unterschiedliche Sicherheitseigenschaften. + +Shard-Chains senden "Kollationsköpfe" an das Mainnet, die detaillierte Informationen über jeden Datenshard enthalten. Nodes im Mainnet überprüfen und erzwingen die Gültigkeit der Datenshards, wodurch die Möglichkeit ungültiger Shard-Übergänge reduziert und das Netzwerk vor bösartigen Aktivitäten geschützt wird. -## Vor- und Nachteile {#pros-and-cons} +Plasma unterscheidet sich, da das Mainnet nur minimale Informationen über den Zustand der Child-Chains erhält. Das bedeutet, dass das Mainnet Transaktionen, die auf Child-Chains durchgeführt werden, nicht effektiv überprüfen kann, was diese weniger sicher macht. -| Vorteile | Kontra | -| --------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Hoher Durchsatz, niedrige Kosten pro Transaktion. | Unterstützt keine allgemeine Berechnung. Nur grundlegende Token-Transfers, Swaps und ein paar andere Transaktionstypen werden über Prädikatslogik unterstützt. | -| Gut für Transaktionen zwischen beliebigen Benutzern (kein Overhead pro Benutzer-Paar, wenn beide auf der Plasma-Kette festgelegt sind). | Benötigt ein regelmäßiges Beobachten des Netzwerks (Lebendigkeitserfordernis) oder das Delegieren dieser Verantwortung an andere, um die Sicherheit der eingesetzten Gelder zu gewährleisten. | -| | Verlässt sich auf einen oder mehrere Operatoren, um Daten zu speichern und abzufragen. | -| | Auszahlungen werden um mehrere Tage verzögert, um Herausforderungen zu ermöglichen und potenzielle Streitigkeiten zu lösen. Für fungible Vermögenswerte kann dies durch Liquiditätsanbieter gemildert werden, aber es entstehen damit entsprechende zusätzliche Kosten. | +**Hinweis**: Das Sharding der Ethereum-Blockchain steht nicht mehr auf dem Fahrplan. Es wurde durch die Skalierung über Rollups und [Danksharding](/roadmap/danksharding) ersetzt. ### Plasma verwenden {#use-plasma} Mehrere Projekte bieten Implementierungen von Plasma an, die Sie in Ihre dApps integrieren können: -- [OMG-Netzwerk](https://omg.network/) -- [Polygon](https://polygon.technology/) (vorher Matic Network) -- [Gluon](https://gluon.network/) -- [LeapDAO](https://ipfs.leapdao.org/) +- [Polygon](https://polygon.technology/) (früher Matic Network) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Lernen Sie Plasma](https://www.learnplasma.org/en/) +- [Mehr über Plasma erfahren](https://www.learnplasma.org/en/) +- [Eine kurze Erinnerung daran, was "geteilte Sicherheit" bedeutet und warum sie so wichtig ist](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) +- [Sidechains vs. Plasma vs. Sharding](https://vitalik.eth.limo/general/2019/06/12/plasma_vs_sharding.html) +- [Plasma verstehen, Teil 1: Die Grundlagen](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics) +- [Aufstieg und Fall von Plasma](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/scaling/sidechains/index.md b/public/content/translations/de/developers/docs/scaling/sidechains/index.md index b898566010c..200cc6c3770 100644 --- a/public/content/translations/de/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/de/developers/docs/scaling/sidechains/index.md @@ -1,26 +1,60 @@ --- -title: Sidechains +title: Seitenketten description: Eine Einführung in Sidechains als Skalierungslösung, die derzeit von der Ethereum-Community genutzt wird. lang: de -incomplete: true sidebarDepth: 3 --- -Eine Sidechain ist eine separate Blockchain, die parallel zum Ethereum Mainnet läuft und unabhängig arbeitet. Sie hat seinen eigenen [Konsens-Algorithmus](/developers/docs/consensus-mechanisms/) (z.B. [Proof-of-Authority](https://wikipedia.org/wiki/Proof_of_authority), [Delegierter Proof-of-Stake](https://en.bitcoinwiki.org/wiki/DPoS), [Byzantinische Fehlertoleranz](https://decrypt.co/resources/byzantine-fault-tolerance-what-is-it-explained)). Sie ist über eine zweiseitige Brücke mit dem Mainnet verbunden. +Eine Sidechain ist eine separate Blockchain, die unabhängig von Ethereum läuft und durch eine Zwei-Wege-Brücke mit Ethereum Mainnet verbunden ist. Sidechains können separate Blockparameter und [Konsensalgorithmen](/developers/docs/consensus-mechanisms/) haben, die oft für die effiziente Verarbeitung von Transaktionen ausgelegt sind. Die Nutzung einer Sidechain bringt jedoch Kompromisse mit sich, da sie nicht die Sicherheitseigenschaften von Ethereum erben. Anders als [Layer-2-Skalierungslösungen](/layer-2/) übertragen Sidechains keine Zustandsänderungen und Transaktionsdaten zurück an das Ethereum-Mainnet. -Was eine Sidechain besonders spannend macht, ist die Tatsache, dass die Kette genauso funktioniert wie die Hauptkette von Ethereum, da sie auf [dem EVM](/developers/docs/evm/) basiert. Sie nutzt nicht Ethereum, sie ist Ethereum. Das bedeutet, wenn Sie Ihre [dApp](/developers/docs/dapps/) auf einer Sidechain verwenden wollen, müssen Sie nur Ihren Code auf dieser Sidechain bereitstellen. Sie sieht aus, fühlt sich an und verhält sich wie Mainnet - Sie schreiben Verträge in Solidity und interagieren mit der Kette über die Web3 API. +Sidechains opfern auch ein gewisses Maß an Dezentralisierung oder Sicherheit, um einen hohen Durchsatz zu erreichen ([Skalierbarkeitstrilemma](https://vitalik.eth.limo/general/2021/05/23/scaling.html)). Ethereum setzt sich jedoch für eine Skalierung ein, ohne Kompromisse bei Dezentralisierung und Sicherheit einzugehen. -## Voraussetzungen {#prerequisites} +## Wie funktionieren Sidechains? {#how-do-sidechains-work} -Sie sollten ein gutes Grundwissen über alle grundlegenden Themen und ein umfassendes Verständnis der [Ethereum-Skalierung](/developers/docs/scaling/) haben. +Sidechains sind unabhängige Blockchains mit unterschiedlichen Historien, Entwicklungs-Roadmaps und Designüberlegungen. Während eine Sidechain oberflächliche Ähnlichkeiten mit Ethereum aufweisen kann, hat sie mehrere besondere Merkmale. -## Vor- und Nachteile {#pros-and-cons} +### Konsensalgorithmen {#consensus-algorithms} -| Vorteile | Kontra | -| ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- | -| Technologie ist etabliert. | Weniger dezentralisiert. | -| Unterstützt allgemeine Berechnung, ist EVM-Kompatibel. | Verwendet einen separaten Konsensmechanismus. Nicht durch Layer 1 gesichert (technisch gesehen ist es also nicht Layer 2). | -| | Ein Quorum von Sidechain Validatoren kann Betrug begehen. | +Eines der Merkmale, die Sidechains einzigartig machen (d. h. anders als Ethereum), ist der verwendete Konsensalgorithmus. Sidechains verlassen sich nicht auf Ethereum für den Konsens und können alternative Konsensprotokolle wählen, die ihren Bedürfnissen entsprechen. Einige Beispiele für Konsensalgorithmen, die auf Sidechains verwendet werden, sind: + +- [Proof-of-Authority](/developers/docs/consensus-mechanisms/poa/) +- [Delegierter Proof-of-Stake](https://en.bitcoin.it/wiki/Delegated_proof_of_stake) +- [Byzantinische Fehlertoleranz](https://decrypt.co/resources/byzantine-fault-tolerance-what-is-it-explained). + +Wie Ethereum haben auch Sidechains validierende Nodes, die Transaktionen verifizieren und verarbeiten, Blöcke produzieren und den Blockchain-Zustand speichern. Validatoren sind auch dafür verantwortlich, den Konsens im Netzwerk aufrechtzuerhalten und es vor böswilligen Angriffen zu schützen. + +#### Block-Parameter {#block-parameters} + +Ethereum setzt Grenzen für [Blockzeiten](/developers/docs/blocks/#block-time) (d. h. die Zeit, die für die Erzeugung neuer Blöcke benötigt wird) und [Blockgrößen](/developers/docs/blocks/#block-size) (d. h. die in einem Block enthaltene Datenmenge, die in Gas angegeben wird). Umgekehrt verwenden Sidechains oft andere Parameter, wie z. B. schnellere Blockzeiten und höhere Gaslimits, um einen hohen Durchsatz, schnelle Transaktionen und niedrige Gebühren zu erreichen. + +Während dies einige Vorteile hat, hat es kritische Auswirkungen auf die Netzwerkdezentralisierung und Sicherheit. Blockparameter, wie schnelle Blockzeiten und große Blockgrößen, erhöhen die Schwierigkeit, einen vollständigen Node zu betreiben – wodurch einige wenige "Supernodes" für die Sicherung der Chain verantwortlich sind. In einem solchen Szenario steigt die Möglichkeit von Validator-Absprachen oder einer böswilligen Übernahme der Chain. + +Damit Blockchains skalieren können, ohne die Dezentralisierung zu beeinträchtigen, muss der Betrieb eines Nodes für jeden offen sein – nicht unbedingt für Parteien mit spezialisierter Hardware. Deshalb wird daran gearbeitet, sicherzustellen, dass jeder im Ethereum-Netzwerk [einen Full-Node betreiben](/developers/docs/nodes-and-clients/#why-should-i-run-an-ethereum-node) kann. + +### EVM-Kompatibilität {#evm-compatibility} + +Einige Sidechains sind EVM-kompatibel und können Verträge ausführen, die für die [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) entwickelt wurden. EVM-kompatible Sidechains unterstützen Smart Contracts, [die in Solidity geschrieben wurden](/developers/docs/smart-contracts/languages/), sowie andere EVM-Smart-Contract-Sprachen. Das bedeutet, dass für das Ethereum-Mainnet geschriebene Smart Contracts auch auf EVM-kompatiblen Sidechains funktionieren. + +Das bedeutet, wenn Sie Ihre [Dapp](/developers/docs/dapps/) auf einer Sidechain verwenden möchten, müssen Sie lediglich Ihren [Smart Contract](/developers/docs/smart-contracts/) auf dieser Sidechain bereitstellen. Es sieht aus, fühlt sich an und verhält sich genau wie Mainnet – Sie schreiben Verträge in Solidity und interagieren mit der Chain über die Sidechain-RPC. + +Da Sidechains EVM-kompatibel sind, gelten sie als nützliche [Skalierungslösung](/developers/docs/scaling/) für Ethereum-native Dapps. Mit Ihrer Dapp auf einer Sidechain können Nutzer niedrigere Gasgebühren und schnellere Transaktionen genießen, besonders wenn Mainnet überlastet ist. + +Jedoch bringt die Verwendung einer Sidechain, wie bereits erläutert, erhebliche Nachteile mit sich. Jede Sidechain ist für ihre eigene Sicherheit verantwortlich und erbt nicht die Sicherheitseigenschaften von Ethereum. Dies erhöht die Möglichkeit bösartigen Verhaltens, was Ihre Nutzer beeinträchtigen oder ihre Gelder gefährden kann. + +### Asset-Bewegung {#asset-movement} + +Damit eine separate Blockchain zu einer Sidechain des Ethereum Mainnets werden kann, braucht sie die Fähigkeit, den Transfer von Vermögenswerten vom und zum Ethereum Mainnet zu ermöglichen. Diese Interoperabilität mit Ethereum wird durch eine Blockchain-Brücke erreicht. [Kettenübergreifende Brücken](/bridges/) verwenden Smart Contracts, die auf dem Ethereum-Mainnet und einer Sidechain bereitgestellt werden, um das Bridging von Geldern zwischen ihnen zu steuern. + +Während Brücken Nutzern helfen, Gelder zwischen Ethereum und der Sidechain zu bewegen, werden die Vermögenswerte nicht physisch über die beiden Ketten bewegt. Stattdessen werden Mechanismen, die typischerweise Minting und Burning beinhalten, für die Wertübertragung zwischen Ketten verwendet. Mehr darüber, [wie kettenübergreifende Brücken funktionieren](/developers/docs/bridges/#how-do-bridges-work). + +## Vor- und Nachteile von Sidechains {#pros-and-cons-of-sidechains} + +| Pro | Nachteile | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Die Technologie, die Sidechains untermauert, ist bewährt und profitiert von umfangreicher Forschung und Designverbesserungen. | Sidechains tauschen ein gewisses Maß an Dezentralisierung und Vertrauenslosigkeit gegen Skalierbarkeit ein. | +| Sidechains unterstützen allgemeine Berechnungen und bieten EVM-Kompatibilität (sie können Ethereum-eigene DApps ausführen). | Eine Sidechain nutzt einen separaten Konsensmechanismus und profitiert nicht von Ethereums Sicherheitsgarantien. | +| Sidechains verwenden verschiedene Konsensmodelle, um Transaktionen effizient zu verarbeiten und Transaktionsgebühren für Nutzer zu senken. | idechains erfordern höhere Vertrauensvoraussetzungen (z.B. kann ein Quorum bösartiger Sidechain-Validatoren Betrug begehen). | +| EVM-kompatible Sidechains ermöglichen es DApps, ihr Ökosystem zu erweitern. | | ### Sidechains verwenden {#use-sidechains} @@ -28,10 +62,12 @@ Mehrere Projekte bieten Implementierungen von Sidechains, die Sie in Ihre dApps - [Polygon PoS](https://polygon.technology/solutions/polygon-pos) - [Skale](https://skale.network/) -- [Gnosis-Chain (ehemals xDai)](https://www.gnosis.io/) +- [Gnosis Chain (ehemals xDai)](https://www.gnosischain.com/) +- [Loom Network](https://loomx.io/) +- [Metis Andromeda](https://www.metis.io/) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Skalieren von Ethereum dApps durch Sidechains](https://medium.com/loom-network/dappchains-scaling-ethereum-dapps-through-sidechains-f99e51fff447) _Feb 8, 2018 - Georgios Konstantopoulos_ +- [Skalierung von Ethereum-Dapps durch Sidechains](https://medium.com/loom-network/dappchains-scaling-ethereum-dapps-through-sidechains-f99e51fff447) _8. Feb. 2018 – Georgios Konstantopoulos_ -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/scaling/state-channels/index.md b/public/content/translations/de/developers/docs/scaling/state-channels/index.md index 87b45bb26d7..d9760f369da 100644 --- a/public/content/translations/de/developers/docs/scaling/state-channels/index.md +++ b/public/content/translations/de/developers/docs/scaling/state-channels/index.md @@ -2,71 +2,260 @@ title: Zustandskanäle description: Eine Einführung in Zustandskanäle und Zahlungskanäle als Skalierungslösung, die derzeit von der Ethereum-Community genutzt wird. lang: de -incomplete: true sidebarDepth: 3 --- -Zustandskanäle ermöglichen es den Teilnehmern, `x` Transaktionen außerhalb der Kette durchzuführen, während nur zwei Transaktionen auf der Kette an das Ethereum-Netzwerk übermittelt werden. Dies ermöglicht einen extrem hohen Transaktionsdurchsatz. +State Channels ermöglichen es Teilnehmenden, sicher außerhalb der Blockchain (offchain) zu transaktieren, während die Interaktion mit dem Ethereum-Mainnet auf ein Minimum reduziert bleibt. Die Peers eines Channels können eine beliebige Anzahl von Offchain-Transaktionen durchführen, wobei lediglich zwei Onchain-Transaktionen erforderlich sind – zum Öffnen und Schließen des Channels. Dadurch wird eine äußerst hohe Transaktionsdurchsatzrate erreicht und die Kosten für Nutzer:innen gesenkt. ## Voraussetzungen {#prerequisites} -Sie sollten ein gutes Verständnis aller grundlegenden Themen und ein umfassendes Verständnis für [Ethereum-Skalierung](/developers/docs/scaling/) haben. Die Implementierung von Skalierungslösungen wie Kanäle ist ein fortgeschrittenes Thema, da die Technologie weniger erprobt ist und weiter erforscht und entwickelt wird. +Sie sollten unsere Seiten zu [Skalierungslösungen für Ethereum](/developers/docs/scaling/) und [Layer 2](/layer-2/) gelesen und verstanden haben. -## Kanäle {#channels} +## Was sind Channels? {#what-are-channels} -Die Teilnehmer müssen einen Teil von Ethereums Zustand wie eine ETH-Einlage in einen Multisig-Vertrag einschließen. Ein Multisig-Vertrag ist eine Art von Vertrag, der die Unterschriften (und damit die Vereinbarung) mehrerer privater Schlüssel zum Ausführen erfordert. +Öffentliche Blockchains wie Ethereum stoßen aufgrund ihrer dezentralen Architektur an Skalierungsgrenzen: Onchain-Transaktionen müssen von allen Knoten ausgeführt werden. Um die Dezentralisierung des Netzwerks zu bewahren, müssen Knoten in der Lage sein, das Transaktionsvolumen eines Blocks auch mit bescheidener Hardware zu verarbeiten. Dies begrenzt den maximalen Transaktionsdurchsatz. Blockchain-Channels lösen dieses Problem, indem sie Nutzer:innen ermöglichen, außerhalb der Hauptkette zu interagieren, dabei aber weiterhin die Sicherheit der Mainchain für die finale Abrechnung nutzen. -Das Sperren des Zustands ist die erste Transaktion und öffnet den Channel. Die Teilnehmer können dann schnell und frei off-chain handeln. Wenn die Interaktion beendet ist, wird eine letzte On-Chain-Transaktion abgeschickt, die den Zustand entsperrt. +Channels sind einfache Peer-to-Peer-Protokolle, die es zwei Parteien erlauben, zahlreiche Transaktionen untereinander durchzuführen und lediglich das Endergebnis in die Blockchain einzutragen. Mithilfe kryptografischer Verfahren wird nachgewiesen, dass die zusammengefassten Daten tatsächlich das Ergebnis einer gültigen Sequenz von Zwischentransaktionen sind. Ein Smart Contract vom Typ ["Multisignatur" (Multisig)](/developers/docs/smart-contracts/#multisig) stellt sicher, dass die Transaktionen von den berechtigten Parteien signiert wurden. -**Nützlich für**: +Bei Channels werden Zustandsänderungen von den beteiligten Parteien selbst ausgeführt und validiert, wodurch die Rechenlast auf der Ausführungsebene von Ethereum minimiert wird. Dies verringert die Netzwerkbelastung auf Ethereum und beschleunigt gleichzeitig die Transaktionsverarbeitung für Nutzer:innen. -- viele Status-Updates -- wenn die Teilnehmerzahl im Voraus bekannt ist -- wenn Teilnehmer immer verfügbar sind +Jeder Channel wird durch einen [Multisignatur-Smart-Contract (Multisig)](/developers/docs/smart-contracts/#multisig) verwaltet, der auf Ethereum ausgeführt wird. Um einen Channel zu eröffnen, stellen die Teilnehmenden den Channel-Contract onchain bereit und zahlen Guthaben in diesen ein. Anschließend signieren beide Parteien gemeinsam eine Zustandsaktualisierung, um den Anfangszustand des Channels festzulegen; danach können sie schnell und ohne Einschränkungen offchain transaktieren. -Zurzeit gibt es zwei Arten von Kanälen: Zustandskanäle und Zahlungskanäle. +Zum Schließen des Channels reichen die Teilnehmenden den zuletzt vereinbarten Zustand des Channels onchain ein. Danach verteilt der Smart Contract die eingesperrten Mittel entsprechend der jeweiligen Guthabenstände im endgültigen Zustand des Channels. -## Zustandskanäle {#state-channels} +Peer-to-Peer-Channels eignen sich besonders gut für Szenarien, in denen eine festgelegte Gruppe von Teilnehmenden häufig miteinander transaktieren möchte, ohne dabei sichtbare Overhead-Kosten zu verursachen. Blockchain-Channels lassen sich in zwei Kategorien einteilen: **Payment Channels** (Zahlungs-Channels) und **State Channels** (Zustands-Channels). -Der Zustandskanal lässt sich vielleicht am besten anhand eines Beispiels erklären, z. B. einem Tic-Tac-Toe-Spiel: +## Zahlungs-Channels {#payment-channels} -1. Erstellen Sie einen Multisig-Smart-Contract „Judge" auf der Ethereum-Main-Chain, der die Regeln von Tic-Tac-Toe versteht und Alice und Bob als die beiden Spieler in unserem Spiel identifizieren kann. In diesem Vertrag ist der Preis von 1ETH enthalten. +Ein Zahlungs-Channel lässt sich am besten als ein „zweiseitiges Kassenbuch“ beschreiben, das gemeinsam von zwei Nutzer:innen geführt wird. Der Anfangssaldo dieses Kassenbuchs entspricht der Summe der Einlagen, die beim Öffnen des Channels in den Onchain-Contract eingesperrt wurden. Überweisungen innerhalb eines Zahlungs-Channels können augenblicklich erfolgen und benötigen – abgesehen von einer einmaligen Onchain-Transaktion zur Eröffnung sowie einer abschließenden Transaktion zum Schließen des Channels – keine direkte Interaktion mit der eigentlichen Blockchain. -2. Dann beginnen Alice und Bob mit dem Spiel und öffnen den Zustandskanal. Jede Bewegung erzeugt eine Off-Chain-Transaktion mit einem „Nonce“, was einfach bedeutet, dass wir später immer sagen können, in welcher Reihenfolge die Schritte passierten. +Aktualisierungen des Kassenbuchsaldos (d. h. des Zustands des Zahlungs-Channels) bedürfen der Zustimmung aller am Channel beteiligten Parteien. Eine Channel-Aktualisierung, die von allen Teilnehmenden signiert wurde, gilt als final – vergleichbar mit einer Transaktion auf Ethereum. -3. Wenn es einen Gewinner gibt, schließen sie den Channel, indem sie den endgültigen Status (Eine Liste der Transaktionen) an den Richter-Smart-Contract übermitteln und hierfür nur einmal die Transaktionsgebühr zahlen müssen. Der Richter stellt sicher, dass dieser „endgültige Zustand“ von beiden Parteien unterzeichnet wird und wartet einige Zeit, um sicherzustellen, dass niemand das Ergebnis rechtmäßig herausfordern kann, um dann den 1ETH Award an die Gewinnerin Alice auszuzahlen. +Zahlungs-Channels zählten zu den frühesten Skalierungslösungen und wurden entwickelt, um teure Onchain-Aktivitäten bei einfachen Nutzerinteraktionen (z. B. ETH-Überweisungen, atomare Swaps, Mikrozahlungen) auf ein Minimum zu reduzieren. Die Teilnehmenden eines Channels können beliebig viele sofortige und gebührenfreie Transaktionen untereinander durchführen, solange die Bilanz ihrer gegenseitigen Überweisungen den Betrag der eingezahlten Tokens nicht überschreitet. -## Zahlungskanäle {#payment-channels} +## Zustands-Channels {#state-channels} -Vereinfachte Zustandskanäle, die sich nur mit Zahlungen befassen (z. B. ETH-Überweisungen). Sie erlauben Off-Chain-Transfers zwischen zwei Teilnehmern, solange die Nettosumme ihrer Transfers die hinterlegten Token nicht überschreitet. +Abgesehen von der Unterstützung von Offchain-Zahlungen haben sich Zahlungs-Channels für die Verarbeitung allgemeiner Zustandsübergangslogik als ungeeignet erwiesen. Zustands-Channels (State Channels) wurden entwickelt, um dieses Problem zu lösen und Channels für die Skalierung allgemeiner Berechnungen nutzbar zu machen. -## Vor- und Nachteile {#channels-pros-and-cons} +Zustands-Channels weisen nach wie vor viele Gemeinsamkeiten mit Zahlungs-Channels auf. Zum Beispiel interagieren Nutzer:innen durch den Austausch kryptografisch signierter Nachrichten (Transaktionen), die auch von den übrigen Channel-Teilnehmenden signiert werden müssen. Wird eine vorgeschlagene Zustandsaktualisierung nicht von allen Teilnehmenden signiert, gilt sie als ungültig. -| Vorteile | Kontra | -| --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Sofortige Abhebung/Abrechnung in Mainnet (wenn beide Parteien eines Kanals kooperieren) | Zeit und Kosten für die Einrichtung und Abwicklung eines Kanals - nicht gut geeignet für gelegentliche einmalige Transaktionen zwischen beliebigen Benutzern. | -| Es ist ein extrem hoher Transaktions-Durchsatz möglich | Benötigt ein regelmäßiges Beobachten des Netzwerks (Lebendigkeitserfordernis) oder das Delegieren dieser Verantwortung an andere, um die Sicherheit der eingesetzten Gelder zu gewährleisten. | -| Niedrigste Kosten pro Transaktion - gut für laufende Mikrozahlungen | Guthaben werden zur vorübergehenden Einlagerung in offenen Zahlungskanälen benötigt | -| | Eine offene Teilnahme wird nicht unterstützt. | +Im Unterschied zu Zahlungs-Channels verwaltet ein Zustands-Channel jedoch nicht nur die Guthaben der Nutzer:innen, sondern führt zudem den aktuellen Zustand des Contract-Speichers (d. h. die Werte der Contract-Variablen) fortlaufend mit. -## Zustandskanal verwenden {#use-state-channels} +Dadurch wird es möglich, einen Smart Contract außerhalb der Blockchain (offchain) zwischen zwei Nutzer:innen auszuführen. In diesem Szenario bedürfen Aktualisierungen des internen Zustands des Smart Contracts lediglich der Zustimmung derjenigen Peers, die den Channel eingerichtet haben. + +Obwohl dies das zuvor beschriebene Skalierbarkeitsproblem löst, hat es Auswirkungen auf die Sicherheit. Auf Ethereum wird die Gültigkeit von Zustandsübergängen durch das Konsensprotokoll des Netzwerks sichergestellt. Dadurch ist es unmöglich, ungültige Zustandsaktualisierungen für einen Smart Contract vorzuschlagen oder dessen Ausführung zu manipulieren. + +Zustands-Channels bieten nicht dieselben Sicherheitsgarantien. Ein Zustands-Channel stellt gewissermaßen eine Miniaturversion des Mainnets dar. Da nur eine begrenzte Anzahl von Teilnehmenden die Regeln durchsetzt, steigt die Wahrscheinlichkeit böswilligen Verhaltens (z. B. das Vorschlagen ungültiger Zustandsaktualisierungen). Die Sicherheit von Zustands-Channels beruht auf einem Streitschlichtungssystem, das auf [Betrugsnachweisen](/glossary/#fraud-proof) basiert. + +## Wie Zustands-Channels funktionieren {#how-state-channels-work} + +Im Grunde ist die Aktivität in einem Zustands-Channel eine Sitzung von Interaktionen zwischen Benutzern und einem Blockchain-System. Nutzer:innen kommunizieren überwiegend außerhalb der Blockchain (offchain) miteinander und interagieren mit der zugrundeliegenden Blockchain lediglich zum Öffnen oder Schließen des Channels sowie zur Beilegung allfälliger Streitigkeiten zwischen den Teilnehmenden. + +Der folgende Abschnitt beschreibt den grundlegenden Arbeitsablauf eines Zustands-Channels: + +### Öffnen des Channels {#opening-the-channel} + +Das Öffnen eines Channels erfordert, dass die Teilnehmer Mittel in einen Smart Contract im Mainnet einbringen. Die Einlage fungiert auch als virtueller Deckel, so dass die teilnehmenden Akteure frei Transaktionen durchführen können, ohne Zahlungen sofort abwickeln zu müssen. Erst wenn der Channel onchain finalisiert ist, rechnen die Parteien untereinander ab und heben den Rest ihres Deckels ab. + +Diese Einlage dient auch als Sicherheit, um ehrliches Verhalten von jedem Teilnehmer zu garantieren. Wenn Einleger während der Streitbeilegungsphase bösartiger Handlungen für schuldig befunden werden, wird ihre Einlage durch den Vertrag gekürzt (Slashing). + +Die Channel-Peers müssen einen Anfangszustand unterzeichnen, dem sie alle zustimmen. Dies dient als Genesis des Zustands-Channels, nach der die Benutzer mit Transaktionen beginnen können. + +### Nutzung des Channels {#using-the-channel} + +Nach der Initialisierung des Zustands des Channels interagieren die Peers, indem sie Transaktionen unterzeichnen und sie sich zur Genehmigung gegenseitig zusenden. Die Teilnehmer initiieren mit diesen Transaktionen Zustandsaktualisierungen und unterzeichnen Zustandsaktualisierungen von anderen. Jede Transaktion umfasst Folgendes: + +- Eine **Nonce**, die als eindeutige ID für Transaktionen dient und Replay-Angriffe verhindert. Sie identifiziert auch die Reihenfolge, in der Zustandsaktualisierungen stattgefunden haben (was für die Streitbeilegung wichtig ist). + +- Der alte Zustand des Channels + +- Der neue Zustand des Channels + +- Die Transaktion, die den Zustandsübergang auslöst (z. B. sendet Alice 5 ETH an Bob). + +Zustandsaktualisierungen im Channel werden nicht onchain übertragen, wie es normalerweise der Fall ist, wenn Benutzer im Mainnet interagieren, was mit dem Ziel von Zustands-Channels übereinstimmt, den Onchain-Fußabdruck zu minimieren. Solange sich die Teilnehmer über Zustandsaktualisierungen einig sind, sind diese so endgültig wie eine Ethereum-Transaktion. Die Teilnehmer müssen sich nur auf den Konsens des Mainnets verlassen, wenn es zu einem Streitfall kommt. + +### Schließen des Channels {#closing-the-channel} + +Das Schließen eines Zustands-Channels erfordert die Übermittlung des endgültigen, vereinbarten Zustands des Channels an den Onchain-Smart-Contract. Zu den in der Zustandsaktualisierung referenzierten Details gehören die Anzahl der Züge jedes Teilnehmers und eine Liste der genehmigten Transaktionen. + +Nach der Überprüfung, dass die Zustandsaktualisierung gültig ist (d. h. von allen Parteien unterzeichnet wurde), finalisiert der Smart Contract den Channel und verteilt die gesperrten Gelder entsprechend dem Ergebnis des Channels. Offchain getätigte Zahlungen werden auf den Zustand von Ethereum angewendet und jeder Teilnehmer erhält seinen verbleibenden Anteil der gesperrten Gelder. + +Das oben beschriebene Szenario stellt dar, was im Idealfall („Happy Case“) passiert. Manchmal können Benutzer keine Einigung erzielen und den Channel nicht finalisieren (der „Sad Case“). Jeder der folgenden Punkte könnte auf die Situation zutreffen: + +- Teilnehmer gehen offline und schlagen keine Zustandsübergänge vor + +- Teilnehmer weigern sich, gültige Zustandsaktualisierungen mitzuzeichnen + +- Teilnehmer versuchen, den Channel zu finalisieren, indem sie eine alte Zustandsaktualisierung an den Onchain-Vertrag vorschlagen + +- Teilnehmer schlagen ungültige Zustandsübergänge zur Unterzeichnung durch andere vor + +Immer wenn der Konsens zwischen den teilnehmenden Akteuren in einem Channel zusammenbricht, ist die letzte Option, sich auf den Konsens des Mainnets zu verlassen, um den endgültigen, gültigen Zustand des Channels durchzusetzen. In diesem Fall erfordert das Schließen des Zustands-Channels die Beilegung von Streitigkeiten onchain. + +### Beilegung von Streitigkeiten {#settling-disputes} + +Normalerweise einigen sich die Parteien in einem Channel im Voraus auf die Schließung des Channels und unterzeichnen gemeinsam den letzten Zustandsübergang, den sie an den Smart Contract übermitteln. Sobald die Aktualisierung onchain genehmigt ist, endet die Ausführung des Offchain-Smart-Contracts und die Teilnehmer verlassen den Channel mit ihrem Geld. + +Jedoch kann eine Partei eine Onchain-Anfrage stellen, um die Ausführung des Smart Contracts zu beenden und den Channel zu finalisieren – ohne auf die Zustimmung ihres Gegenübers zu warten. Wenn eine der zuvor beschriebenen Situationen eintritt, die den Konsens brechen, kann jede Partei den Onchain-Vertrag auslösen, um den Channel zu schließen und Gelder zu verteilen. Dies sorgt für **Vertrauenslosigkeit** (Trustlessness) und stellt sicher, dass ehrliche Parteien ihre Einlagen jederzeit abziehen können, unabhängig von den Handlungen der anderen Partei. + +Um den Austritt aus dem Channel zu verarbeiten, muss der Benutzer die letzte gültige Zustandsaktualisierung der Anwendung an den Onchain-Vertrag übermitteln. Wenn dies bestätigt wird (d. h. es trägt die Unterschrift aller Parteien), werden die Gelder zu ihren Gunsten umverteilt. + +Es gibt jedoch eine Verzögerung bei der Ausführung von Austrittsanfragen einzelner Benutzer. Wenn der Antrag auf Abschluss des Channels einstimmig genehmigt wurde, wird die Onchain-Austrittstransaktion sofort ausgeführt. + +Die Verzögerung kommt bei Austritten einzelner Benutzer aufgrund der Möglichkeit betrügerischer Handlungen ins Spiel. Zum Beispiel könnte ein Channel-Teilnehmer versuchen, den Channel auf Ethereum zu finalisieren, indem er eine ältere Zustandsaktualisierung onchain einreicht. + +Als Gegenmaßnahme ermöglichen Zustands-Channels ehrlichen Benutzern, ungültige Zustandsaktualisierungen anzufechten, indem sie den neuesten, gültigen Zustand des Channels onchain einreichen. Zustands-Channels sind so konzipiert, dass neuere, vereinbarte Zustandsaktualisierungen ältere Zustandsaktualisierungen übertrumpfen. + +Sobald ein Peer das Onchain-Streitbeilegungssystem auslöst, muss die andere Partei innerhalb einer Frist (dem sogenannten „Challenge Window“) antworten. Dies ermöglicht es Benutzern, die Austrittstransaktion anzufechten, insbesondere wenn die andere Partei eine veraltete Aktualisierung anwendet. + +Wie auch immer der Fall sein mag, Channel-Benutzer haben immer starke Finalitätsgarantien: Wenn der in ihrem Besitz befindliche Zustandsübergang von allen Mitgliedern unterzeichnet wurde und die jüngste Aktualisierung ist, dann hat er die gleiche Finalität wie eine reguläre Onchain-Transaktion. Sie müssen die andere Partei zwar immer noch onchain anfechten, aber das einzig mögliche Ergebnis ist die Finalisierung des letzten gültigen Zustands, den sie besitzen. + +### Wie interagieren Zustands-Channels mit Ethereum? {#how-do-state-channels-interact-with-ethereum} + +Obwohl sie als Offchain-Protokolle existieren, haben Zustands-Channels eine Onchain-Komponente: den Smart Contract, der beim Öffnen des Channels auf Ethereum bereitgestellt wird. Dieser Vertrag kontrolliert die in den Channel eingezahlten Vermögenswerte, überprüft Zustandsaktualisierungen und schlichtet Streitigkeiten zwischen den Teilnehmern. + +Zustands-Channels veröffentlichen keine Transaktionsdaten oder Zustands-Commitments im Mainnet, im Gegensatz zu [Layer-2](/layer-2/)-Skalierungslösungen. Sie sind jedoch stärker mit dem Mainnet verbunden als beispielsweise [Sidechains](/developers/docs/scaling/sidechains/), was sie etwas sicherer macht. + +Zustands-Channels stützen sich für die folgenden Punkte auf das Ethereum-Hauptprotokoll: + +#### 1. Liveness {#liveness} + +Der Onchain-Vertrag, der beim Öffnen des Channels bereitgestellt wird, ist für die Funktionalität des Channels verantwortlich. Wenn der Vertrag auf Ethereum läuft, ist der Channel immer zur Nutzung verfügbar. Umgekehrt kann eine Sidechain immer ausfallen, selbst wenn das Mainnet betriebsbereit ist, was die Gelder der Benutzer gefährdet. + +#### 2. Sicherheit {#security} + +Bis zu einem gewissen Grad stützen sich Zustands-Channels auf Ethereum, um Sicherheit zu bieten und Benutzer vor bösartigen Peers zu schützen. Wie in späteren Abschnitten erörtert, verwenden Channels einen Betrugsnachweis-Mechanismus, der es Benutzern ermöglicht, Versuche, den Channel mit einer ungültigen oder veralteten Aktualisierung zu finalisieren, anzufechten. + +In diesem Fall legt die ehrliche Partei den neuesten gültigen Zustand des Channels als Betrugsnachweis dem Onchain-Vertrag zur Überprüfung vor. Betrugsnachweise ermöglichen es sich gegenseitig misstrauenden Parteien, Offchain-Transaktionen durchzuführen, ohne dabei ihre Gelder zu riskieren. + +#### 3. Endgültigkeit {#finality} + +Zustandsaktualisierungen, die von Channel-Benutzern gemeinsam unterzeichnet werden, gelten als so gut wie Onchain-Transaktionen. Dennoch erreicht jede Aktivität innerhalb des Channels erst dann echte Finalität, wenn der Channel auf Ethereum geschlossen wird. + +Im optimistischen Fall können beide Parteien kooperieren, die endgültige Zustandsaktualisierung unterzeichnen und onchain einreichen, um den Channel zu schließen, woraufhin die Gelder entsprechend dem endgültigen Zustand des Channels verteilt werden. Im pessimistischen Fall, in dem jemand versucht zu betrügen, indem er eine falsche Zustandsaktualisierung onchain postet, wird seine Transaktion erst nach Ablauf des „Challenge Window“ finalisiert. + +## Virtuelle Zustands-Channels {#virtual-state-channels} + +Die naive Implementierung eines Zustands-Channels wäre, einen neuen Vertrag bereitzustellen, wenn zwei Benutzer eine Anwendung offchain ausführen möchten. Dies ist nicht nur undurchführbar, sondern hebt auch die Kosteneffizienz von Zustands-Channels auf (Onchain-Transaktionskosten können sich schnell summieren). + +Um dieses Problem zu lösen, wurden „virtuelle Channels“ geschaffen. Im Gegensatz zu regulären Channels, die Onchain-Transaktionen zum Öffnen und Schließen erfordern, kann ein virtueller Channel geöffnet, ausgeführt und finalisiert werden, ohne mit der Hauptkette zu interagieren. Mit dieser Methode ist es sogar möglich, Streitigkeiten offchain beizulegen. + +Dieses System beruht auf der Existenz sogenannter „Ledger-Channels“, die onchain finanziert wurden. Virtuelle Channels zwischen zwei Parteien können auf einem bestehenden Ledger-Channel aufgebaut werden, wobei der/die Eigentümer des Ledger-Channels als Vermittler dienen. + +Benutzer in jedem virtuellen Channel interagieren über eine neue Vertragsinstanz, wobei der Ledger-Channel mehrere Vertragsinstanzen unterstützen kann. Der Zustand des Ledger-Channels enthält auch mehr als einen Vertragsspeicherzustand, was die parallele Ausführung von Anwendungen offchain zwischen verschiedenen Benutzern ermöglicht. + +Genau wie bei regulären Channels tauschen die Benutzer Zustandsaktualisierungen aus, um die Zustandsmaschine voranzubringen. Sofern kein Streitfall auftritt, muss der Vermittler nur beim Öffnen oder Schließen des Channels kontaktiert werden. + +### Virtuelle Zahlungs-Channels {#virtual-payment-channels} + +Virtuelle Zahlungs-Channels funktionieren nach der gleichen Idee wie virtuelle Zustands-Channels: Teilnehmer, die mit demselben Netzwerk verbunden sind, können Nachrichten weiterleiten, ohne einen neuen Channel onchain öffnen zu müssen. In virtuellen Zahlungs-Channels werden Wertübertragungen über einen oder mehrere Vermittler geleitet, mit der Garantie, dass nur der beabsichtigte Empfänger die überwiesenen Gelder erhalten kann. + +## Anwendungen von Zustands-Channels {#applications-of-state-channels} + +### Zahlungen {#payments} + +Frühe Blockchain-Channels waren einfache Protokolle, die es zwei Teilnehmern ermöglichten, schnelle, kostengünstige Übertragungen offchain durchzuführen, ohne hohe Transaktionsgebühren im Mainnet zahlen zu müssen. Heute sind Zahlungs-Channels immer noch nützlich für Anwendungen, die für den Austausch und die Einzahlung von Ether und Token konzipiert sind. + +Channel-basierte Zahlungen haben die folgenden Vorteile: + +1. **Durchsatz**: Die Menge an Offchain-Transaktionen pro Channel ist nicht mit dem Durchsatz von Ethereum verbunden, der von verschiedenen Faktoren beeinflusst wird, insbesondere von der Blockgröße und der Blockzeit. Durch die Ausführung von Transaktionen offchain können Blockchain-Channels einen höheren Durchsatz erzielen. + +2. **Datenschutz**: Da Channels offchain existieren, werden Details der Interaktionen zwischen den Teilnehmern nicht auf der öffentlichen Blockchain von Ethereum aufgezeichnet. Channel-Benutzer müssen nur beim Finanzieren und Schließen von Channels oder bei der Beilegung von Streitigkeiten onchain interagieren. Daher sind Channels für Personen nützlich, die privatere Transaktionen wünschen. + +3. **Latenz**: Offchain-Transaktionen, die zwischen Channel-Teilnehmern durchgeführt werden, können sofort abgewickelt werden, wenn beide Parteien kooperieren, was Verzögerungen reduziert. Im Gegensatz dazu erfordert das Senden einer Transaktion im Mainnet das Warten darauf, dass Knoten die Transaktion verarbeiten, einen neuen Block mit der Transaktion erstellen und einen Konsens erzielen. Benutzer müssen möglicherweise auch auf weitere Block-Bestätigungen warten, bevor sie eine Transaktion als finalisiert betrachten. + +4. **Kosten**: Zustands-Channels sind besonders nützlich in Situationen, in denen eine Gruppe von Teilnehmern über einen langen Zeitraum viele Zustandsaktualisierungen austauschen wird. Die einzigen anfallenden Kosten sind das Öffnen und Schließen des Smart Contracts des Zustands-Channels; jede Zustandsänderung zwischen dem Öffnen und Schließen des Channels wird billiger als die letzte, da die Abwicklungskosten entsprechend verteilt werden. + +Die Implementierung von Zustands-Channels auf Layer-2-Lösungen wie [Rollups](/developers/docs/scaling/#rollups) könnte sie für Zahlungen noch attraktiver machen. Obwohl Channels günstige Zahlungen ermöglichen, können die Kosten für die Einrichtung des Onchain-Vertrags im Mainnet während der Eröffnungsphase teuer werden – besonders wenn die Gasgebühren in die Höhe schnellen. Auf Ethereum basierende Rollups bieten [niedrigere Transaktionsgebühren](https://l2fees.info/) und können den Overhead für Channel-Teilnehmer reduzieren, indem sie die Einrichtungsgebühren senken. + +### Mikrotransaktionen {#microtransactions} + +Mikrotransaktionen sind Zahlungen mit geringem Wert (z. B. weniger als ein Bruchteil eines Dollars), die Unternehmen nicht ohne Verluste abwickeln können. Diese Unternehmen müssen Zahlungsdienstleister bezahlen, was sie nicht können, wenn die Marge bei Kundenzahlungen zu gering ist, um einen Gewinn zu erzielen. + +Zahlungskanäle lösen dieses Problem, indem sie den mit Mikrotransaktionen verbundenen Overhead reduzieren. Zum Beispiel kann ein Internetdienstanbieter (ISP) einen Zahlungskanal mit einem Kunden eröffnen, der es ermöglicht, bei jeder Nutzung des Dienstes kleine Zahlungen zu streamen. + +Abgesehen von den Kosten für das Öffnen und Schließen des Kanals entstehen den Teilnehmern keine weiteren Kosten für Mikrotransaktionen (keine Gasgebühren). Dies ist eine Win-Win-Situation, da Kunden mehr Flexibilität bei der Höhe ihrer Zahlungen für Dienstleistungen haben und Unternehmen bei profitablen Mikrotransaktionen keine Einbußen erleiden. + +### Dezentralisierte Anwendungen {#decentralized-applications} + +Ähnlich wie Zahlungskanäle können Zustandskanäle (State Channels) bedingte Zahlungen gemäß den Endzuständen der Zustandsmaschine durchführen. Zustandskanäle können auch beliebige Zustandsübergangslogik unterstützen, was sie für die Ausführung generischer Anwendungen Off-Chain nützlich macht. + +Zustandskanäle sind oft auf einfache rundenbasierte Anwendungen beschränkt, da dies die Verwaltung der an den On-Chain-Vertrag gebundenen Mittel erleichtert. Außerdem ist es bei einer begrenzten Anzahl von Parteien, die den Zustand der Off-Chain-Anwendung in Abständen aktualisieren, relativ einfach, unehrliches Verhalten zu bestrafen. + +Die Effizienz einer Zustandskanal-Anwendung hängt auch von ihrem Design ab. Zum Beispiel könnte ein Entwickler den App-Kanalvertrag einmal On-Chain bereitstellen und anderen Spielern ermöglichen, die App wiederzuverwenden, ohne On-Chain gehen zu müssen. In diesem Fall dient der ursprüngliche App-Kanal als Hauptkanal (Ledger Channel), der mehrere virtuelle Kanäle unterstützt, von denen jeder eine neue Instanz des Smart Contracts der App Off-Chain ausführt. + +Ein möglicher Anwendungsfall für Zustandskanal-Anwendungen sind einfache Zweispieler-Spiele, bei denen Mittel basierend auf dem Spielergebnis verteilt werden. Der Vorteil hierbei ist, dass Spieler sich nicht gegenseitig vertrauen müssen (Vertrauenslosigkeit) und der On-Chain-Vertrag, nicht die Spieler, die Zuteilung der Mittel und die Beilegung von Streitigkeiten kontrolliert (Dezentralisierung). + +Weitere mögliche Anwendungsfälle für Zustandskanal-Apps umfassen ENS-Namenseigentum, NFT-Ledger und viele mehr. + +### Atomare Transfers {#atomic-transfers} + +Frühe Zahlungskanäle waren auf Transfers zwischen zwei Parteien beschränkt, was ihre Nutzbarkeit einschränkte. Die Einführung virtueller Kanäle ermöglichte es jedoch Einzelpersonen, Transfers über Zwischenstellen (d. h. mehrere P2P-Kanäle) weiterzuleiten, ohne einen neuen Kanal On-Chain eröffnen zu müssen. + +Häufig als „Multi-Hop-Transfers“ beschrieben, sind geroutete Zahlungen atomar (d. h., entweder gelingen alle Teile der Transaktion oder sie scheitert insgesamt). Atomare Transfers verwenden [Hash-Zeitsperren-Verträge (HTLCs)](https://en.bitcoin.it/wiki/Hash_Time_Locked_Contracts), um sicherzustellen, dass die Zahlung nur freigegeben wird, wenn bestimmte Bedingungen erfüllt sind, wodurch das Kontrahentenrisiko verringert wird. + +## Nachteile der Verwendung von Zustands-Channels {#drawbacks-of-state-channels} + +### Liveness-Annahmen {#liveness-assumptions} + +Um die Effizienz zu gewährleisten, setzen Zustands-Channels Zeitlimits für die Fähigkeit der Channel-Teilnehmer, auf Streitigkeiten zu reagieren. Diese Regel geht davon aus, dass die Peers immer online sein werden, um die Channel-Aktivität zu überwachen und bei Bedarf Anfechtungen zu bestreiten. + +In der Realität können Benutzer aus Gründen, die außerhalb ihrer Kontrolle liegen (z. B. schlechte Internetverbindung, mechanischer Defekt usw.), offline gehen. Wenn ein ehrlicher Benutzer offline geht, kann ein bösartiger Peer die Situation ausnutzen, indem er dem Schiedsrichtervertrag alte Zwischenzustände vorlegt und die zugesagten Gelder stiehlt. + +Einige Channels verwenden „Watchtowers“ – Entitäten, die dafür verantwortlich sind, Onchain-Streitigkeiten im Namen anderer zu beobachten und die notwendigen Maßnahmen zu ergreifen, wie z. B. die Benachrichtigung der betroffenen Parteien. Dies kann jedoch die Kosten für die Nutzung eines Zustands-Channels erhöhen. + +### Datenunverfügbarkeit {#data-unavailability} + +Wie bereits erläutert, erfordert die Anfechtung einer ungültigen Streitigkeit die Vorlage des neuesten, gültigen Zustands des Zustands-Channels. Dies ist eine weitere Regel, die auf einer Annahme beruht – dass Benutzer Zugriff auf den neuesten Zustand des Channels haben. + +Obwohl es vernünftig ist, von den Channel-Benutzern zu erwarten, dass sie Kopien des Offchain-Anwendungszustands speichern, können diese Daten aufgrund von Fehlern oder mechanischen Ausfällen verloren gehen. Wenn der Benutzer die Daten nicht gesichert hat, kann er nur hoffen, dass die andere Partei keine ungültige Austrittsanfrage mit alten Zustandsübergängen in ihrem Besitz finalisiert. + +Ethereum-Benutzer müssen sich nicht mit diesem Problem befassen, da das Netzwerk Regeln zur Datenverfügbarkeit durchsetzt. Transaktionsdaten werden von allen Knoten gespeichert und verbreitet und stehen den Benutzern bei Bedarf zum Herunterladen zur Verfügung. + +### Liquiditätsprobleme {#liquidity-issues} + +Um einen Blockchain-Channel einzurichten, müssen die Teilnehmer für die Lebensdauer des Channels Gelder in einem Onchain-Smart-Contract sperren. Dies reduziert die Liquidität der Channel-Benutzer und beschränkt Channels auch auf diejenigen, die es sich leisten können, Gelder im Mainnet gesperrt zu halten. + +Jedoch können Ledger-Channels – betrieben von einem Offchain-Dienstanbieter (OSP) – Liquiditätsprobleme für Benutzer reduzieren. Zwei Peers, die mit einem Ledger-Channel verbunden sind, können einen virtuellen Channel erstellen, den sie jederzeit vollständig offchain öffnen und finalisieren können. + +Offchain-Dienstanbieter könnten auch Channels mit mehreren Peers eröffnen, was sie für die Weiterleitung von Zahlungen nützlich macht. Natürlich müssen Benutzer Gebühren an OSPs für ihre Dienste zahlen, was für einige unerwünscht sein kann. + +### Griefing-Angriffe {#griefing-attacks} + +Griefing-Angriffe sind ein häufiges Merkmal von auf Betrugsnachweisen basierenden Systemen. Ein Griefing-Angriff nützt dem Angreifer nicht direkt, sondern fügt dem Opfer Leid (d. h. Schaden) zu, daher der Name. + +Betrugsnachweise sind anfällig für Griefing-Angriffe, da die ehrliche Partei auf jede Streitigkeit, auch auf ungültige, reagieren muss, sonst riskiert sie, ihre Gelder zu verlieren. Ein bösartiger Teilnehmer kann sich entscheiden, wiederholt veraltete Zustandsübergänge onchain zu posten, was die ehrliche Partei zwingt, mit dem gültigen Zustand zu antworten. Die Kosten für diese Onchain-Transaktionen können sich schnell summieren, was dazu führt, dass ehrliche Parteien dabei Verluste erleiden. + +### Vordefinierte Teilnehmergruppen {#predefined-participant-sets} + +Konstruktionsbedingt bleibt die Anzahl der Teilnehmer, die einen Zustands-Channel bilden, während seiner gesamten Lebensdauer fest. Dies liegt daran, dass eine Aktualisierung der Teilnehmergruppe den Betrieb des Kanals, insbesondere bei der Finanzierung des Kanals oder der Beilegung von Streitigkeiten, komplizieren würde. Das Hinzufügen oder Entfernen von Teilnehmern würde auch zusätzliche Onchain-Aktivitäten erfordern, was den Aufwand für die Benutzer erhöht. + +Obwohl dies Zustands-Channels leichter verständlich macht, schränkt es die Nützlichkeit von Channel-Designs für Anwendungsentwickler ein. Dies erklärt zum Teil, warum Zustands-Channels zugunsten anderer Skalierungslösungen wie Rollups aufgegeben wurden. + +### Parallele Transaktionsverarbeitung {#parallel-transaction-processing} + +Die Teilnehmer im Zustands-Channel senden abwechselnd Zustandsaktualisierungen, weshalb sie am besten für „rundenbasierte Anwendungen“ (z. B. ein Zwei-Spieler-Schachspiel) geeignet sind. Dies eliminiert die Notwendigkeit, gleichzeitige Zustandsaktualisierungen zu handhaben und reduziert die Arbeit, die der Onchain-Vertrag leisten muss, um Poster von veralteten Aktualisierungen zu bestrafen. Ein Nebeneffekt dieses Designs ist jedoch, dass Transaktionen voneinander abhängig sind, was die Latenz erhöht und die allgemeine Benutzererfahrung beeinträchtigt. + +Einige Zustands-Channels lösen dieses Problem, indem sie ein „Vollduplex“-Design verwenden, das den Offchain-Zustand in zwei unidirektionale „Simplex“-Zustände aufteilt und so gleichzeitige Zustandsaktualisierungen ermöglicht. Solche Designs verbessern den Offchain-Durchsatz und verringern Transaktionsverzögerungen. + +## Zustands-Channels verwenden {#use-state-channels} Mehrere Projekte bieten Implementierungen von Zustandskanälen, die Sie in Ihre dApps integrieren können: - [Connext](https://connext.network/) -- [K-Kanäle](https://www.kchannels.io/) +- [Kchannels](https://www.kchannels.io/) - [Perun](https://perun.network/) - [Raiden](https://raiden.network/) - [Statechannels.org](https://statechannels.org/) -## Weiterführende Informationen {#further-reading} - -**Zustandskanäle** +## Weiterführende Lektüre {#further-reading} -- [Making Sense of Ethereum's Layer 2 Scaling Solutions: State Channels, Plasma, and Truebit](https://medium.com/l4-media/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit-22cb40dcc2f4) _– Josh Stark, 12. Februar 2018_ -- [State Channels - an explanation](https://www.jeffcoleman.ca/state-channels/) _6. November 2015 - Jeff Coleman_ -- [Basis von Zustandskanälen](https://education.district0x.io/general-topics/understanding-ethereum/basics-state-channels/) _Distrikt0x_ +**Statuskanäle** -**Zahlungskanäle** +- [Making Sense of Ethereum’s Layer 2 Scaling Solutions: State Channels, Plasma, and Truebit](https://medium.com/l4-media/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit-22cb40dcc2f4) _– Josh Stark, 12. Februar 2018_ +- [State Channels – eine Erklärung](https://www.jeffcoleman.ca/state-channels/) _6. Nov. 2015 – Jeff Coleman_ +- [Grundlagen von State Channels](https://education.district0x.io/general-topics/understanding-ethereum/basics-state-channels/) _District0x_ +- [Blockchain State Channels: Ein Stand der Technik](https://ieeexplore.ieee.org/document/9627997) -_Kennen Sie eine Community-Ressource die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/scaling/validium/index.md b/public/content/translations/de/developers/docs/scaling/validium/index.md index 47cd071ad86..2152955fccf 100644 --- a/public/content/translations/de/developers/docs/scaling/validium/index.md +++ b/public/content/translations/de/developers/docs/scaling/validium/index.md @@ -2,34 +2,165 @@ title: Validium description: Eine Einführung in Validium als Skalierungslösung, die derzeit von der Ethereum-Community genutzt wird. lang: de -incomplete: true sidebarDepth: 3 --- -Verwendet Gültigkeitszertifikate wie [ZK-Rollups](/developers/docs/scaling/zk-rollups/), aber Daten werden nicht auf dem Layer-1 der Ethereum-Blockchain gespeichert. Dies kann zu 10.000 Transaktionen pro Sekunde pro Validium-Kette führen und mehrere Ketten können parallel laufen. +Validium ist eine [Skalierungslösung](/developers/docs/scaling/), die die Integrität von Transaktionen mithilfe von Gültigkeitsnachweisen wie [ZK-Rollups](/developers/docs/scaling/zk-rollups/) gewährleistet, aber keine Transaktionsdaten auf dem Ethereum Mainnet speichert. Während die Verfügbarkeit von Off-Chain-Daten Kompromisse mit sich bringt, kann sie zu massiven Verbesserungen der Skalierbarkeit führen (Validiums können [ca. 9.000 Transaktionen oder mehr pro Sekunde](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263) verarbeiten). ## Voraussetzungen {#prerequisites} -Sie sollten ein gutes Verständnis aller grundlegenden Themen und ein umfassendes Verständnis für [Ethereum-Skalierung](/developers/docs/scaling/) haben. Die Implementierung von Skalierungslösungen wie Validium ist ein fortgeschrittenes Thema, da die Technologie noch nicht so sehr erprobt ist und weiter erforscht und entwickelt wird. +Sie sollten unsere Seite über die [Ethereum-Skalierung](/developers/docs/scaling/) und [Layer 2](/layer-2) gelesen und verstanden haben. -## Vor- und Nachteile {#pros-and-cons} +## Was ist Validium? {#what-is-validium} -| Vorteile | Kontra | -| ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Keine Auszahlungsverzögerung (keine Latenz für on-chain/cross-chain tx), folglich eine höhere Kapitaleffizienz. | Begrenzte Unterstützung für allgemeine Berechnung/Smart Contracts; spezialisierte Programmiersprachen erforderlich. | -| Nicht anfällig für bestimmte wirtschaftliche Angriffe, wie Betrugsnachweis-basierte Systeme in hochwertigen Anwendungen. | Benötigt eine hohe Rechenleistung für die Erstellung von ZK-Beweisen und ist nicht kostengünstig für Anwendungen mit geringem Transaktionsdurchsatz. | -| | Langsamere subjektive Finalisierungszeit (10-30 Minuten, um einen ZK-Nachweis zu erstellen) (aber schneller bis zum vollen Abschluss, da es keine Streitzeitverzögerung gibt). | -| | Um einen Nachweis zu erbringen, müssen die Daten außerhalb der Kette jederzeit verfügbar sein. | +Validiums sind Skalierungslösungen, die Off-Chain-Datenverfügbarkeit und -berechnung nutzen, um den Durchsatz zu verbessern, indem Transaktionen außerhalb des Ethereum Mainnets verarbeitet werden. Wie Zero-Knowledge Rollups (ZK-Rollups) veröffentlichen Validiums [Zero-Knowledge-Proofs](/glossary/#zk-proof), um Off-Chain-Transaktionen auf Ethereum zu verifizieren. Dies verhindert ungültige Zustandsübergänge und verbessert die Sicherheitsgarantien einer Validium-Kette. -### Validium verwenden {#use-validium} +Diese "Gültigkeitsnachweise" können in Form von ZK-SNARKs (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) oder ZK-STARKs (Zero-Knowledge Scalable Transparent ARgument of Knowledge) vorliegen. Mehr zu [Zero-Knowledge-Proofs](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/). -Mehrere Projekte bieten Implementierungen von Validium, die Sie in Ihre dApps integrieren können: +Die Gelder der Validium-Nutzer werden von einem Smart Contract auf Ethereum verwaltet. Validiums bieten nahezu sofortige Auszahlungen, ähnlich wie ZK-Rollups; sobald der Gültigkeitsnachweis für eine Auszahlungsanforderung auf dem Mainnet verifiziert wurde, können Nutzer Gelder abheben, indem sie [Merkle-Nachweise](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) vorlegen. Der Merkle-Beweis überprüft, ob die Auszahlungstransaktion des Nutzers in einem verifizierten Transaktionsbatch enthalten ist, und ermöglicht es dem On-Chain-Vertrag, die Auszahlung zu bearbeiten. -- [Starkware](https://starkware.co/) -- [Matter Labs zkPorter](https://matter-labs.io/) +Allerdings können die Gelder der Validium-Nutzer eingefroren und Auszahlungen eingeschränkt werden. Das kann passieren, wenn Datenverfügbarkeits-Manager auf der Validium-Chain die Off-Chain-State-Daten vor Nutzern zurückhalten. Ohne Zugriff auf Transaktionsdaten können die Nutzer den für den Nachweis des Eigentums an den Geldern und die Durchführung von Auszahlungen erforderlichen Merkle-Nachweis nicht berechnen. -## Weiterführende Informationen {#further-reading} +Dies ist der Hauptunterschied zwischen Validiums und ZK-Rollups – ihre Positionen im Datenverfügbarkeitsspektrum. Beide Lösungen gehen unterschiedlich mit der Datenspeicherung um, was Auswirkungen auf Sicherheit und Vertrauenswürdigkeit hat. -- [Validium And The Layer 2 Two-By-Two — Ausgabe Nr. 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) +## Wie interagieren Validiums mit Ethereum? Wie interagieren Validiums mit Ethereum? {#how-do-validiums-interact-with-ethereum} -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +Validiums sind Skalierungsprotokolle, die auf der bestehenden Ethereum-Blockchain aufgebaut sind. Obwohl die Transaktionen Off-Chain ausgeführt werden, wird eine Validium-Chain von mehreren Smart Contracts verwaltet, die im Mainnet eingesetzt sind, darunter: + +1. **Verifier-Vertrag**: Der Verifier-Vertrag überprüft die Gültigkeit der vom Validium-Operator eingereichten Nachweise bei der Durchführung von Statusaktualisierungen. Das umfasst Gültigkeitsnachweise, die die Korrektheit der Offchain-Transaktionen belegen, sowie Datenverfügbarkeitsnachweise, die bestätigen, dass die Offchain-Transaktionsdaten vorhanden sind. + +2. **Hauptvertrag**: Der Hauptvertrag speichert State-Commitments (Merkle-Roots), die von Block-Produzenten eingereicht werden, und aktualisiert den Status des Validiums, sobald ein Gültigkeitsnachweis on-chain verifiziert wurde. Dieser Vertrag verarbeitet auch Einzahlungen in die Validium-Kette und Abhebungen aus dieser. + +Validiums verlassen sich auch auf die Haupt-Ethereum-Blockchain für Folgendes: + +### Abwicklung {#settlement} + +Transaktionen, die auf einem Validium ausgeführt werden, können erst vollständig bestätigt werden, wenn die Haupt-Blockchain ihre Gültigkeit überprüft hat. Alle Geschäfte, die auf einem Validium durchgeführt werden, müssen schließlich auf dem Mainnet abgewickelt werden. Die Ethereum-Blockchain bietet Validium-Nutzern auch "Settlement-Garantien", was bedeutet: Sobald Off-Chain-Transaktionen auf die Blockchain übertragen sind, können sie nicht mehr rückgängig gemacht oder verändert werden. + +### Sicherheit {#security} + +Ethereum, das als Abwicklungsschicht fungiert, garantiert auch die Gültigkeit der Statusübergänge auf Validium. Off-Chain-Transaktionen, die auf der Validium-Chain ausgeführt werden, werden über einen Smart Contract auf der Basis-Ethereum-Schicht verifiziert. + +Hält der On-Chain-Verifizierungsvertrag den Nachweis für ungültig, werden die Transaktionen abgelehnt. Das bedeutet, dass die Betreiber die vom Ethereum-Protokoll durchgesetzten Gültigkeitsbedingungen erfüllen müssen, bevor sie den Status des Validiums aktualisieren. + +## Wie funktioniert Validium? {#how-does-validium-work} + +### Transaktionen {#transactions} + +Benutzer übermitteln Transaktionen an den Betreiber, eine Node, der für die Ausführung von Transaktionen auf der Validium-Kette verantwortlich ist. Einige Validiums können einen einzelnen Betreiber verwenden, um die Chain auszuführen, oder sich auf einen [Proof-of-Stake (PoS)](/developers/docs/consensus-mechanisms/pos/)-Mechanismus für rotierende Betreiber verlassen. + +Der Betreiber fasst Transaktionen zu einem Batch zusammen und sendet diesen an eine Beweisschaltung zur Verifizierung. Die Beweisschaltung akzeptiert das Transaktionsbatch (und andere relevante Daten) als Eingaben und gibt einen Gültigkeitsnachweis aus, der bestätigt, dass die Operationen korrekt durchgeführt wurden. + +### Zustands-Commitments {#state-commitments} + +Der Zustand des Validiums wird als Merkle-Baum gehasht, wobei die Wurzel im Hauptvertrag auf Ethereum gespeichert wird. Die Merkle-Wurzel, auch bekannt als Zustandswurzel, dient als kryptografische Verpflichtung zum aktuellen Zustand der Konten und Salden auf dem Validium. + +Um den Zustand zu aktualisieren, muss der Betreiber (nachdem er Transaktionen ausgeführt hat) einen neuen Zustands-Hashwert (State-Root) berechnen und diesen an den On-Chain-Vertrag übermitteln. Wenn der Gültigkeitsnachweis erfolgreich ist, wird der vorgeschlagene Zustand akzeptiert und das Validium wechselt zum neuen Zustands-Root. + +### Einzahlungen und Auszahlungen {#deposits-and-withdrawals} + +Nutzer verschieben ihre Gelder von Ethereum auf ein Validium, indem sie ETH (oder irgendeinen ERC-kompatiblen Token) im On-Chain-Vertrag einzahlen. Der Vertrag leitet das Einzahlungsereignis Off-Chain an das Validium weiter, wo die Adresse des Benutzers mit einem Betrag gutgeschrieben wird, der seiner Einzahlung entspricht. Der Betreiber fügt diese Einzahlungstransaktion auch einem neuen Batch hinzu. + +Um Gelder zurück ins Mainnet zu bewegen, initiiert ein Validium-Benutzer eine Auszahlungstransaktion und übermittelt sie an den Betreiber, der die Auszahlungsanfrage validiert und sie in einen Batch aufnimmt. Die Vermögenswerte des Benutzers auf der Validium-Chain werden ebenfalls vernichtet, bevor er das System verlassen kann. Sobald der mit dem Batch verbundene Gültigkeitsnachweis verifiziert ist, kann der Benutzer den Hauptvertrag aufrufen, um den Rest seiner ursprünglichen Einzahlung abzuheben. + +Als Mechanismus gegen Zensur erlaubt das Validium-Protokoll Benutzern, sich direkt vom Validium-Vertrag auszuzahlen, ohne den Betreiber zu durchlaufen. In diesem Fall müssen Benutzer dem Verifizierungsvertrag einen Merkle-Proof vorlegen, der die Aufnahme eines Kontos in den Zustands-Root belegt. Wenn der Beweis akzeptiert wird, kann der Benutzer die Auszahlungsfunktion des Hauptvertrags aufrufen, um seine Gelder aus dem Validium auszuzahlen. + +### Batch-Übermittlung {#batch-submission} + +Nach der Ausführung eines Batches von Transaktionen übermittelt der Betreiber den zugehörigen Gültigkeitsnachweis an den Verifizierungsvertrag und schlägt dem Hauptvertrag einen neuen Zustands-Root vor. Wenn der Beweis gültig ist, aktualisiert der Hauptvertrag den Zustand des Validiums und finalisiert die Ergebnisse der Transaktionen im Batch. + +Im Gegensatz zu einem ZK-Rollup müssen Blockproduzenten auf einem Validium keine Transaktionsdaten für Transaktions-Batches veröffentlichen (nur Block-Header). Dies macht Validium zu einem reinen Off-Chain-Skalierungsprotokoll, im Gegensatz zu „hybriden“ Skalierungsprotokollen (d. h. [Layer 2](/layer-2/)), die State-Daten auf der Ethereum-Hauptchain unter Verwendung von Blob-Daten, `calldata` oder einer Kombination aus beidem veröffentlichen. + +### Datenverfügbarkeit {#data-availability} + +Wie bereits erwähnt, nutzen Validiums ein Off-Chain-Datenverfügbarkeitsmodell, bei dem Betreiber alle Transaktionsdaten außerhalb des Ethereum Mainnets speichern. Der geringe Daten-Footprint von Validium in der Blockchain verbessert die Skalierbarkeit (der Durchsatz wird nicht durch die Datenverarbeitungskapazität von Ethereum begrenzt) und senkt die Nutzergebühren (die Kosten für die Veröffentlichung von Daten in der Blockchain sind geringer). + +Die Off-Chain-Datenverfügbarkeit birgt jedoch ein Problem: Daten, die zum Erstellen oder Überprüfen von Merkle-Proofs erforderlich sind, sind möglicherweise nicht verfügbar. Das bedeutet, dass Nutzer möglicherweise keine Gelder aus dem On-Chain-Vertrag abheben können, falls Betreiber böswillig handeln. + +Verschiedene Validium-Lösungen versuchen, dieses Problem zu lösen, indem sie die Speicherung von Zustandsdaten dezentralisieren. Dabei werden die Blockproduzenten gezwungen, die zugrunde liegenden Daten an "Datenverfügbarkeits-Manager" zu senden, die dafür zuständig sind, Off-Chain-Daten zu speichern und sie den Nutzern auf Anfrage zur Verfügung zu stellen. + +Datenverfügbarkeits-Manager in Validium bestätigen die Verfügbarkeit von Daten für Off-Chain-Transaktionen, indem sie jeden Validium-Batch signieren. Diese Signaturen sind eine Art "Verfügbarkeitsnachweis", den der On-Chain-Verifizierungsvertrag prüft, bevor er Status-Updates genehmigt. + +Validiums unterscheiden sich in ihrem Ansatz zur Verwaltung der Datenverfügbarkeit. Einige Validium-Lösungen verlassen sich auf vertrauenswürdige Parteien zur Speicherung der Zustandsdaten, während andere zufällig zugewiesene Validatoren für diese Aufgabe nutzen. + +#### Datenverfügbarkeitskomitee (DAC) {#data-availability-committee} + +Um die Verfügbarkeit von Off-Chain-Daten zu garantieren, setzen einige Validium-Lösungen eine Gruppe von vertrauenswürdigen Entitäten ein, die zusammen als Datenverfügbarkeitskomitee (DAC) bekannt sind. Diese speichern Kopien des Status und liefern Nachweise für die Datenverfügbarkeit. DACs sind einfacher zu implementieren und erfordern weniger Koordination, da die Anzahl der Mitglieder gering ist. + +Allerdings müssen die Nutzer dem DAC vertrauen, dass die Daten verfügbar gemacht werden, wenn sie benötigt werden (z.B. zum Erstellen von Merkle-Beweisen). Es besteht die Möglichkeit, dass Mitglieder von Datenverfügbarkeitskomitees [von einem böswilligen Akteur kompromittiert werden](https://notes.ethereum.org/DD7GyItYQ02d0ax_X-UbWg?view), der dann Off-Chain-Daten zurückhalten kann. + +[Mehr über Datenverfügbarkeitskomitees in Validiums](https://medium.com/starkware/data-availability-e5564c416424). + +#### Gebundene Datenverfügbarkeit {#bonded-data-availability} + +Andere Validiums verlangen von den Teilnehmern, die mit der Speicherung von Offline-Daten beauftragt sind, dass sie Tokens in einem Smart Contract hinterlegen (d.h. sperren), bevor sie ihre Rollen übernehmen. Dieser Einsatz dient als "Kaution", um ehrliches Verhalten unter den Datenverfügbarkeitsmanagern zu gewährleisten und die Vertrauensannahmen zu reduzieren. Wenn diese Teilnehmer es versäumen, die Datenverfügbarkeit zu beweisen, wird die Kaution konfisziert. + +Bei einem Bonded-Data-Availability-System kann grundsätzlich jeder Off-Chain-Daten speichern, sobald er den nötigen Einsatz (Stake) hinterlegt hat. Dies erweitert den Pool der möglichen Datenverfügbarkeitsmanager und reduziert die Zentralisierung, die Data Availability Committees (DACs) beeinflusst. Noch wichtiger ist, dass dieser Ansatz auf kryptowirtschaftliche Anreize setzt, um bösartiges Verhalten zu verhindern, was erheblich sicherer ist, als vertrauenswürdige Parteien damit zu beauftragen, Offline-Daten im Validium zu sichern. + +[Mehr über gebundene Datenverfügbarkeit in Validiums](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf). + +## Volitions und Validium {#volitions-and-validium} + +Validiums bieten viele Vorteile, aber sie gehen mit Kompromissen einher (vor allem in Bezug auf die Datenverfügbarkeit). Aber wie bei vielen Skalierungslösungen sind Validiums für spezifische Anwendungsfälle geeignet – was der Grund dafür ist, warum Volitions entwickelt wurden. + +Volitions kombinieren eine ZK-Rollup- und eine Validium-Kette und ermöglichen es Nutzern, zwischen den beiden Skalierungslösungen zu wechseln. Mit Volitions kannst du für bestimmte Transaktionen die Off-Chain-Datenverfügbarkeit von Validium nutzen, hast aber trotzdem die Freiheit, bei Bedarf auf eine On-Chain-Datenverfügbarkeitslösung (ZK-Rollup) umzusteigen. Dies gibt den Nutzern im Wesentlichen die Freiheit, je nach ihren individuellen Bedürfnissen und Umständen abzuwägen und die für sie passenden Kompromisse zu wählen. + +Eine dezentrale Börse (DEX) könnte die skalierbare und private Infrastruktur eines Validiums für hochvolumige oder hochwertige Transaktionen bevorzugen. Gleichzeitig könnte sie ein ZK-Rollup für Nutzer verwenden, die die höheren Sicherheitsgarantien und die Vertrauenslosigkeit eines ZK-Rollups bevorzugen. + +## Validiums und EVM-Kompatibilität {#validiums-and-evm-compatibility} + +Ähnlich wie ZK-Rollups eignen sich Validiums hauptsächlich für einfache Anwendungen, wie zum Beispiel Token-Swaps und Zahlungen. Die Unterstützung allgemeiner Berechnungen und der Ausführung von Smart Contracts bei Validiums ist schwierig umzusetzen, da der Nachweis von [EVM](/developers/docs/evm/)-Anweisungen in einem Zero-Knowledge-Proof-Schaltkreis einen erheblichen Aufwand bedeutet. + +Einige Validium-Projekte versuchen, dieses Problem zu umgehen, indem sie EVM-kompatible Sprachen (z. B. Solidity, Vyper) in benutzerdefinierten Bytecode kompilieren, der für effiziente Nachweise optimiert ist. Ein Nachteil dieses Ansatzes ist, dass neue Zero-Knowledge-Proof-fähige virtuelle Maschinen (VMs) möglicherweise nicht alle wichtigen EVM-Opcodes unterstützen, und Entwickler müssen direkt in der Hochsprache programmieren, um eine optimale Erfahrung zu gewährleisten. Dies führt zu weiteren Problemen: Es zwingt Entwickler dazu, dApps mit einem völlig neuen Entwicklungstack zu erstellen, und bricht die Kompatibilität mit der bestehenden Ethereum-Infrastruktur. + +Einige Teams versuchen jedoch, bestehende EVM-Opcodes für ZK-Proof-Schaltkreise zu optimieren. Dies wird zur Entwicklung einer Zero-Knowledge Ethereum Virtual Machine (zkEVM) führen, einer EVM-kompatiblen virtuellen Maschine, die Nachweise erzeugt, um die Korrektheit der Programmausführung zu überprüfen. Mit einem zkEVM können Validium-Chains Smart Contracts Off-Chain ausführen und Gültigkeitsnachweise einreichen, um eine Off-Chain-Berechnung auf Ethereum zu verifizieren (ohne sie erneut ausführen zu müssen). + +[Mehr über zkEVMs](https://www.alchemy.com/overviews/zkevm). + +## Wie skalieren Validiums Ethereum? Skalierung von Ethereum mit Validiums {#scaling-ethereum-with-validiums} + +### 1. Off-Chain-Datenspeicherung {#offchain-data-storage} + +Layer-2-Skalierungsprojekte wie Optimistic Rollups und ZK-Rollups tauschen die unendliche Skalierbarkeit von reinen Off-Chain-Skalierungsprotokollen (z. B. [Plasma](/developers/docs/scaling/plasma/)) gegen Sicherheit ein, indem sie einige Transaktionsdaten auf L1 veröffentlichen. Das bedeutet jedoch, dass die Skalierbarkeitseigenschaften von Rollups durch die Datenbandbreite auf dem Ethereum Mainnet begrenzt sind ([Data-Sharding](/roadmap/danksharding/) schlägt aus diesem Grund eine Verbesserung der Datenspeicherkapazität von Ethereum vor). + +Validiums erreichen Skalierbarkeit, indem sie alle Transaktionsdaten Off-Chain halten und nur Zustandsverpflichtungen (sowie Gültigkeitsbeweise) veröffentlichen, wenn sie Statusaktualisierungen an die Hauptkette von Ethereum übermitteln. Die Existenz von Gültigkeitsnachweisen verleiht Validiums jedoch höhere Sicherheitsgarantien als andere reine Off-Chain-Skalierungslösungen, einschließlich Plasma und [Sidechains](/developers/docs/scaling/sidechains/). Durch die Reduzierung der Datenmenge, die Ethereum verarbeiten muss, bevor Offchain-Transaktionen validiert werden, erweitern Validium-Designs den Durchsatz im Mainnet erheblich. + +### 2. Rekursive Proofs {#recursive-proofs} + +Ein rekursiver Beweis ist ein Gültigkeitsnachweis, der die Gültigkeit anderer Beweise überprüft. Diese „Beweise von Beweisen“ werden erzeugt, indem mehrere Beweise rekursiv aggregiert werden, bis ein finaler Beweis entsteht, der alle vorherigen Beweise verifiziert. Rekursive Beweise skalieren die Verarbeitungsgeschwindigkeit von Blockchains, indem sie die Anzahl der Transaktionen erhöhen, die pro Gültigkeitsnachweis verifiziert werden können. + +In der Regel bestätigt jeder Gültigkeitsnachweis, den der Validium-Betreiber zur Überprüfung an Ethereum sendet, die Integrität eines einzelnen Blocks. Wohingegen ein einzelner rekursiver Beweis verwendet werden kann, um die Gültigkeit mehrerer Validium-Blöcke gleichzeitig zu bestätigen – dies ist möglich, da die Schaltung zur Beweiserstellung mehrere Blockbeweise rekursiv in einen finalen Beweis aggregieren kann. Wenn der On-Chain-Verifizierer-Vertrag den rekursiven Beweis akzeptiert, werden alle zugrunde liegenden Blöcke sofort finalisiert. + +## Vor- und Nachteile von Validium {#pros-and-cons-of-validium} + +| Pro | Nachteile | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Gültigkeitsbeweise gewährleisten die Integrität von Off-Chain-Transaktionen und verhindern, dass Betreiber ungültige Statusaktualisierungen finalisieren. | Die Erstellung von Gültigkeitsnachweisen erfordert spezielle Hardware, was ein Zentralisierungsrisiko darstellt. | +| Erhöht die Kapitaleffizienz für Benutzer (keine Verzögerungen beim Zurückziehen von Geldern nach Ethereum) | Eingeschränkte Unterstützung für allgemeine Berechnungen/Smart Contracts; spezialisierte Sprachen sind für die Entwicklung erforderlich. | +| Nicht anfällig für bestimmte wirtschaftliche Angriffe, wie Betrugsnachweis-basierte Systeme in hochwertigen Anwendungen. | Hohe Rechenleistung erforderlich, um ZK-Nachweise zu generieren; nicht kosteneffektiv für Anwendungen mit geringer Durchsatzrate. | +| Reduziert die Gasgebühren für Benutzer, indem keine Calldaten auf dem Ethereum-Mainnet veröffentlicht werden. | Langsamere subjektive Finalitätszeit (10-30 Minuten, um einen ZK-Nachweis zu generieren), aber schneller bis zur vollständigen Finalität, da es keine Verzögerung durch Streitigkeiten gibt. | +| Geeignet für spezifische Anwendungsfälle wie Handel oder Blockchain-Gaming, bei denen die Transaktionsprivatsphäre und Skalierbarkeit priorisiert werden. | Nutzern kann die Auszahlung von Geldern verwehrt werden, da das Erzeugen von Merkle-Nachweisen des Eigentums jederzeit verfügbare Off-Chain-Daten erfordert. | +| Die Verfügbarkeit von Offchain-Daten ermöglicht höhere Durchsatzraten und steigert die Skalierbarkeit. | Das Sicherheitsmodell beruht auf Vertrauensannahmen und kryptoökonomischen Anreizen, im Gegensatz zu ZK-Rollups, die ausschließlich auf kryptografischen Sicherheitsmechanismen basieren. | + +### Validium/Volitions verwenden {#use-validium-and-volitions} + +Mehrere Projekte bieten Implementierungen von Validium und Volitions an, die Sie in Ihre Dapps integrieren können: + +**StarkWare StarkEx** – _StarkEx ist eine Ethereum Layer 2 (L2) Skalierungslösung, die auf Gültigkeitsnachweisen basiert. Es kann entweder im ZK-Rollup oder im Validium Datenverfügbarkeitsmodus betrieben werden._ + +- [Dokumentation](https://docs.starkware.co/starkex-v4/starkex-deep-dive/data-availability-modes#validium) +- [Website](https://starkware.co/starkex/) + +**Matter Labs zkPorter** – _zkPorter ist ein Layer-2-Skalierungsprotokoll, das die Datenverfügbarkeit mit einem hybriden Ansatz angeht, der die Ideen von zkRollup und Sharding kombiniert. Es kann beliebig viele Shards unterstützen, jeder mit seiner eigenen Datenverfügbarkeitsrichtlinie._ + +- [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) +- [Dokumentation](https://docs.zksync.io/zksync-protocol/rollup/data-availability) +- [Website](https://zksync.io/) + +## Weiterführende Lektüre {#further-reading} + +- [Validium And The Layer 2 Two-By-Two – Issue No. 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) +- [ZK-rollups vs Validium](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263) +- [Volition and the Emerging Data Availability spectrum](https://medium.com/starkware/volition-and-the-emerging-data-availability-spectrum-87e8bfa09bb) +- [Rollups, Validiums, and Volitions: Learn About the Hottest Ethereum Scaling Solutions](https://www.defipulse.com/blog/rollups-validiums-and-volitions-learn-about-the-hottest-ethereum-scaling-solutions) +- [Der praktische Leitfaden für Ethereum-Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) diff --git a/public/content/translations/de/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/de/developers/docs/scaling/zk-rollups/index.md index 48f06c230bd..d09c9a071e6 100644 --- a/public/content/translations/de/developers/docs/scaling/zk-rollups/index.md +++ b/public/content/translations/de/developers/docs/scaling/zk-rollups/index.md @@ -1,40 +1,257 @@ --- -title: Zero-Knowledge Rollups -description: Einführung in Zero-Knowledge Rollups +title: Zero-Knowledge Gruppierungen (Rollups) +description: Eine Einführung in Zero-Knowledge-Rollups – eine Skalierungslösung, die von der Ethereum-Community verwendet wird. lang: de --- +Zero-Knowledge-Rollups (ZK-Rollups) sind Layer-2-[Skalierungslösungen](/developers/docs/scaling/), die den Durchsatz auf dem Ethereum Mainnet erhöhen, indem sie Berechnungen und die Zustandsspeicherung offchain verlagern. ZK-Rollups können Tausende von Transaktionen in einem Stapel verarbeiten und dann nur minimale Zusammenfassungsdaten an das Mainnet senden. Diese zusammenfassenden Daten definieren die Änderungen, die am Status von Ethereum vorgenommen werden sollten, sowie einige kryptografische Nachweise dafür, dass diese Änderungen korrekt sind. + ## Voraussetzungen {#prerequisites} -Sie sollten ein gutes Verständnis aller grundlegenden Themen und ein umfassendes Verständnis für [Ethereum-Skalierung](/developers/docs/scaling/) haben. Die Implementierung von Skalierungslösungen wie Rollups ist ein fortgeschrittenes Thema, da die Technologie weniger erprobt ist und weiter erforscht und entwickelt wird. +Sie sollten unsere Seite über die [Ethereum-Skalierung](/developers/docs/scaling/) und [Layer 2](/layer-2) gelesen und verstanden haben. + +## Was sind Zero-Knowledge-Rollups? {#what-are-zk-rollups} + +**Zero-Knowledge-Rollups (ZK-Rollups)** bündeln (oder ‚rollen auf‘) Transaktionen zu Stapeln, die offchain ausgeführt werden. Indem Berechnungen Off-Chain stattfinden, muss eine geringere Datenmenge auf der Blockchain veröffentlicht werden. ZK-Rollout-Betreiber übermitteln eine Zusammenfassung der erforderlichen Änderungen, um alle Transaktionen in einem Stapel darzustellen, anstatt jede Transaktion einzeln zu senden. Sie erzeugen auch [Gültigkeitsnachweise](/glossary/#validity-proof), um die Korrektheit ihrer Änderungen zu beweisen. + +Der Zustand eines ZK-Rollups wird durch einen Smart Contract verwaltet, der auf dem Ethereum-Netzwerk bereitgestellt wird. ZK-Rollup-Nodes müssen einen Gültigkeitsnachweis zur Überprüfung vorlegen, um diesen Zustand zu aktualisieren. Der Gültigkeitsnachweis dient, wie bereits erklärt, als kryptografischer Beleg dafür, dass die vom Rollup vorgeschlagene Zustandsänderung aus der Ausführung des jeweiligen Transaktions-Batches resultiert. Das bedeutet, dass ZK-Rollups nur Gültigkeitsnachweise erbringen müssen, um Transaktionen auf Ethereum abzuschließen, anstatt alle Transaktionsdaten onchain zu posten wie [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/). + +Der Transfer von Geldern von einem ZK-Rollup zu Ethereum erfolgt ohne Verzögerung, weil der ZK-Rollup-Contract die Exit-Transaktionen sofort nach der Verifizierung des Gültigkeitsnachweises ausführt. Umgekehrt unterliegt die Auszahlung von Geldern aus Optimistic Rollups einer Verzögerung, damit jeder die Austrittstransaktion mit einem [Betrugsbeweis](/glossary/#fraud-proof) anfechten kann. + +ZK-Rollups schreiben Transaktionen als `calldata` auf Ethereum. `calldata` ist der Speicherort für Daten, die in externen Aufrufen an Smart-Contract-Funktionen enthalten sind. Informationen in `calldata` werden auf der Blockchain veröffentlicht, sodass jeder den Zustand des Rollups unabhängig rekonstruieren kann. ZK-Rollups verwenden Komprimierungsverfahren, um die Datenmenge von Transaktionen zu verringern. Beispielsweise werden Accounts nicht durch eine Adresse, sondern durch einen Index repräsentiert, wodurch 28 Bytes an Daten gespart werden. Für Rollups ist die On-Chain-Datenveröffentlichung ein wesentlicher Kostenfaktor; durch Datenkompression lassen sich daher die Gebühren für Nutzer reduzieren. + +## Wie funktioniert das Zusammenspiel von ZK-Rollups und Ethereum? ZK-Rollups und Ethereum {#zk-rollups-and-ethereum} + +Eine ZK-Rollup-Chain ist ein Off-Chain-Protokoll, das auf der Ethereum-Blockchain aufbaut und dessen Verwaltung durch On-Chain-Smart-Contracts auf Ethereum erfolgt. ZK-Rollups führen Transaktionen zwar außerhalb des Mainnets aus, schreiben jedoch periodisch Off-Chain-Transaktions-Batches in einen On-Chain-Rollup-Contract. Genau wie die Ethereum-Blockchain ist dieser Transaktionsdatensatz unveränderlich und bildet somit die ZK-Rollup-Chain. + +Die folgenden Komponenten bilden die Kernarchitektur eines ZK-Rollups: + +1. **On-Chain-Verträge**: Wie bereits erwähnt, wird das ZK-Rollup-Protokoll durch Smart Contracts kontrolliert, die auf Ethereum ausgeführt werden. Dies umfasst den Hauptvertrag, welches Rollup-Blöcke speichert, Einlagen nachverfolgt und Zustandsaktualisierungen überwacht. Éin weiterer On-Chain-Contract, der Verifier-Contract, ist für die Verifizierung der von Block Herstellern eingereichten Zero-Knowledge-Proofs zuständig. Daher fungiert Ethereum als Base Layer oder "Layer 1" für den ZK-Rollup. + +2. **Offchain Virtual Machine (VM)**: Während das ZK-Rollup-Protokoll auf Ethereum läuft, finden die Transaktionsausführung und die Zustandsspeicherung auf einer separaten virtuellen Maschine statt, die unabhängig von der [EVM](/developers/docs/evm/) ist. Diese Off-Chain-VM bildet die Ausführungsumgebung für Transaktionen auf dem ZK-Rollup und fungiert gleichzeitig als sekundäre Schicht bzw. "Layer 2" des ZK-Rollup-Protokolls. Auf dem Ethereum Mainnet verifizierte Gültigkeitsnachweise garantieren die Korrektheit der Zustandsübergänge in der Off-Chain-VM. + +ZK-Rollups sind "hybride Skalierungslösungen" - Protokolle, die zwar unabhängig und Off-Chain arbeiten, ihre Sicherheit aber von Ethereum beziehen. Konkret stellt das Ethereum-Netzwerk die Gültigkeit der State-Updates des ZK-Rollups sicher und gewährleistet die Datenverfügbarkeit für jede Aktualisierung des Rollup-States. Daher sind ZK-Rollups erheblich sicherer als reine Offchain-Skalierungslösungen wie [Sidechains](/developers/docs/scaling/sidechains/), die für ihre eigenen Sicherheitseigenschaften verantwortlich sind, oder [Validiums](/developers/docs/scaling/validium/), die Transaktionen auf Ethereum ebenfalls mit Gültigkeitsnachweisen verifizieren, aber die Transaktionsdaten an anderer Stelle speichern. + +ZK-Rollups stützen sich für die folgenden Punkte auf das Ethereum-Hauptprotokoll: + +### Datenverfügbarkeit {#data-availability} + +ZK-Rollups veröffentlichen Statusdaten für jede außerhalb der Kette verarbeitete Transaktion an Ethereum. Mit diesen Daten ist es Einzelpersonen oder Unternehmen möglich, den Status des Rollups zu reproduzieren und die Kette selbst zu validieren. Ethereum stellt diese Daten allen Netzwerkteilnehmern als `calldata` zur Verfügung. + +ZK-Rollups müssen nicht viele Transaktionsdaten in der Kette veröffentlichen, da Gültigkeitsnachweise bereits die Authentizität von Zustandsübergängen überprüfen. Dennoch ist die Speicherung von Daten in der Kette weiterhin wichtig, da sie eine erlaubnislos unabhängige Überprüfung des Zustands der L2-Kette ermöglicht, die es wiederum jedem ermöglicht, Stapel von Transaktionen einzureichen und so böswillige Betreiber daran zu hindern, die Kette zu zensieren oder einzufrieren. + +Damit Benutzer mit dem Rollup interagieren können, ist onchain erforderlich. Ohne Zugriff auf staatliche Daten können Benutzer weder ihren Kontostand abfragen noch Transaktionen (z. B. Abhebungen) einleiten, die auf staatlichen Informationen beruhen. + +### Transaktionsfinalität {#transaction-finality} + +Ethereum fungiert als Abwicklungsebene für ZK-Rollups: L2-Transaktionen werden nur abgeschlossen, wenn der L1-Vertrag den Gültigkeitsnachweis akzeptiert. Dadurch wird das Risiko eliminiert, dass böswillige Betreiber die Kette manipulieren (z. B. Rollup Gelder stehlen), da jede Transaktion im Mainnet genehmigt werden muss. Darüber hinaus garantiert Ethereum, dass Benutzervorgänge nach Abschluss auf L1 nicht mehr rückgängig gemacht werden können. + +### Zensurresistenz {#censorship-resistance} + +Die meisten ZK-Rollups verwenden einen „Superknoten“ (den Operator), um Transaktionen auszuführen, Stapel zu erstellen und Blöcke an L1 zu senden. Dies gewährleistet zwar die Effizienz, erhöht jedoch das Risiko der Zensur: Böswillige ZK-Rollup Betreiber können Benutzer zensieren, indem sie sich weigern, ihre Transaktionen in Stapel aufzunehmen. + +Als Sicherheitsmaßnahme ermöglichen ZK-Rollups den Benutzern, Transaktionen direkt an den Rollup Vertrag im Mainnet zu senden, wenn sie der Meinung sind, dass sie vom Betreiber zensiert werden. Dadurch können Benutzer einen Ausstieg aus dem ZK-Rollup zu Ethereum erzwingen, ohne auf die Erlaubnis des Betreibers angewiesen zu sein. + +## Wie funktionieren ZK-Rollups? {#how-do-zk-rollups-work} + +### Transaktionen {#transactions} + +Benutzer im ZK-Rollup signieren Transaktionen und übermitteln sie an L2-Operatoren zur Verarbeitung und Aufnahme in den nächsten Stapel. In einigen Fällen ist der Operator eine zentralisierte Einheit, ein sogenannter Sequenzer, der Transaktionen ausführt, sie in Stapeln zusammenfasst und an L1 übermittelt. Der Sequenzer in diesem System ist die einzige Entität, die L2-Blöcke erstellen und Rollup Transaktionen zum ZK-Rollup-Vertrag hinzufügen darf. + +Andere ZK-Rollups können die Betreiberrolle durch die Verwendung eines [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/)-Validatoren-Sets rotieren lassen. Potenzielle Betreiber zahlen Geld in den Rollup Vertrag ein, wobei die Höhe jedes Einsatzes die Chancen des Spielers beeinflusst, für die Produktion des nächsten Rollup Batches ausgewählt zu werden. Der Einsatz des Betreibers kann bei böswilligem Handeln drastisch reduziert werden, was ihn dazu anregt, gültige Blöcke zu veröffentlichen. + +#### Wie ZK-Rollups Transaktionsdaten auf Ethereum veröffentlichen {#how-zk-rollups-publish-transaction-data-on-ethereum} + +Wie bereits erklärt, werden Transaktionsdaten als `calldata` auf Ethereum veröffentlicht. `calldata` ist ein Datenbereich in einem Smart Contract, der dazu dient, Argumente an eine Funktion zu übergeben, und verhält sich ähnlich wie der [Speicher](/developers/docs/smart-contracts/anatomy/#memory). `calldata` wird zwar nicht als Teil des Zustands von Ethereum gespeichert, bleibt aber als Teil der [Verlaufsprotokolle](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) der Ethereum-Kette onchain bestehen. `calldata` beeinflusst den Zustand von Ethereum nicht, was es zu einer günstigen Möglichkeit macht, Daten onchain zu speichern. + +Das Schlüsselwort `calldata` identifiziert oft die Smart-Contract-Methode, die von einer Transaktion aufgerufen wird, und enthält Eingaben für die Methode in Form einer beliebigen Byte-Sequenz. ZK-Rollups verwenden `calldata`, um komprimierte Transaktionsdaten onchain zu veröffentlichen. Der Rollup-Betreiber fügt einfach einen neuen Batch hinzu, indem er die erforderliche Funktion im Rollup-Vertrag aufruft und die komprimierten Daten als Funktionsargumente übergibt. Dies trägt zur Kostensenkung für Benutzer bei, da ein großer Teil der Rollup Gebühren für die Speicherung von Transaktionsdaten in der Kette verwendet wird. + +### Zustands-Commitments {#state-commitments} + +Der Zustand des ZK-Rollups, der L2-Konten und -Guthaben umfasst, wird als [Merkle-Baum](/whitepaper/#merkle-trees) dargestellt. Ein kryptografischer Hash der Wurzel des Merkle Baums (Merkle Wurzel) wird im Onchain Vertrag gespeichert, sodass das Rollup Protokoll Änderungen im Status des ZK-Rollups verfolgen kann. + +Das Rollup wechselt nach der Ausführung eines neuen Satzes von Transaktionen in einen neuen Status. Der Betreiber, der den Zustandsübergang initiiert hat, muss eine neue Zustandswurzel berechnen und dem Onchain Vertrag unterwerfen. Wenn der mit dem Stapel verbundene Gültigkeitsnachweis durch den Prüfvertrag authentifiziert wird, wird die neue Merkle Wurzel zur kanonischen Statuswurzel des ZK-Rollups. + +Neben der Berechnung von Zustandswurzeln erstellt der ZK-Rollup Operator auch eine Batch-Wurzel – die Wurzel eines Merkle Baums, der alle Transaktionen in einem Batch umfasst. Wenn ein neuer Stapel übermittelt wird, speichert der Rollup Vertrag die Stapelwurzel, sodass Benutzer nachweisen können, dass eine Transaktion (z. B. eine Auszahlungsanforderung) im Stapel enthalten war. Benutzer müssen Transaktionsdetails, die Batch-Root und einen [Merkle-Beweis](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) vorlegen, der den Inklusionspfad zeigt. + +### Gültigkeitsnachweise {#validity-proofs} + +Die neue Statuswurzel, die der ZK-Rollup Operator an den L1-Vertrag übermittelt, ist das Ergebnis von Aktualisierungen des Rollup Status. Angenommen, Alice sendet 10 Token an Bob. Der Operator verringert einfach Alices Guthaben um 10 und erhöht Bobs Guthaben um 10. Angenommen, Alice sendet 10 Token an Bob. Der Operator verringert einfach Alices Guthaben um 10 und erhöht Bobs Guthaben um 10 + +Der Rollup Vertrag akzeptiert die vorgeschlagene Statusverpflichtung jedoch nicht automatisch, bis der Betreiber nachweist, dass die neue Merkle Wurzel aus korrekten Aktualisierungen des Rollup Status resultiert. Der ZK-Rollup Operator tut dies, indem er einen Gültigkeitsnachweis erstellt, eine prägnante kryptografische Verpflichtung, die die Richtigkeit der gebündelten Transaktionen bestätigt. + +Gültigkeitsbeweise ermöglichen es Parteien, die Richtigkeit einer Aussage zu beweisen, ohne die Aussage selbst offenzulegen – daher werden sie auch als Zero-Knowledge-Beweise bezeichnet. ZK-Rollups verwenden Gültigkeitsnachweise, um die Richtigkeit von Offchain Statusübergängen zu bestätigen, ohne Transaktionen auf Ethereum erneut ausführen zu müssen. Diese Beweise können in Form eines [ZK-SNARK](https://arxiv.org/abs/2202.06877) (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) oder [ZK-STARK](https://eprint.iacr.org/2018/046) (Zero-Knowledge Scalable Transparent Argument of Knowledge) vorliegen. + +Sowohl SNARKs als auch STARKs helfen dabei, die Integrität der Offchain Berechnung in ZK-Rollups zu bestätigen, obwohl jeder Beweistyp unterschiedliche Merkmale aufweist. + +**ZK-SNARKs** + +Damit das ZK-SNARK-Protokoll funktioniert, ist die Erstellung eines Common Reference String (CRS) erforderlich: Der CRS stellt öffentliche Parameter zum Nachweis und zur Überprüfung von Gültigkeitsnachweisen bereit. Die Sicherheit des Nachweissystems hängt von der CRS-Einrichtung ab. Wenn Informationen, die zum Erstellen öffentlicher Parameter verwendet werden, in den Besitz böswilliger Akteure gelangen, können diese möglicherweise falsche Gültigkeitsnachweise erstellen. + +Manche ZK-Rollups versuchen, dieses Problem durch den Einsatz einer [Multi-Party Computation Ceremony (MPC)](https://zkproof.org/2021/06/30/setup-ceremonies/amp/) zu lösen, bei der vertrauenswürdige Personen öffentliche Parameter für den ZK-SNARK-Circuit erzeugen. Um den CRS zu konstruieren, steuert jede Partei einen zufälligen Wert (bekannt als "Toxic Waste") bei, den sie umgehend vernichten muss. + +Trusted Setups kommen zum Einsatz, da sie die Sicherheit des CRS-Setups erhöhen. Wenn auch nur ein einziger ehrlicher Teilnehmer seinen Input zerstört, ist die Sicherheit des ZK-SNARK-Systems gewährleistet. Trotzdem muss man bedenken, dass bei diesen Ansatz vertrauen vorausgesetzt wird, dass die Beteiligten ihre erzeugten Zufallsdaten löschen und die Sicherheitsgarantien des Systems nicht kompromittieren. + +Abgesehen von Vertrauensannahmen sind ZK-SNARKs aufgrund ihrer kleinen Beweisgrößen und der zeitkontinuierlichen Überprüfung beliebt. Da die Beweisüberprüfung auf L1 die größeren Kosten für den Betrieb eines ZK-Rollups darstellt, verwenden L2s ZK-SNARKs, um Beweise zu generieren, die schnell und kostengünstig auf Mainnet überprüft werden können. + +**ZK-STARKs** + +Wie ZK-SNARKs beweisen ZK-STARKs die Gültigkeit von Offchain Berechnungen, ohne die Eingaben preiszugeben. ZK-STARKs gelten jedoch aufgrund ihrer Skalierbarkeit und Transparenz als Verbesserung gegenüber ZK-SNARKs. + +ZK-STARKs sind „transparent“, da sie ohne die vertrauenswürdige Einrichtung eines Common Reference String (CRS) funktionieren können. Stattdessen verlassen sich ZK-STARKs auf öffentlich überprüfbare Zufälligkeit, um Parameter für die Generierung und Überprüfung von Beweisen festzulegen. + +ZK-STARKs bieten auch mehr Skalierbarkeit, da die Zeit, die für den Nachweis und die Überprüfung von Gültigkeitsnachweisen benötigt wird, _quasilinear_ im Verhältnis zur Komplexität der zugrunde liegenden Berechnung ansteigt. Bei ZK-SNARKs skalieren die Beweis- und Verifizierungszeiten _linear_ im Verhältnis zur Größe der zugrunde liegenden Berechnung. Dies bedeutet, dass ZK-STARKs weniger Zeit als ZK-SNARKs zum Nachweis und zur Überprüfung großer Datensätze benötigen, was sie für Anwendungen mit hohem Volumen nützlich macht. + +ZK-STARKs sind auch gegen Quantencomputer sicher, während die in ZK-SNARKs verwendete Elliptical Curve Cryptography (ECC) allgemein als anfällig für Quantencomputerangriffe gilt. Der Nachteil von ZK-STARKs besteht darin, dass sie größere Proof Größen erzeugen, deren Überprüfung auf Ethereum teurer ist. + +#### Wie funktionieren Gültigkeitsnachweise in ZK-Rollups? Gültigkeitsnachweise in ZK-Rollups {#validity-proofs-in-zk-rollups} + +##### Beweiserstellung -Suchen Sie nach einer anfängerfreundlicheren Einführung? Siehe unsere [Einführung in Layer 2](/layer-2/). +Vor der Annahme von Transaktionen führt der Betreiber die üblichen Prüfungen durch. Dazu gehört die Bestätigung, dass: -## Zero-Knowledge Rollups {#zk-rollups} +- Die Absender- und Empfängerkonten sind Teil des Statusbaums. +- Der Absender verfügt über ausreichende Mittel, um die Transaktion abzuwickeln. +- Die Transaktion ist korrekt und stimmt mit dem öffentlichen Schlüssel des Absenders im Rollup überein. +- Der Nonce des Absenders ist korrekt usw. -**Zero-Knowledge-Rollups (ZK-Rollups)** bündeln (oder „rollen") Hunderte von Überweisungen außerhalb der Kette und erzeugen einen kryptographischen Beweis. Diese Beweise können in Form von SNARKs (succinct non-interactive argument of knowledge) oder STARKs (scalable transparent argument of knowledge) vorliegen. SNARKs und STARKs sind als Gültigkeitsnachweise bekannt und werden auf Layer 1 veröffentlicht. +Sobald der ZK Rollup Knoten über genügend Transaktionen verfügt, fasst er diese zu einem Stapel zusammen und kompiliert Eingaben für den Prüfkreis, um daraus einen prägnanten ZK Beweis zu kompilieren. Dazu gehört: -Der ZK-Rollup Smart Contract verwaltet den Status aller Überweisungen auf Layer 2, und dieser Status kann nur mit einem Validitätsnachweis aktualisiert werden. Das bedeutet, dass ZK-Rollups anstelle aller Transaktionsdaten nur den Gültigkeitsnachweis benötigen. Mit einem ZK-Rollup ist die Validierung eines Blocks schneller und kostengünstiger, da weniger Daten enthalten sind. +- Eine Merkle- Baumwurzel, die alle Transaktionen im Stapel umfasst. +- Merkle Beweise für Transaktionen, um die Aufnahme in den Stapel nachzuweisen. +- Merkle Beweise für jedes Sender-Empfänger-Paar in Transaktionen, um zu beweisen, dass diese Konten Teil des Zustandsbaums des Rollups sind. +- Eine Reihe von Zwischenzustandswurzeln, die durch die Aktualisierung der Zustandswurzel nach der Anwendung von Zustandsaktualisierungen für jede Transaktion (d. h. Verringerung der Anzahl der Absenderkonten und Erhöhung der Anzahl der Empfängerkonten) abgeleitet werden. -Bei einem ZK-Rollup gibt es keine Verzögerungen bei der Übertragung von Mitteln von Layer 2 auf Layer 1, da ein vom ZK-Rollup-Vertrag akzeptierter Validitätsnachweis die Mittel bereits verifiziert hat. +Der Prüfschaltkreis berechnet den Gültigkeitsnachweis, indem er jede Transaktion in einer „Schleife“ durchläuft und dieselben Prüfungen durchführt, die der Bediener vor der Verarbeitung der Transaktion durchgeführt hat. Zunächst wird mithilfe des bereitgestellten Merkle Beweises überprüft, ob das Konto des Absenders Teil der vorhandenen Statuswurzel ist. Anschließend reduziert es das Guthaben des Absenders, erhöht dessen Nonce, hash die aktualisierten Kontodaten und kombiniert sie mit dem Merkle Beweis, um eine neue Merkle Wurzel zu generieren. -Da sie sich auf Layer 2 befinden, können ZK-Rollups optimiert werden, um die Transaktionsgröße weiter zu verringern. Zum Beispiel wird ein Konto durch einen Index und nicht durch eine Adresse repräsentiert, wodurch eine Transaktion von 32 Bytes auf nur 4 Bytes reduziert wird. Transaktionen werden auch als `Calldata` in Ethereum geschrieben, um Gas zu sparen. +Seine Merkle Wurzel spiegelt die einzige Änderung im Status des ZK-Rollups wider: eine Änderung des Guthabens und der Nonce des Absenders. Dies ist möglich, weil der Merkle Beweis, der zum Nachweis der Existenz des Kontos verwendet wird, zum Ableiten der neuen Zustandswurzel verwendet wird. -### Vor- und Nachteile {#zk-pros-and-cons} +Der Prüfkreis führt denselben Vorgang auf dem Konto des Empfängers durch. Es prüft, ob das Konto des Empfängers unter der Zwischenzustandswurzel existiert (unter Verwendung des Merkle Beweises), erhöht dessen Guthaben, hasht die Kontodaten erneut und kombiniert sie mit dem Merkle Beweis, um eine neue Zustandswurzel zu generieren.Das Abheben von einem ZK-Rollup auf L1 ist unkompliziert. -| Vorteile | Kontra | -| ----------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -| Schnellere Finalzeit, da der Zustand sofort überprüft wird, sobald die Beweise an die Hauptkette gesendet werden. | Einige haben keine EVM-Unterstützung. | -| Nicht anfällig für wirtschaftliche Angriffe, für die [Optimistische Rollups](#optimistic-pros-and-cons) anfällig sein können. | Die Validitätsnachweise sind rechenintensiv – für Anwendungen mit geringer Aktivität auf der Blockchain nicht sinnvoll. | -| Sicher und dezentralisiert, da die Daten, die zur Wiederherstellung des Zustands benötigt werden, auf der Layer-1-Kette gespeichert sind. | Ein Betreiber kann die Reihenfolge der Transaktionen beeinflussen | +Der Vorgang wird für jede Transaktion wiederholt. Jede „Schleife“ erstellt eine neue Statuswurzel durch Aktualisierung des Kontos des Absenders und eine nachfolgende neue Wurzel durch Aktualisierung des Kontos des Empfängers. Wie erläutert, stellt jede Aktualisierung der Statuswurzel eine Änderung eines Teils des Statusbaums des Rollups dar. -### Eine visuelle Erklärung der ZK-Rollups {#zk-video} +Der ZK-Beweisschaltkreis durchläuft den gesamten Transaktionsstapel und überprüft die Abfolge der Aktualisierungen, die nach Ausführung der letzten Transaktion zu einer endgültigen Zustandswurzel führen. Die zuletzt berechnete Merkle Wurzel wird zur neuesten kanonischen Zustandswurzel des ZK-Rollups. + +##### Nachweisprüfung + +Nachdem der Prüfkreis die Richtigkeit der Statusaktualisierungen überprüft hat, übermittelt der L2-Operator den berechneten Gültigkeitsnachweis an den Prüfvertrag auf L1. Der Verifizierungszeite des Vertrags überprüft die Gültigkeit des Beweises und prüft auch öffentliche Eingaben, die Teil des Beweises sind: + +- **Pre-State-Root**: Der alte State-Root des ZK-Rollups (d. h. vor der Ausführung der gebatchten Transaktionen), der den letzten bekannten gültigen Zustand der L2-Kette widerspiegelt. + +- **Post-State-Root**: Der neue State-Root des ZK-Rollups (d. h. nach der Ausführung der gebatchten Transaktionen), der den neuesten Zustand der L2-Kette widerspiegelt. Die Post State Wurzel ist die endgültige Wurzel, die nach dem Anwenden von Zustandsaktualisierungen im Prüfschaltkreis abgeleitet wird. + +- **Batch-Root**: Der Merkle-Root des Batches, der durch das _Merklisieren_ von Transaktionen im Batch und das Hashen des Baum-Roots abgeleitet wird. + +- **Transaktionseingaben**: Daten, die mit den Transaktionen verbunden sind, die als Teil des übermittelten Batches ausgeführt werden. + +Wenn der Beweis den Schaltkreis erfüllt (d. h. gültig ist), bedeutet dies, dass eine Folge gültiger Transaktionen vorhanden ist, die das Rollup vom vorherigen Zustand (kryptografisch durch die Vorzustandswurzel gekennzeichnet) in einen neuen Zustand (kryptografisch durch die Nachzustandswurzel gekennzeichnet) überführen. Wenn die Wurzel vor dem Status mit der im Rollup Vertrag gespeicherten Wurzel übereinstimmt und der Beweis gültig ist, übernimmt der Rollup Vertrag die Wurzel nach dem Status aus dem Beweis und aktualisiert seinen Statusbaum, um den geänderten Status des Rollups widerzuspiegeln. + +### Ein- und Austritte {#entries-and-exits} + +Benutzer nehmen am ZK-Rollup teil, indem sie Token im Rollup Vertrag hinterlegen, der auf der L1-Kette bereitgestellt wird. Diese Transaktion wird in die Warteschlange gestellt, da nur Betreiber Transaktionen an den Rollup Vertrag übermitteln können. + +Wenn sich die Warteschlange für ausstehende Einzahlungen zu füllen beginnt, nimmt der ZK Rollup Betreiber die Einzahlungstransaktionen entgegen und übermittelt sie an den Rollup- Vertrag. Sobald sich die Gelder des Benutzers im Rollup befinden, kann er mit der Transaktion beginnen, indem er Transaktionen zur Verarbeitung an den Betreiber sendet. Benutzer können Guthaben auf dem Rollup überprüfen, indem sie ihre Kontodaten hashen, den Hash an den Rollup-Vertrag senden und einen Merkle-Nachweis bereitstellen, um ihn mit der aktuellen Statuswurzel zu vergleichen. + +Das Abheben von einem ZK-Rollup auf L1 ist unkompliziert. Der Benutzer leitet die Exit Transaktion ein, indem er seine Vermögenswerte auf dem Rollup zum Verbrennen an ein angegebenes Konto sendet. Wenn der Betreiber die Transaktion in den nächsten Stapel aufnimmt, kann der Benutzer eine Auszahlungsanforderung an den Onchain Vertrag senden. Dieser Auszahlungsantrag muss Folgendes enthalten: + +- Merkle Beweis, der die Einbeziehung der Transaktion des Benutzers in das Burn Konto in einem Transaktionsstapel belegt + +- Transaktionsdaten + +- Batch Root + +- L1-Adresse zum Empfangen eingezahlter Gelder + +Der Rollup Vertrag hasht die Transaktionsdaten, prüft, ob die Batch-Root vorhanden ist, und verwendet den Merkle Beweis, um zu prüfen, ob der Transaktions Hash Teil der Batch Root ist. Anschließend führt der Vertrag die Exit-Transaktion aus und sendet Gelder an die vom Benutzer gewählte Adresse auf L1. + +## ZK-Rollups und EVM-Kompatibilität {#zk-rollups-and-evm-compatibility} + +Im Gegensatz zu Optimistic Rollups sind ZK-Rollups nicht ohne Weiteres mit der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) kompatibel. Der Nachweis allgemeiner EVM Berechnungen in Schaltkreisen ist schwieriger und ressourcenintensiver als der Nachweis einfacher Berechnungen (wie der zuvor beschriebenen Token Übertragung). + +Allerdings wecken [Fortschritte in der Zero-Knowledge-Technologie](https://hackmd.io/@yezhang/S1_KMMbGt#Why-possible-now) erneut das Interesse daran, EVM-Berechnungen in Zero-Knowledge-Beweise zu verpacken. Diese Bemühungen zielen darauf ab, eine Zero Knowledge EVM Implementierung (zkEVM) zu erstellen, die die Richtigkeit der Programmausführung effizient überprüfen kann. Ein zkEVM erstellt vorhandene EVM Opcodes zum Nachweis/zur Verifizierung in Schaltkreisen neu und ermöglicht so die Ausführung intelligenter Verträge. + +Wie das EVM wechselt ein zkEVM zwischen Zuständen, nachdem Berechnungen an einigen Eingaben durchgeführt wurden. Der Unterschied besteht darin, dass zkEVM auch Zero Knowledge Beweise erstellt, um die Richtigkeit jedes Schritts bei der Programmausführung zu überprüfen. Gültigkeitsnachweise könnten die Richtigkeit von Operationen überprüfen, die den Zustand der VM (Speicher, Stapel, Speicher) und die Berechnung selbst betreffen (d. h. hat die Operation die richtigen Opcodes aufgerufen und sie korrekt ausgeführt?). + +Die Einführung EVM kompatibler ZK-Rollups soll Entwicklern helfen, die Skalierbarkeit und Sicherheitsgarantien von Zero Knowledge Proof zu nutzen. Noch wichtiger ist, dass Entwickler durch die Kompatibilität mit der nativen Ethereum Infrastruktur ZK freundliche Dapp mit vertrauten (und praxiserprobten) Tools und Sprachen erstellen können. + +## Wie funktionieren ZK-Rollup Gebühren? {#how-do-zk-rollup-fees-work} + +Wie viel Benutzer für Transaktionen auf ZK Rollups zahlen, hängt von der Gasgebühr ab, genau wie beim Ethereum Mainnet. Die Gasgebühren funktionieren auf L2 jedoch anders und werden von den folgenden Kosten beeinflusst: + +1. **Schreiben in den Zustand**: Für das Schreiben in den Zustand von Ethereum (d. h. das Senden einer Transaktion auf der Ethereum-Blockchain) fallen feste Kosten an. ZK-Rollups reduzieren diese Kosten, indem sie Transaktionen bündeln und die Fixkosten auf mehrere Benutzer verteilen. + +2. **Datenveröffentlichung**: ZK-Rollups veröffentlichen Zustandsdaten für jede Transaktion als `calldata` auf Ethereum. Die `calldata`-Kosten werden derzeit durch [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) geregelt, das Kosten von 16 Gas für Nicht-Null-Bytes bzw. 4 Gas für Null-Bytes von `calldata` vorschreibt. Die Kosten für die einzelne Transaktion hängen davon ab, wie viel `calldata` dafür onchain veröffentlicht werden muss. + +3. **L2-Betreibergebühren**: Dies ist der Betrag, der an den Rollup-Betreiber als Ausgleich für die Rechenkosten gezahlt wird, die bei der Verarbeitung von Transaktionen anfallen, ähnlich den [Transaktions-"Prioritätsgebühren (Trinkgelder)"](/developers/docs/gas/#how-are-gas-fees-calculated) auf dem Ethereum Mainnet. + +4. **Beweiserstellung und -verifizierung**: ZK-Rollup-Betreiber müssen Gültigkeitsnachweise für Transaktions-Batches erstellen, was ressourcenintensiv ist. Die Überprüfung von Zero-Knowledge-Beweisen im Mainnet kostet ebenfalls Gas (~ 500.000 Gas). + +Neben der Bündelung von Transaktionen reduzieren ZK Rollups die Gebühren für Benutzer durch die Komprimierung von Transaktionsdaten. Sie können [sich eine Echtzeitübersicht](https://l2fees.info/) darüber ansehen, was die Nutzung von Ethereum-ZK-Rollups kostet. + +## Wie skalieren ZK-Rollups Ethereum? Skalierung von Ethereum mit ZK-Rollups {#scaling-ethereum-with-zk-rollups} + +### Komprimierung von Transaktionsdaten {#transaction-data-compression} + +ZK Rollups erweitern den Durchsatz auf der Basisschicht von Ethereum, indem sie Berechnungen außerhalb der Kette durchführen. Der eigentliche Schub für die Skalierung kommt jedoch durch die Komprimierung der Transaktionsdaten. Die [Blockgröße](/developers/docs/blocks/#block-size) von Ethereum begrenzt die Datenmenge, die jeder Block enthalten kann, und damit auch die Anzahl der pro Block verarbeiteten Transaktionen. Durch die Komprimierung Transaktion bezogener Daten erhöhen ZK Rollups die Anzahl der pro Block verarbeiteten Transaktionen erheblich. + +ZK Rollups können Transaktionsdaten besser komprimieren als optimistische Rollups, da sie nicht alle zur Validierung jeder Transaktion erforderlichen Daten veröffentlichen müssen. Sie müssen nur die minimal erforderlichen Daten veröffentlichen, um den aktuellen Stand der Konten und Salden im Rollup wiederherzustellen. + +### Rekursive Proofs {#recursive-proofs} + +Ein Vorteil von Zero Knowledge-Beweisen besteht darin, dass Beweise andere Beweise verifizieren können. Beispielsweise kann ein einzelner ZK-SNARK andere ZK-SNARKs verifizieren. Solche „Proof of Proof“ werden als rekursive Proof bezeichnet und erhöhen den Durchsatz bei ZK-Rollups dramatisch. + +Derzeit werden Gültigkeitsnachweise Block für Block generiert und zur Überprüfung an den L1-Vertrag übermittelt. Die Überprüfung einzelner Blocknachweise begrenzt jedoch den Durchsatz, den ZK-Rollups erreichen können, da nur ein Block abgeschlossen werden kann, wenn der Betreiber einen Nachweis einreicht. + +Rekursive Beweise ermöglichen es jedoch, mehrere Blöcke mit einem Gültigkeitsnachweis abzuschließen. Dies liegt daran, dass der Beweisschaltkreis mehrere Blockbeweise rekursiv aggregiert, bis ein endgültiger Beweis erstellt ist. Der L2-Operator übermittelt diesen rekursiven Beweis, und wenn der Vertrag ihn akzeptiert, werden alle relevanten Blöcke sofort abgeschlossen. Mit rekursiven Beweisen erhöht sich die Anzahl der ZK-Rollup Transaktionen, die in Intervallen auf Ethereum abgeschlossen werden können. + +### Vor- und Nachteile von ZK-Rollups {#zk-rollups-pros-and-cons} + +| Pro | Nachteile | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Gültigkeitsnachweise stellen die Richtigkeit von Offchain Transaktionen sicher und verhindern, dass Betreiber ungültige Zustandsübergänge ausführen. | Die Kosten für die Berechnung und Überprüfung von Gültigkeitsnachweisen sind erheblich und können die Gebühren für Rollup Benutzer erhöhen. | +| Bietet eine schnellere Transaktionsendgültigkeit, da Statusaktualisierungen genehmigt werden, sobald die Gültigkeitsnachweise auf L1 überprüft wurden. | Aufgrund der Komplexität der Zero Knowledge-Technologie ist die Erstellung EVM kompatibler ZK-Rollups schwierig. | +| Baut zur Sicherheit auf vertrauenslose kryptografische Mechanismen, nicht auf die Ehrlichkeit von Akteuren mit Anreizen wie bei [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/#optimistic-pros-and-cons). | Für die Erstellung von Gültigkeitsnachweisen ist spezielle Hardware erforderlich, was eine zentrale Kontrolle der Kette durch einige wenige Parteien begünstigen kann. | +| Für die Erstellung von Gültigkeitsnachweisen ist spezielle Hardware erforderlich, was eine zentrale Kontrolle der Kette durch einige wenige Parteien begünstigen kann. | Zentralisierte Operatoren (Sequenzer) können die Reihenfolge der Transaktionen beeinflussen. | +| Zentralisierte Operatoren (Sequenzer) können die Reihenfolge der Transaktionen beeinflussen. | Durch die Hardwareanforderungen kann die Anzahl der Teilnehmer verringert werden, die die Kette zum Fortschreiten zwingen können. Dadurch erhöht sich das Risiko, dass böswillige Betreiber den Status des Rollups einfrieren und Benutzer zensieren. | +| Hängt nicht von Annahmen zur Lebendigkeit ab und Benutzer müssen die Kette nicht validieren, um ihre Gelder zu schützen. | Einige Prüfsysteme (z. B. ZK-SNARK) erfordern eine vertrauenswürdige Einrichtung, die bei unsachgemäßer Handhabung möglicherweise das Sicherheitsmodell eines ZK-Rollups gefährden könnte. | +| Eine bessere Datenkomprimierung kann dazu beitragen, die Kosten für die Veröffentlichung von `calldata` auf Ethereum zu senken und die Rollup-Gebühren für Benutzer zu minimieren. | | + +### Eine visuelle Erklärung von ZK-Rollups {#zk-video} Sehen Sie, wie Finematics ZK-Rollups erklärt: -**ZK-Rollups verstehen** +## Wer arbeitet an einem zkEVM? zkEVM-Projekte {#zkevm-projects} + +Zu den Projekten, die an zkEVMs arbeiten, gehören: + +- **[zkEVM](https://github.com/privacy-scaling-explorations/zkevm-specs)** - _zkEVM ist ein von der Ethereum Foundation finanziertes Projekt zur Entwicklung eines EVM-kompatiblen ZK-Rollups und eines Mechanismus zur Erzeugung von Gültigkeitsnachweisen für Ethereum-Blöcke._ + +- **[Polygon zkEVM](https://polygon.technology/solutions/polygon-zkevm)** - _ist ein dezentraler ZK-Rollup auf dem Ethereum Mainnet, der auf einer Zero-Knowledge Ethereum Virtual Machine (zkEVM) arbeitet, die Ethereum-Transaktionen auf transparente Weise ausführt, einschließlich Smart Contracts mit Zero-Knowledge-Proof-Validierungen._ + +- **[Scroll](https://scroll.io/blog/zkEVM)** - _Scroll ist ein technologieorientiertes Unternehmen, das an der Entwicklung einer nativen zkEVM Layer-2-Lösung für Ethereum arbeitet._ + +- **[Taiko](https://taiko.xyz)** - _Taiko ist ein dezentralisierter, Ethereum-äquivalenter ZK-Rollup (ein [Typ 1 ZK-EVM](https://vitalik.eth.limo/general/2022/08/04/zkevm.html))._ + +- **[ZKsync](https://docs.zksync.io/)** - _ZKsync Era ist ein EVM-kompatibler ZK-Rollup, der von Matter Labs entwickelt wurde und von seinem eigenen zkEVM angetrieben wird._ + +- **[Starknet](https://starkware.co/starknet/)** - _StarkNet ist eine EVM-kompatible Layer-2-Skalierungslösung, die von StarkWare entwickelt wurde._ + +- **[Morph](https://www.morphl2.io/)** - _Morph ist eine hybride Rollup-Skalierungslösung, die ZK-Beweise nutzt, um das Problem der Layer-2-Zustandsherausforderung zu lösen._ + +- **[Linea](https://linea.build)** - _Linea ist eine Ethereum-äquivalente zkEVM Layer 2, die von Consensys entwickelt wurde und vollständig auf das Ethereum-Ökosystem ausgerichtet ist._ + +## Weiterführende Lektüre zu ZK-Rollups {#further-reading-on-zk-rollups} -- [Was sind Zero-Knowledge Rollups?](https://coinmarketcap.com/alexandria/glossary/zero-knowledge-rollups) -- [STARKs gegen SNARKs](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/) +- [Was sind Zero-Knowledge-Rollups?](https://coinmarketcap.com/alexandria/glossary/zero-knowledge-rollups) +- [Was sind Zero-Knowledge-Rollups?](https://alchemy.com/blog/zero-knowledge-rollups) +- [Der praktische Leitfaden für Ethereum Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) +- [STARKs vs. SNARKs](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/) +- [Was ist ein zkEVM?](https://www.alchemy.com/overviews/zkevm) +- [ZK-EVM-Typen: Ethereum-äquivalent, EVM-äquivalent, Typ 1, Typ 4 und andere kryptische Schlagwörter](https://taiko.mirror.xyz/j6KgY8zbGTlTnHRFGW6ZLVPuT0IV0_KmgowgStpA0K4) +- [Einführung in zkEVM](https://hackmd.io/@yezhang/S1_KMMbGt) +- [Was sind ZK-EVM L2s?](https://linea.mirror.xyz/qD18IaQ4BROn_Y40EBMTUTdJHYghUtdECscSWyMvm8M) +- [Tolle zkEVM-Ressourcen](https://github.com/LuozhuZhang/awesome-zkevm) +- [ZK-SNARKS unter der Haube](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html) +- [Wie sind SNARKs möglich?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) diff --git a/public/content/translations/de/developers/docs/smart-contracts/anatomy/index.md b/public/content/translations/de/developers/docs/smart-contracts/anatomy/index.md index 5c9810ba5af..9c397cf0aa8 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/anatomy/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/anatomy/index.md @@ -1,6 +1,6 @@ --- title: Anatomie von Smart Contracts -description: 'Ein tiefgreifender Einblick in die Anatomie eines Smart Contracts: Funktionen, Daten und Variablen' +description: "Ein tiefgreifender Einblick in die Anatomie eines Smart Contracts: Funktionen, Daten und Variablen" lang: de --- @@ -8,20 +8,20 @@ Ein Smart Contract ist ein Programm, das auf einer Adresse auf Ethereum läuft. ## Voraussetzungen {#prerequisites} -Sie sollten sich bereits mit [Smart Contracts](/developers/docs/smart-contracts/) vertraut gemacht haben. Die Informationen in diesem Dokument sind für Personen gedacht, die bereits mit Programmiersprachen wie JavaScript oder Python vertraut sind. +Stellen Sie sicher, dass Sie sich zuerst über [Smart Contracts](/developers/docs/smart-contracts/) informiert haben. Die Informationen in diesem Dokument sind für Personen gedacht, die bereits mit Programmiersprachen wie JavaScript oder Python vertraut sind. ## Daten {#data} -Alle Vertragsdaten müssen einem Ort zugewiesen werden: entweder zu `storage` oder `memory`. Speicher in einem Smart Contract zu ändern ist ein kostenintensiver Prozess. Daher sollten Sie sich überlegen, wo Ihre Daten gespeichert werden sollen. +Alle Vertragsdaten müssen einem Ort zugewiesen werden: entweder `storage` oder `memory`. Speicher in einem Smart Contract zu ändern ist ein kostenintensiver Prozess. Daher sollten Sie sich überlegen, wo Ihre Daten gespeichert werden sollen. ### Speicher {#storage} Gleichbleibende Daten werden als Speicher oder Storage bezeichnet und über Zustandsvariablen dargestellt. Solche Daten werden dauerhaft auf der Blockchain gespeichert. Sie müssen den Typ deklarieren, damit der Contract beim Kompilieren verfolgen kann, wie viel Speicherplatz er auf der Blockchain benötigt. ```solidity -// Solidity example +// Solidity-Beispiel contract SimpleStorage { - uint storedData; // State variable + uint storedData; // Zustandsvariable // ... } ``` @@ -31,9 +31,9 @@ contract SimpleStorage { storedData: int128 ``` -Wenn Sie bereits Erfahrung im Programmieren in objektorientierten Sprachen haben, werden Sie wahrscheinlich mit den meisten Typen vertraut sein. Allerdings sollte `address` neu für Sie sein, wenn Sie noch keine Erfahrung in der Ethereum-Entwicklung haben. +Wenn Sie bereits Erfahrung im Programmieren in objektorientierten Sprachen haben, werden Sie wahrscheinlich mit den meisten Typen vertraut sein. Allerdings sollte Ihnen `address` neu sein, wenn Sie neu in der Ethereum-Entwicklung sind. -Ein `adress`-Typ kann eine Ethereum-Adresse aufnehmen, was 20 Byte oder 160 Bit entspricht. Die Ausgabe erfolgt in hexadezimaler Schreibweise mit einem führenden 0x. +Ein `address`-Typ kann eine Ethereum-Adresse aufnehmen, was 20 Bytes oder 160 Bits entspricht. Die Ausgabe erfolgt in hexadezimaler Schreibweise mit einem führenden 0x. Andere Typen umfassen: @@ -42,21 +42,21 @@ Andere Typen umfassen: - Festkommazahlen - Byte-Arrays mit fester Größe - Byte-Arrays mit dynamischer Größe -- Rationale und ganzzahlige Literale +- rationale und ganzzahlige Literale - Zeichenfolgenliterale -- Hexadezimale Literale -- Enumerationen +- hexadezimale Literale +- Enums Weitere Erklärungen finden Sie in folgender Dokumentation: -- [Vyper-Typen anzeigen](https://vyper.readthedocs.io/en/v0.1.0-beta.6/types.html#value-types) -- [Solidity-Typen anzeigen](https://solidity.readthedocs.io/en/latest/types.html#value-types) +- [Siehe Vyper-Typen](https://docs.vyperlang.org/en/v0.1.0-beta.6/types.html#value-types) +- [Siehe Solidity-Typen](https://docs.soliditylang.org/en/latest/types.html#value-types) ### Speicher {#memory} Werte, die nur für die Lebensdauer der Ausführung einer Vertragsfunktion gespeichert werden, werden als Memory Variables (Speichervariablen) bezeichnet. Da diese nicht dauerhaft auf der Blockchain gespeichert werden, sind sie wesentlich preiswerter. -Erfahren Sie mehr darüber, wie die EVM Daten speichert (Aufbewahrung, Speicher und Stack), in den [Solidity-Dokumenten](https://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html?highlight=memory#storage-memory-and-the-stack). +Erfahren Sie in den [Solidity-Dokumenten](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#storage-memory-and-the-stack) mehr darüber, wie die EVM Daten speichert (Storage, Memory und der Stack). ### Umgebungsvariablen {#environment-variables} @@ -64,9 +64,9 @@ Zusätzlich zu den Variablen, die Sie in Ihrem Vertrag definieren, gibt es einig Beispiele: -| **Eigenschaft** | **Statusvariable** | **Beschreibung** | -| ----------------- | ------------------ | ----------------------------------------- | -| `block.timestamp` | uint256 | Aktueller Zeitstempel der Block-Epoche | +| **Eigenschaft** | **Statusvariable** | **Beschreibung** | +| ----------------- | ------------------ | ------------------------------------------------------------ | +| `block.timestamp` | uint256 | Aktueller Zeitstempel der Block-Epoche | | `msg.sender` | address | Absender der Nachricht (aktueller Aufruf) | ## Funktionen {#functions} @@ -75,15 +75,15 @@ Vereinfacht gesagt können Funktionen als Antwort auf eingehende Transaktionen I Es gibt zwei Arten von Functionsaufrufen: -- `internal` – diese erstellen keinen EVM-Aufruf - - Auf interne Funktionen und Zustandsvariablen kann nur intern zugegriffen werden (d. h. innerhalb des aktuellen Vertrags oder von ihm abgeleiteter Verträge). +- `internal` – diese erzeugen keinen EVM-Aufruf + - Auf interne Funktionen und Zustandsvariablen kann nur intern zugegriffen werden (d. h. aus dem aktuellen Vertrag oder von ihm abgeleiteten Verträgen) - `external` – diese erzeugen einen EVM-Aufruf - - Externe Funktionen sind Teil der Vertragsschnittstelle. Das bedeutet, dass sie aus anderen Verträgen und über Transaktionen aufgerufen werden können. Eine externe Funktion `f` kann nicht intern aufgerufen werden (z. B. `f()` funktioniert nicht, aber `this.f()` funktioniert). + - Externe Funktionen sind Teil der Vertragsschnittstelle. Das bedeutet, dass sie aus anderen Verträgen und über Transaktionen aufgerufen werden können. Eine externe Funktion `f` kann nicht intern aufgerufen werden (d. h. `f()` funktioniert nicht, aber `this.f()` funktioniert). Sie können auch `public` oder `private` sein -- `public`-Funktionen können intern aus dem Vertrag oder extern über Nachrichten aufgerufen werden. -- `private`-Funktionen sind nur für den Vertrag sichtbar, in dem sie definiert sind, und nicht in abgeleiteten Verträgen. +- `public`-Funktionen können intern aus dem Vertrag heraus oder extern über Nachrichten aufgerufen werden +- `private`-Funktionen sind nur für den Vertrag sichtbar, in dem sie definiert sind, und nicht in abgeleiteten Verträgen Sowohl Funktionen als auch Statusvariablen können öffentlich oder privat gemacht werden. @@ -96,11 +96,11 @@ function update_name(string value) public { } ``` -- Der Parameter `value` des Typs `string` wird an die Funktion `update_name` übergeben. -- Es wird `public` deklariert. Das bedeutet, dass jeder darauf zugreifen kann. -- `view` wird nicht deklariert, damit eine Änderung des Vertragsstatus möglich ist. +- Der Parameter `value` vom Typ `string` wird an die Funktion übergeben: `update_name` +- Sie ist als `public` deklariert, was bedeutet, dass jeder darauf zugreifen kann +- Sie ist nicht als `view` deklariert, sodass sie den Vertragszustand ändern kann -### Ansicht-Funktionen {#view-functions} +### View-Funktionen {#view-functions} Diese Funktionen verpflichten sich, den Zustand der Vertragsdaten nicht zu ändern. Gängige Beispiele sind "Getter"-Funktionen, mit denen Sie z. B. den Kontostand eines Benutzers abfragen können. @@ -123,27 +123,27 @@ def readName() -> string: Folgende Vorgänge werden als Modifikation des Zustands angesehen: 1. In Zustandsvariablen schreiben -2. [Ereignisse ausgeben](https://solidity.readthedocs.io/en/v0.7.0/contracts.html#events) -3. [Weitere Verträge erstellen](https://solidity.readthedocs.io/en/v0.7.0/control-structures.html#creating-contracts) -4. `selfdestruct` verwenden +2. [Auslösen von Ereignissen](https://docs.soliditylang.org/en/v0.7.0/contracts.html#events). +3. [Erstellen anderer Verträge](https://docs.soliditylang.org/en/v0.7.0/control-structures.html#creating-contracts). +4. Verwenden von `selfdestruct`. 5. Ether über Aufrufe senden -6. Eine Funktion aufrufen, die nicht mit `view` oder `pure` markiert ist +6. Aufrufen von Funktionen, die nicht als `view` oder `pure` markiert sind. 7. Low-Level-Aufrufe verwenden 8. Inline-Assembly verwenden, die bestimmte Opcodes enthält -### Konstruktorfunktionen {#constructor-functions} +### Konstruktor-Funktionen {#constructor-functions} -`constructor`-Funktionen werden nur einmal ausgeführt, wenn der Vertrag in die Blockchain integriert wird. In vielen klassenbasierten Programmiersprachen initialisieren diese Funktionen wie `constructor` oft Zustandsvariablen auf ihre angegebenen Werte. +`constructor`-Funktionen werden nur einmal ausgeführt, wenn der Vertrag zum ersten Mal bereitgestellt wird. Ähnlich wie der `constructor` in vielen klassenbasierten Programmiersprachen initialisieren diese Funktionen oft Zustandsvariablen mit ihren angegebenen Werten. ```solidity -// Solidity example -// Initializes the contract's data, setting the `owner` -// to the address of the contract creator. +// Solidity-Beispiel +// Initialisiert die Vertragsdaten und setzt den `owner` +// auf die Adresse des Vertragserstellers. constructor() public { - // All smart contracts rely on external transactions to trigger its functions. - // `msg` is a global variable that includes relevant data on the given transaction, - // such as the address of the sender and the ETH value included in the transaction. - // Learn more: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties + // Alle Smart Contracts sind auf externe Transaktionen angewiesen, um ihre Funktionen auszulösen. + // `msg` ist eine globale Variable, die relevante Daten über die jeweilige Transaktion enthält, + // wie z. B. die Adresse des Absenders und den in der Transaktion enthaltenen ETH-Wert. + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties owner = msg.sender; } ``` @@ -167,7 +167,7 @@ Zusätzlich zu den Variablen, die Sie in Ihrem Vertrag definieren, gibt es einig Diese erlauben es Smart Contracts, ETH an andere Konten zu senden. -## Funktionen schreiben {#writing-functions} +## Schreiben von Funktionen {#writing-functions} Ihre Funktion benötigt folgende Elemente: @@ -182,24 +182,24 @@ pragma solidity >=0.4.0 <=0.6.0; contract ExampleDapp { string dapp_name; // Zustandsvariable - // Wird aufgerufen, wenn der Vertrag bereitgestellt wird und initialisiert den Wert + // Wird aufgerufen, wenn der Vertrag bereitgestellt wird, und initialisiert den Wert constructor() public { dapp_name = "Meine Beispiel-Dapp"; } - // Funktion holen + // Get-Funktion function read_name() public view returns(string) { return dapp_name; } - // Funktion setzen + // Set-Funktion function update_name(string value) public { dapp_name = value; } } ``` -Ein vollständiger Smart Contract könnte so aussehen. Hier stellt die `constructor`-Funktion einen Anfangswert für die `dapp_name` -Variable bereit. +Ein vollständiger Smart Contract könnte so aussehen. Hier liefert die `constructor`-Funktion einen Anfangswert für die Variable `dapp_name`. ## Ereignisse und Protokolle {#events-and-logs} @@ -207,39 +207,39 @@ Ereignisse ermöglichen es Ihrem Smart Contract, mit Ihrem Frontend oder anderen ## Kommentierte Beispiele {#annotated-examples} -Das sind einige Beispiele in Solidity. Wenn Sie mit dem Code spielen möchten, können Sie mit ihm in [Remix](http://remix.ethereum.org) interagieren. +Das sind einige Beispiele in Solidity. Wenn Sie mit dem Code experimentieren möchten, können Sie in [Remix](http://remix.ethereum.org) mit ihnen interagieren. -### Hello world {#hello-world} +### Hallo Welt {#hello-world} ```solidity -// Bestimmt die Version von Solidity mit semantischer Versionierung. -// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +// Gibt die Version von Solidity an und verwendet die semantische Versionierung. +// Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma pragma solidity ^0.5.10; -// Defines a contract named `HelloWorld`. -// Ein Smart contract ist eine Sammlung von Funktionen und Daten (sein Zustand). -// Einmal in die Blockchain integriert, befindet sich ein Contract an einer bestimmten Adresse der Ethereum-Blockchain. -// Erfahre mehr: https://solidity.readthedocs.io/de/v0.5.10/structure-of-a-contract.html +// Definiert einen Vertrag mit dem Namen `HelloWorld`. +// Ein Vertrag ist eine Sammlung von Funktionen und Daten (seinem Zustand). +// Nach der Bereitstellung befindet sich ein Vertrag an einer bestimmten Adresse auf der Ethereum-Blockchain. +// Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html contract HelloWorld { // Deklariert eine Zustandsvariable `message` vom Typ `string`. - // Zustandsvariablen sind Variablen, deren Werte dauerhaft im Vertragsspeicher hinterlegt werden. - // Das Schlüsselwort `public` macht Variablen von außerhalb eines Contracts - // zugänglich und erzeugt eine Funktion, die andere Contracts oder Clients aufrufen können, um auf den Wert zuzugreifen. + // Zustandsvariablen sind Variablen, deren Werte dauerhaft im Vertragsspeicher gespeichert werden. + // Das Schlüsselwort `public` macht Variablen von außerhalb eines Vertrags zugänglich + // und erstellt eine Funktion, die andere Verträge oder Clients aufrufen können, um auf den Wert zuzugreifen. string public message; - // Ähnlich wie viele Klassen-basierte objektorientierte Sprachen, ist ein Konstruktor - // eine spezielle Funktion, die nur bei der Vertragserstellung ausgeführt wird. - // Konstruktoren werden verwendet, um die Vertragsdaten zu initialisieren. - // Erfahre mehr: https://solidity.readthedocs.io/de/v0.5.10/contracts. tml#constructors + // Ähnlich wie in vielen klassenbasierten objektorientierten Sprachen ist ein Konstruktor + // eine spezielle Funktion, die nur bei der Erstellung des Vertrags ausgeführt wird. + // Konstruktoren werden verwendet, um die Daten des Vertrags zu initialisieren. + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors constructor(string memory initMessage) public { - // Akzeptiert ein String Argument `initMessage` und setzt den Wert - // in die `message` Speichervariable des Contracts). + // Akzeptiert ein Zeichenfolgen-Argument `initMessage` und setzt den Wert + // in die `message`-Speichervariable des Vertrags). message = initMessage; } - // Eine öffentliche Funktion, die ein String-Argument akzeptiert - // und die Speichervariable `message` aktualisiert. + // Eine öffentliche Funktion, die ein Zeichenfolgen-Argument akzeptiert + // und die `message`-Speichervariable aktualisiert. function update(string memory newMessage) public { message = newMessage; } @@ -252,136 +252,136 @@ contract HelloWorld { pragma solidity ^0.5.10; contract Token { - // Eine `Adresse` ist mit einer E-Mail-Adresse vergleichbar - sie wird verwendet, um ein Konto auf Ethereum zu identifizieren. - // Adressen können einen Smart Contract oder ein externes (Benutzer) Konto darstellen. - // Erfahre mehr: https://solidity.readthedocs.io/en/v0.5.10/types.html#address + // Eine `address` ist mit einer E-Mail-Adresse vergleichbar – sie wird verwendet, um ein Konto auf Ethereum zu identifizieren. + // Adressen können einen Smart Contract oder externe (Benutzer-)Konten darstellen. + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/types.html#address address public owner; - // Ein `mapping` ist im Wesentlichen eine Hashtabellen-Datenstruktur. - // Dieses `mapping` weist einer Adresse (dem Token-Halter) ein nicht signiertes Integer (dem Token-Halter) zu. - // Erfahre mehr: https://solidity.readthedocs.io/en/v0.5.10/types.html#mapping-types + // Ein `mapping` ist im Wesentlichen eine Hash-Tabellen-Datenstruktur. + // Dieses `mapping` weist einer Adresse (dem Token-Inhaber) eine vorzeichenlose Ganzzahl (das Token-Guthaben) zu. + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/types.html#mapping-types mapping (address => uint) public balances; - // Events ermöglichen die Protokollierung von Aktivitäten auf der Blockchain. - // Ethereum Clients können auf Events hören, um auf Änderungen des Contract-Zustands zu reagieren. - // Erfahre mehr: https://solidity.readthedocs.io/de/v0.5.10/contracts. tml#Events + // Ereignisse ermöglichen die Protokollierung von Aktivitäten auf der Blockchain. + // Ethereum-Clients können auf Ereignisse lauschen, um auf Änderungen des Vertragszustands zu reagieren. + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#events event Transfer(address from, address to, uint amount); // Initialisiert die Vertragsdaten und setzt den `owner` - // auf die Adresse des Contract-Erstellers. + // auf die Adresse des Vertragserstellers. constructor() public { - // Alle Smart Contracts benötigen externe Transaktionen, um Funktionen auszuführen. - // `msg` ist eine globale Variable, die relevante Daten der gegebenen Transaktion enthält, - // wie die Adresse des Senders und der in der Transaktion enthaltene ETH Wert. - // Mehr erfahren: https://solidity.readthedocs.io/de/v0.5.10/units-and-global-variables.html#block-and-transaction-properties + // Alle Smart Contracts sind auf externe Transaktionen angewiesen, um ihre Funktionen auszulösen. + // `msg` ist eine globale Variable, die relevante Daten über die jeweilige Transaktion enthält, + // wie z. B. die Adresse des Absenders und den in der Transaktion enthaltenen ETH-Wert. + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties owner = msg.sender; } // Erstellt eine Menge neuer Tokens und sendet sie an eine Adresse. function mint(address receiver, uint amount) public { - // `require` ist eine Kontrollstruktur, die benutzt wird, um bestimmte Bedingungen zu erzwingen. - // Wenn eine `require` Anweisung zu `false` auswertet, wird eine Ausnahme ausgelöst, - // welche alle Änderungen am Status während des aktuellen Aufrufs rückgängig macht. - // Erfahren Sie mehr: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions + // `require` ist eine Kontrollstruktur, die zur Durchsetzung bestimmter Bedingungen verwendet wird. + // Wenn eine `require`-Anweisung zu `false` ausgewertet wird, wird eine Ausnahme ausgelöst, + // die alle während des aktuellen Aufrufs am Zustand vorgenommenen Änderungen rückgängig macht. + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions // Nur der Vertragsinhaber kann diese Funktion aufrufen - require(msg.sender == owner, "Sie sind nicht der Besitzer."); + require(msg.sender == owner, "Sie sind nicht der Inhaber."); - // Erzwingt eine maximale Menge an Token - require(amount < 1e60, "Maximale Ausgabe überschritten"); + // Erzwingt eine maximale Menge an Tokens + require(amount < 1e60, "Maximale Emission überschritten"); - // Erhöht den Saldo von `Empfänger` um `Betrag`. + // Erhöht das Guthaben von `receiver` um `amount` balances[receiver] += amount; } - // Sendet eine Menge vorhandener Token von einem beliebigen Anrufer an eine Adresse. + // Sendet eine Menge bestehender Tokens von einem beliebigen Aufrufer an eine Adresse. function transfer(address receiver, uint amount) public { - // Der Absender muss genug Token zum Senden besitzen - require(amount <= balances[msg.sender], "Insufficient balance."); + // Der Absender muss über genügend Tokens verfügen, um sie zu senden + require(amount <= balances[msg.sender], "Ungenügendes Guthaben."); - // Tokensalden der beiden Adressen anpassen + // Passt die Token-Guthaben der beiden Adressen an balances[msg.sender] -= amount; balances[receiver] += amount; - // Sendet das zuvor definierte Event aus + // Löst das zuvor definierte Ereignis aus emit Transfer(msg.sender, receiver, amount); } } ``` -### Einzigartiges digitales Asset {#unique-digital-asset} +### Einzigartiger digitaler Vermögenswert {#unique-digital-asset} ```solidity pragma solidity ^0.5.10; -// Importiert Symbole aus anderen Dateien in den aktuellen Contract. +// Importiert Symbole aus anderen Dateien in den aktuellen Vertrag. // In diesem Fall eine Reihe von Hilfsverträgen von OpenZeppelin. -// Erfahre mehr: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#importing-other-source-files +// Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#importing-other-source-files import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver. ol"; +import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "../node_modules/@openzeppelin/contracts/introspection/ERC165.sol"; import "../node_modules/@openzeppelin/contracts/math/SafeMath.sol"; -// Das Schlüsselwort `is` wird verwendet, um Funktionen und Schlüsselwörter aus externen Smart Contracts zu erben. -// In diesem Fall erbt `CryptoPizza` von den `IERC721` und `ERC165` Contracts. -// Erfahre mehr: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#inheritance +// Das Schlüsselwort `is` wird verwendet, um Funktionen und Schlüsselwörter von externen Verträgen zu erben. +// In diesem Fall erbt `CryptoPizza` von den Verträgen `IERC721` und `ERC165`. +// Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#inheritance contract CryptoPizza is IERC721, ERC165 { - // Verwendet OpenZeppelins SafeMath Bibliothek, um arithmetische Operationen sicher durchzuführen. - // Erfahre mehr: https://docs.openzeppelin.com/contracts/2. /api/math#SafeMath + // Verwendet die SafeMath-Bibliothek von OpenZeppelin, um arithmetische Operationen sicher durchzuführen. + // Mehr erfahren: https://docs.openzeppelin.com/contracts/2.x/api/math#SafeMath using SafeMath for uint256; - // Konstante Zustandsvariablen in Solidity sind vergleichbar mit anderen Sprachen - // du musst jedoch voneiner Expression zuweisen, die beim Kompilieren konstant ist. - // Learn more: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constant-state-variables + // Konstante Zustandsvariablen in Solidity sind ähnlich wie in anderen Sprachen, + // aber Sie müssen sie aus einem Ausdruck zuweisen, der zur Kompilierungszeit konstant ist. + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constant-state-variables uint256 constant dnaDigits = 10; uint256 constant dnaModulus = 10 ** dnaDigits; bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; - // Struct types let you define your own type - // Learn more: https://solidity.readthedocs.io/en/v0.5.10/types.html#structs + // Mit Struct-Typen können Sie Ihren eigenen Typ definieren + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/types.html#structs struct Pizza { string name; uint256 dna; } - // Creates an empty array of Pizza structs + // Erstellt ein leeres Array von Pizza-Structs Pizza[] public pizzas; - // Mapping from pizza ID to its owner's address + // Mapping von der Pizza-ID zur Adresse ihres Besitzers mapping(uint256 => address) public pizzaToOwner; - // Mapping from owner's address to number of owned token + // Mapping von der Adresse des Besitzers zur Anzahl der besessenen Tokens mapping(address => uint256) public ownerPizzaCount; - // Mapping from token ID to approved address + // Mapping von der Token-ID zur genehmigten Adresse mapping(uint256 => address) pizzaApprovals; - // You can nest mappings, this example maps owner to operator approvals + // Sie können Mappings verschachteln, dieses Beispiel bildet Besitzer auf Betreibergenehmigungen ab mapping(address => mapping(address => bool)) private operatorApprovals; - // Internal function to create a random Pizza from string (name) and DNA + // Interne Funktion zum Erstellen einer zufälligen Pizza aus einer Zeichenfolge (Name) und DNA function _createPizza(string memory _name, uint256 _dna) - // The `internal` keyword means this function is only visible - // within this contract and contracts that derive this contract - // Learn more: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#visibility-and-getters + // Das Schlüsselwort `internal` bedeutet, dass diese Funktion nur + // innerhalb dieses Vertrags und von Verträgen, die von diesem Vertrag abgeleitet sind, sichtbar ist + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#visibility-and-getters internal - // `isUnique` is a function modifier that checks if the pizza already exists - // Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html#function-modifiers + // `isUnique` ist ein Funktionsmodifikator, der prüft, ob die Pizza bereits existiert + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html#function-modifiers isUnique(_name, _dna) { - // Adds Pizza to array of Pizzas and get id + // Fügt Pizza zum Array von Pizzen hinzu und erhält die ID uint256 id = SafeMath.sub(pizzas.push(Pizza(_name, _dna)), 1); - // Checks that Pizza owner is the same as current user - // Learn more: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions + // Überprüft, ob der Pizzabesitzer mit dem aktuellen Benutzer identisch ist + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions - // note that address(0) is the zero address, - // indicating that pizza[id] is not yet allocated to a particular user. + // beachten Sie, dass address(0) die Null-Adresse ist, + // was anzeigt, dass pizza[id] noch keinem bestimmten Benutzer zugewiesen ist. assert(pizzaToOwner[id] == address(0)); - // Maps the Pizza to the owner + // Ordnet die Pizza dem Besitzer zu pizzaToOwner[id] = msg.sender; ownerPizzaCount[msg.sender] = SafeMath.add( ownerPizzaCount[msg.sender], @@ -389,38 +389,38 @@ contract CryptoPizza is IERC721, ERC165 { ); } - // Creates a random Pizza from string (name) + // Erstellt eine zufällige Pizza aus einer Zeichenfolge (Name) function createRandomPizza(string memory _name) public { uint256 randDna = generateRandomDna(_name, msg.sender); _createPizza(_name, randDna); } - // Generates random DNA from string (name) and address of the owner (creator) + // Erzeugt eine zufällige DNA aus einer Zeichenfolge (Name) und der Adresse des Besitzers (Erstellers) function generateRandomDna(string memory _str, address _owner) public - // Functions marked as `pure` promise not to read from or modify the state - // Learn more: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#pure-functions + // Funktionen, die als `pure` markiert sind, versprechen, den Zustand weder zu lesen noch zu verändern + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#pure-functions pure returns (uint256) { - // Generates random uint from string (name) + address (owner) + // Erzeugt eine zufällige uint aus einer Zeichenfolge (Name) + Adresse (Besitzer) uint256 rand = uint256(keccak256(abi.encodePacked(_str))) + uint256(_owner); rand = rand % dnaModulus; return rand; } - // Returns array of Pizzas found by owner + // Gibt ein Array von Pizzen zurück, die nach Besitzer gefunden wurden function getPizzasByOwner(address _owner) public - // Functions marked as `view` promise not to modify state - // Learn more: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#view-functions + // Funktionen, die als `view` markiert sind, versprechen, den Zustand nicht zu verändern + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#view-functions view returns (uint256[] memory) { - // Uses the `memory` storage location to store values only for the - // lifecycle of this function call. - // Erfahre mehr: https://solidity.readthedocs.io/en/v0.5.10/introduction-to-smart-contracts.html#storage-memory-and-the-stack + // Verwendet den Speicherort `memory`, um Werte nur für den + // Lebenszyklus dieses Funktionsaufrufs zu speichern. + // Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/introduction-to-smart-contracts.html#storage-memory-and-the-stack uint256[] memory result = new uint256[](ownerPizzaCount[_owner]); uint256 counter = 0; for (uint256 i = 0; i < pizzas.length; i++) { @@ -432,28 +432,28 @@ contract CryptoPizza is IERC721, ERC165 { return result; } - // Transferiert Pizza und deren Besitzanspruch auf eine andere Adresse + // Überträgt Pizza und Besitz an eine andere Adresse function transferFrom(address _from, address _to, uint256 _pizzaId) public { - require(_from != address(0) && _to != address(0), "Invalid address."); - require(_exists(_pizzaId), "Pizza does not exist."); - require(_from != _to, "Cannot transfer to the same address."); - require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved."); + require(_from != address(0) && _to != address(0), "Ungültige Adresse."); + require(_exists(_pizzaId), "Pizza existiert nicht."); + require(_from != _to, "Kann nicht an dieselbe Adresse übertragen werden."); + require(_isApprovedOrOwner(msg.sender, _pizzaId), "Adresse ist nicht genehmigt."); ownerPizzaCount[_to] = SafeMath.add(ownerPizzaCount[_to], 1); ownerPizzaCount[_from] = SafeMath.sub(ownerPizzaCount[_from], 1); pizzaToOwner[_pizzaId] = _to; - // Gibt ein Event aus, dass in dem importierten IERC721 Contract definiert ist + // Löst ein Ereignis aus, das im importierten IERC721-Vertrag definiert ist emit Transfer(_from, _to, _pizzaId); _clearApproval(_to, _pizzaId); } /** - * Übergibt auf sichere Weise den Besitzanspruch von gegebener Token ID an eine andere Adresse - * Wenn die Zieladresse ein Contract ist, muss dieser `onERC721Received` implementieren, - * was bei einem sicheren Transfer aufgerufen wird und den magischen Wert zurückgibt: - * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; - * ansonsten, wird die Transaktion abgewiesen. + * Überträgt den Besitz einer bestimmten Token-ID sicher an eine andere Adresse + * Wenn die Zieladresse ein Vertrag ist, muss sie `onERC721Received` implementieren, + * was bei einer sicheren Übertragung aufgerufen wird, und den magischen Wert + * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` zurückgeben; + * andernfalls wird die Übertragung rückgängig gemacht. */ function safeTransferFrom(address from, address to, uint256 pizzaId) public @@ -463,11 +463,11 @@ contract CryptoPizza is IERC721, ERC165 { } /** - * Übergibt auf sichere Weise den Besitzanspruch von gegebener Token ID an eine andere Adresse - * Wenn die Zieladresse ein Contract ist, muss dieser `onERC721Received` implementieren, - * was bei einem sicheren Transfer aufgerufen wird und den magischen Wert zurückgibt: - * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; - * ansonsten, wird die Transaktion abgewiesen. + * Überträgt den Besitz einer bestimmten Token-ID sicher an eine andere Adresse + * Wenn die Zieladresse ein Vertrag ist, muss sie `onERC721Received` implementieren, + * was bei einer sicheren Übertragung aufgerufen wird, und den magischen Wert + * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` zurückgeben; + * andernfalls wird die Übertragung rückgängig gemacht. */ function safeTransferFrom( address from, @@ -476,12 +476,12 @@ contract CryptoPizza is IERC721, ERC165 { bytes memory _data ) public { this.transferFrom(from, to, pizzaId); - require(_checkOnERC721Received(from, to, pizzaId, _data), "Must implement onERC721Received."); + require(_checkOnERC721Received(from, to, pizzaId, _data), "Muss onERC721Received implementieren."); } /** - * Internal function to invoke `onERC721Received` on a target address - * The call is not executed if the target address is not a contract + * Interne Funktion zum Aufrufen von `onERC721Received` auf einer Zieladresse + * Der Aufruf wird nicht ausgeführt, wenn die Zieladresse kein Vertrag ist */ function _checkOnERC721Received( address from, @@ -502,13 +502,13 @@ contract CryptoPizza is IERC721, ERC165 { return (retval == _ERC721_RECEIVED); } - // Burns a Pizza - destroys Token completely - // The `external` function modifier means this function is - // part of the contract interface and other contracts can call it + // Verbrennt eine Pizza – zerstört den Token vollständig + // Der Funktionsmodifikator `external` bedeutet, dass diese Funktion + // Teil der Vertragsschnittstelle ist und andere Verträge sie aufrufen können function burn(uint256 _pizzaId) external { - require(msg.sender != address(0), "Invalid address."); - require(_exists(_pizzaId), "Pizza does not exist."); - require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved."); + require(msg.sender != address(0), "Ungültige Adresse."); + require(_exists(_pizzaId), "Pizza existiert nicht."); + require(_isApprovedOrOwner(msg.sender, _pizzaId), "Adresse ist nicht genehmigt."); ownerPizzaCount[msg.sender] = SafeMath.sub( ownerPizzaCount[msg.sender], @@ -517,58 +517,58 @@ contract CryptoPizza is IERC721, ERC165 { pizzaToOwner[_pizzaId] = address(0); } - // Returns count of Pizzas by address + // Gibt die Anzahl der Pizzen nach Adresse zurück function balanceOf(address _owner) public view returns (uint256 _balance) { return ownerPizzaCount[_owner]; } - // Returns owner of the Pizza found by id + // Gibt den Besitzer der Pizza zurück, die nach ID gefunden wurde function ownerOf(uint256 _pizzaId) public view returns (address _owner) { address owner = pizzaToOwner[_pizzaId]; - require(owner != address(0), "Invalid Pizza ID."); + require(owner != address(0), "Ungültige Pizza-ID."); return owner; } - // Approves other address to transfer ownership of Pizza + // Genehmigt eine andere Adresse, um den Besitz der Pizza zu übertragen function approve(address _to, uint256 _pizzaId) public { - require(msg.sender == pizzaToOwner[_pizzaId], "Must be the Pizza owner."); + require(msg.sender == pizzaToOwner[_pizzaId], "Muss der Pizzabesitzer sein."); pizzaApprovals[_pizzaId] = _to; emit Approval(msg.sender, _to, _pizzaId); } - // Returns approved address for specific Pizza + // Gibt die genehmigte Adresse für eine bestimmte Pizza zurück function getApproved(uint256 _pizzaId) public view returns (address operator) { - require(_exists(_pizzaId), "Pizza does not exist."); + require(_exists(_pizzaId), "Pizza existiert nicht."); return pizzaApprovals[_pizzaId]; } /** - * Private function to clear current approval of a given token ID - * Reverts if the given address is not indeed the owner of the token + * Private Funktion, um die aktuelle Genehmigung für eine bestimmte Token-ID zu löschen + * Macht die Aktion rückgängig, wenn die angegebene Adresse nicht tatsächlich der Besitzer des Tokens ist */ function _clearApproval(address owner, uint256 _pizzaId) private { - require(pizzaToOwner[_pizzaId] == owner, "Must be pizza owner."); - require(_exists(_pizzaId), "Pizza does not exist."); + require(pizzaToOwner[_pizzaId] == owner, "Muss Pizzabesitzer sein."); + require(_exists(_pizzaId), "Pizza existiert nicht."); if (pizzaApprovals[_pizzaId] != address(0)) { pizzaApprovals[_pizzaId] = address(0); } } /* - * Sets or unsets the approval of a given operator - * An operator is allowed to transfer all tokens of the sender on their behalf + * Setzt oder hebt die Genehmigung eines bestimmten Betreibers auf + * Ein Betreiber darf alle Tokens des Absenders in dessen Namen übertragen */ function setApprovalForAll(address to, bool approved) public { - require(to != msg.sender, "Cannot approve own address"); + require(to != msg.sender, "Eigene Adresse kann nicht genehmigt werden"); operatorApprovals[msg.sender][to] = approved; emit ApprovalForAll(msg.sender, to, approved); } - // Tells whether an operator is approved by a given owner + // Gibt an, ob ein Betreiber von einem bestimmten Besitzer genehmigt ist function isApprovedForAll(address owner, address operator) public view @@ -577,27 +577,27 @@ contract CryptoPizza is IERC721, ERC165 { return operatorApprovals[owner][operator]; } - // Takes ownership of Pizza - only for approved users + // Übernimmt den Besitz der Pizza – nur für genehmigte Benutzer function takeOwnership(uint256 _pizzaId) public { - require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved."); + require(_isApprovedOrOwner(msg.sender, _pizzaId), "Adresse ist nicht genehmigt."); address owner = this.ownerOf(_pizzaId); this.transferFrom(owner, msg.sender, _pizzaId); } - // Checks if Pizza exists + // Prüft, ob Pizza existiert function _exists(uint256 pizzaId) internal view returns (bool) { address owner = pizzaToOwner[pizzaId]; return owner != address(0); } - // Checks if address is owner or is approved to transfer Pizza + // Prüft, ob die Adresse der Besitzer ist oder für die Übertragung der Pizza genehmigt ist function _isApprovedOrOwner(address spender, uint256 pizzaId) internal view returns (bool) { address owner = pizzaToOwner[pizzaId]; - // Disable solium check because of + // Deaktiviere die Solium-Prüfung wegen // https://github.com/duaraghav8/Solium/issues/175 // solium-disable-next-line operator-whitespace return (spender == owner || @@ -605,7 +605,7 @@ contract CryptoPizza is IERC721, ERC165 { this.isApprovedForAll(owner, spender)); } - // Check if Pizza is unique and doesn't exist yet + // Prüfen, ob die Pizza einzigartig ist und noch nicht existiert modifier isUnique(string memory _name, uint256 _dna) { bool result = true; for (uint256 i = 0; i < pizzas.length; i++) { @@ -617,19 +617,19 @@ contract CryptoPizza is IERC721, ERC165 { result = false; } } - require(result, "Pizza with such name already exists."); + require(result, "Pizza mit diesem Namen existiert bereits."); _; } - // Returns whether the target address is a contract + // Gibt zurück, ob die Zieladresse ein Vertrag ist function isContract(address account) internal view returns (bool) { uint256 size; - // Currently there is no better way to check if there is a contract in an address - // than to check the size of the code at that address. + // Derzeit gibt es keine bessere Möglichkeit zu prüfen, ob es einen Vertrag an einer Adresse gibt, + // als die Größe des Codes an dieser Adresse zu prüfen. // Siehe https://ethereum.stackexchange.com/a/14016/36603 - // für weitere Informationen zur Funktionsweise. - // TO-DO Verifizieren Sie dies nochmals, bevor Serenity eingeführt wird - //, da alle Adressen dann Contracts sein werden. + // für weitere Details zur Funktionsweise. + // TODO Dies vor der Serenity-Version erneut prüfen, da dann alle Adressen + // Verträge sein werden. // solium-disable-next-line security/no-inline-assembly assembly { size := extcodesize(account) @@ -639,20 +639,20 @@ contract CryptoPizza is IERC721, ERC165 { } ``` -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} Sehen Sie sich auch die Dokumentationen zu Solidity und Vyper an, um einen umfassenderen Überblick über Smart Contracts zu erhalten: -- [Solidity](https://solidity.readthedocs.io/) -- [Vyper](https://vyper.readthedocs.io/) +- [Solidity](https://docs.soliditylang.org/) +- [Vyper](https://docs.vyperlang.org/en/stable/) ## Verwandte Themen {#related-topics} - [Smart Contracts](/developers/docs/smart-contracts/) -- [Ethereum-Virtual Machine (EVM)](/developers/docs/evm/) +- [Ethereum Virtual Machine](/developers/docs/evm/) ## Verwandte Tutorials {#related-tutorials} -- [Verkleinern von Verträgen, um die Vertragsgröße zu begrenzen](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– Einige praktische Tipps zur Reduzierung der Größe Ihres Smart Contracts_ -- [Protokollieren von Daten aus Smart Contracts mit Ereignissen](/developers/tutorials/logging-events-smart-contracts/) _– Eine Einführung in Smart-Contract-Ereigbnisse und wie Sie diese zur Datenprotokollierung verwenden können_ -- [Mit anderen Verträgen aus Solidity interagieren](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– So können Sie einen Smart Contract aus einem bestehenden Vertrag aufbauen und mit ihm interagieren_ +- [Verkleinern von Verträgen, um das Vertraggrößenlimit zu bekämpfen](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– Einige praktische Tipps zur Reduzierung der Größe Ihres Smart Contracts._ +- [Protokollierung von Daten aus Smart Contracts mit Ereignissen](/developers/tutorials/logging-events-smart-contracts/) _– Eine Einführung in Smart-Contract-Ereignisse und wie Sie diese zur Datenprotokollierung verwenden können._ +- [Mit anderen Verträgen aus Solidity interagieren](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Wie man einen Smart Contract aus einem bestehenden Vertrag bereitstellt und mit ihm interagiert._ diff --git a/public/content/translations/de/developers/docs/smart-contracts/compiling/index.md b/public/content/translations/de/developers/docs/smart-contracts/compiling/index.md index 4eb758d7556..8fde88df8df 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/compiling/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/compiling/index.md @@ -9,7 +9,7 @@ Sie müssen Ihren Smart Contract so kompilieren, dass Ihre Web-App und die Ether ## Voraussetzungen {#prerequisites} -Unter Umständen ist es hilfreich, wenn Sie sich zuerst mit unserer Einführung in [Smart Contracts](/developers/docs/smart-contracts/) und die [Ethereum-Virtual Machine](/developers/docs/evm/) vertraut machen, bevor Sie sich die Informationen zur Kompilierung ansehen. +Es könnte hilfreich sein, unsere Einführung zu [Smart Contracts](/developers/docs/smart-contracts/) und zur [Ethereum Virtual Machine](/developers/docs/evm/) zu lesen, bevor Sie sich mit dem Thema Kompilierung befassen. ## Die EVM {#the-evm} @@ -20,30 +20,30 @@ pragma solidity 0.4.24; contract Greeter { - function greet() public constant returns (string) { + function greet() public view returns (string memory) { return "Hello"; } } ``` -**zu:** +**zu diesem** ``` PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0xCFAE3217 EQ PUSH2 0x46 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B PUSH2 0xD6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x80 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x48656C6C6F000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 SLT 0xec 0xe 0xf5 0xf8 SLT 0xc7 0x2d STATICCALL ADDRESS SHR 0xdb COINBASE 0xb1 BALANCE 0xe8 0xf8 DUP14 0xda 0xad DUP13 LOG1 0x4c 0xb4 0x26 0xc2 DELEGATECALL PUSH7 0x8994D3E002900 ``` -Diese werden als **Opcodes** bezeichnet. EVM-Opcodes sind die niedrigstufigen Anweisungen, die die Ethereum Virtual Machine (EVM) ausführen kann. Jeder Opcode bezeichnet eine spezifische Operation, wie etwa arithmetische Operationen, logische Operationen, Datenmanipulation, Kontrollfluss usw. +Diese werden als **Operationscodes** bezeichnet. EVM-Opcodes sind die niedrigstufigen Anweisungen, die die Ethereum Virtual Machine (EVM) ausführen kann. Jeder Opcode bezeichnet eine spezifische Operation, wie etwa arithmetische Operationen, logische Operationen, Datenmanipulation, Kontrollfluss usw. -[Mehr zu Opcodes](/developers/docs/evm/opcodes/) +[Mehr zu Operationscodes](/developers/docs/evm/opcodes/) ## Webanwendungen {#web-applications} -Der Compiler erzeugt außerdem die **Application Binary Interface (ABI)**, die Sie benötigen, damit Ihre Anwendung den Smart Contract verstehen und die Funktionen des Vertrages aufrufen kann. +Der Compiler erzeugt außerdem die **Application Binary Interface (ABI)**, die Sie benötigen, damit Ihre Anwendung den Vertrag verstehen und dessen Funktionen aufrufen kann. Die ABI ist eine JSON-Datei, die den eingesetzten Vertrag und seine Smart-Contract-Funktionen beschreibt. Das hilft dabei, die Lücke zwischen web2 und web3 zu überbrücken. -Eine [JavaScript-Client-Bibliothek](/developers/docs/apis/javascript/) liest die **ABI**, um Smart Contracts in der Schnittstelle der Web-App aufrufen zu können. +Eine [JavaScript-Client-Bibliothek](/developers/docs/apis/javascript/) liest die **ABI**, damit Sie Ihren Smart Contract in der Benutzeroberfläche Ihrer Web-App aufrufen können. Unten ist die ABI für den ERC-20-Token-Contract. Ein ERC-20 ist ein Tokenstandard, den Sie auf Ethereum handeln können. @@ -272,11 +272,11 @@ Unten ist die ABI für den ERC-20-Token-Contract. Ein ERC-20 ist ein Tokenstanda ] ``` -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [ABI-Spezifikationen](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_ +- [ABI-Spezifikation](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_ ## Verwandte Themen {#related-topics} - [JavaScript-Client-Bibliotheken](/developers/docs/apis/javascript/) -- [Ethereum-Virtual Machine (EVM)](/developers/docs/evm/) +- [Ethereum Virtual Machine](/developers/docs/evm/) diff --git a/public/content/translations/de/developers/docs/smart-contracts/composability/index.md b/public/content/translations/de/developers/docs/smart-contracts/composability/index.md index 6059a5c0517..5c20f1f5861 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/composability/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/composability/index.md @@ -1,13 +1,13 @@ --- title: Smart-Contract-Kombinierbarkeit -description: +description: Erfahren Sie, wie Smart Contracts wie Legosteine ​​kombiniert werden können, um durch die Wiederverwendung vorhandener Komponenten komplexe Dapps zu erstellen. lang: de incomplete: true --- ## Eine kurze Einführung {#a-brief-introduction} -Smart Contracts sind auf Ethereum öffentlich und können als offene APIs betrachtet werden. Sie müssen nicht unbedingt Ihren eigenen Smart Contract schreiben, um ein dApp-Entwickler zu werden, sondern nur wissen, wie Sie mit Smart Contracts interagieren können. Sie können zum Beispiel vorhandenen Smart Contracts von [Uniswap](https://uniswap.exchange/swap), eine dezentrale Börse, verwenden, um die Token-Swap-Logik in Ihrer App zu handhaben. Sie müssen also nicht bei Null anfangen. Sehen Sie sich einige der [v2](https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts)- und [v3](https://github.com/Uniswap/uniswap-v3-core/tree/main/contracts)-Verträge an. +Smart Contracts sind auf Ethereum öffentlich. Sie können sie sich als offene APIs vorstellen. Sie müssen nicht unbedingt Ihren eigenen Smart Contract schreiben, um ein dApp-Entwickler zu werden, sondern nur wissen, wie Sie mit Smart Contracts interagieren können. Zum Beispiel können Sie die bestehenden Smart Contracts von [Uniswap](https://uniswap.exchange/swap), einer dezentralen Börse, verwenden, um die gesamte Token-Tausch-Logik in Ihrer App zu handhaben – Sie müssen nicht bei Null anfangen. Sehen Sie sich einige ihrer [v2](https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts)- und [v3](https://github.com/Uniswap/uniswap-v3-core/tree/main/contracts)-Contracts an. ## Was ist Zusammensetzbarkeit? {#what-is-composability} @@ -19,58 +19,58 @@ Auf Ethereum ist jeder Smart Contract eine Art Legostein – Sie können Smart C Ethereum-Smart-Contracts sind wie öffentliche APIs, d. h. jeder kann mit dem Vertrag interagieren oder sie in DApps integrieren, um zusätzliche Funktionen zu erhalten. Die Zusammensetzbarkeit von Smart Contracts beruht im Allgemeinen auf drei Prinzipien: Modularität, Autonomie und Auffindbarkeit: -**‌1. Modularität**: Dies ist die Fähigkeit einzelner Komponenten, eine bestimmte Aufgabe zu erfüllen. Auf Ethereum verfügt jeder Smart Contract über einen bestimmten Anwendungsfall (wie im Beispiel von Uniswap gezeigt). +\*\*1. **Modularität**: Dies ist die Fähigkeit einzelner Komponenten, eine bestimmte Aufgabe zu erfüllen. Auf Ethereum verfügt jeder Smart Contract über einen bestimmten Anwendungsfall (wie im Beispiel von Uniswap gezeigt). -**2. Autonomie**: Zusammensetzbare Komponenten müssen in der Lage sein, unabhängig voneinander zu arbeiten. Jeder Smart Contract in Ethereum ist selbstausführend und kann betrieben werden, ohne auf andere Teile des Systems angewiesen zu sein. +\*\*2. **Autonomie**: Zusammensetzbare Komponenten müssen in der Lage sein, unabhängig voneinander zu arbeiten. Jeder Smart Contract in Ethereum ist selbstausführend und kann betrieben werden, ohne auf andere Teile des Systems angewiesen zu sein. -**3. Auffindbarkeit**: Entwickler können keine externen Verträge aufrufen oder Softwarebibliotheken in Anwendungen integrieren, wenn Erstere nicht öffentlich zugänglich sind. Smart Contracts sind bewusst als Open-Source-Software konzipiert, d. h. jeder kann einen Smart Contract aufrufen oder eine Codebasis abspalten. +\*\*3. **Auffindbarkeit**: Entwickler können keine externen Verträge aufrufen oder Softwarebibliotheken in Anwendungen integrieren, wenn Erstere nicht öffentlich zugänglich sind. Smart Contracts sind bewusst als Open-Source-Software konzipiert, d. h. jeder kann einen Smart Contract aufrufen oder eine Codebasis abspalten. ## Vorteile der Zusammensetzbarkeit {#benefits-of-composability} -### Kürzere Entwicklungszyklen {#shorter-development-cycle} +### Kürzerer Entwicklungszyklus {#shorter-development-cycle} -Die Zusammensetzbarkeit reduziert die Arbeit, die Entwickler bei der Erstellung von [DApps](/apps/#what-are-dapps) leisten müssen. [Wie Naval Ravikant es ausdrückt:](https://twitter.com/naval/status/1444366754650656770) „Open Source bedeutet, dass jedes Problem nur einmal gelöst werden muss.“ +Zusammensetzbarkeit reduziert den Arbeitsaufwand, den Entwickler bei der Erstellung von [Dapps](/apps/#what-are-dapps) haben. [Wie Naval Ravikant es ausdrückt:](https://twitter.com/naval/status/1444366754650656770) „Open-Source bedeutet, dass jedes Problem nur einmal gelöst werden muss.“ Wenn es einen Smart Contract gibt, der ein Problem löst, können andere Entwickler ihn wiederverwenden, damit sie nicht das gleiche Problem lösen müssen. Auf diese Weise können Entwickler bestehenden Softwarebibliotheken zusätzliche Funktionen hinzufügen, um neue DApps zu erstellen. -### Mehr Innovation {#greater-innovation} +### Größere Innovation {#greater-innovation} Die Zusammensetzbarkeit fördert Innovationen und Experimentierfreude, da es den Entwicklern freisteht, Open-Source-Code wiederzuverwenden, abzuändern, zu vervielfältigen oder zu integrieren, um die gewünschten Ergebnisse zu erzielen. Infolgedessen verbringen die Entwicklungsteams weniger Zeit mit der grundlegenden Funktionalität und können mehr Zeit für das Experimentieren mit neuen Funktionen aufwenden. -### Bessere Nutzererfahrung {#better-user-experience} +### Bessere Benutzererfahrung {#better-user-experience} Die Interoperabilität zwischen den Komponenten des Ethereum-Ökosystems verbessert das Benutzererlebnis. Wenn DApps externe Smart Contracts integrieren, können die Benutzer auf mehr Funktionen zugreifen als in einem fragmentierten Ökosystem, in dem Anwendungen nicht miteinander kommunizieren können. Anhand eines Beispiels aus dem Arbitrage-Handel wollen wir die Vorteile der Interoperabilität verdeutlichen: -Wenn ein Token auf `Börse A` höher gehandelt wird als auf `Börse B`, können Sie sich den Preisunterschied zunutze machen, um Gewinn zu erzielen. Sie können das allerdings nur tun, wenn Sie über genügend Kapital verfügen, um die Transaktion zu finanzieren (d. h. den Token auf `Börse B` zu kaufen und ihn auf `Börse A` zu verkaufen). +Wenn ein Token auf `Börse A` höher gehandelt wird als auf `Börse B`, können Sie sich den Preisunterschied zunutze machen, um einen Gewinn zu erzielen. Allerdings können Sie das nur tun, wenn Sie über genügend Kapital verfügen, um die Transaktion zu finanzieren (d. h. den Token von `Börse B` zu kaufen und auf `Börse A` zu verkaufen). -In einem Szenario, in dem Sie nicht über genügend Geldmittel verfügen, um den Handel zu decken, könnte sich ein Flash Loan ideal eignen. [Flash Loans](/defi/#flash-loans) sind sehr fachspezifisch, aber die Grundidee ist, dass Assets (ohne Sicherheiten) ausgeliehen und diese innerhalb _einer_ Transaktion zurückgeben werden können. +In einem Szenario, in dem Sie nicht über genügend Geldmittel verfügen, um den Handel zu decken, könnte sich ein Flash Loan ideal eignen. [Flash-Loans](/defi/#flash-loans) sind sehr technisch, aber die Grundidee ist, dass Sie Assets (ohne Sicherheiten) leihen und sie innerhalb _einer einzigen_ Transaktion zurückgeben können. -Zurück zu unserem anfänglichen Beispiel: Ein Arbitrage-Händler kann einen großen Flash Loan aufnehmen, Token von `Börse B` kaufen, diese auf `Börse A` verkaufen, das Kapital + Zinsen zurückzahlen und den Gewinn innerhalb derselben Transaktion behalten. Diese komplexe Logik erfordert die Kombination von Aufrufen für mehrere Verträge, was nicht möglich wäre, wenn Smart Contracts nicht über Interoperabilität verfügen würden. +Zurück zu unserem anfänglichen Beispiel: Ein Arbitrage-Händler kann einen großen Flash-Loan aufnehmen, Tokens von `Börse B` kaufen, sie auf `Börse A` verkaufen, das Kapital + Zinsen zurückzahlen und den Gewinn innerhalb derselben Transaktion behalten. Diese komplexe Logik erfordert die Kombination von Aufrufen für mehrere Verträge, was nicht möglich wäre, wenn Smart Contracts nicht über Interoperabilität verfügen würden. -## Beispiele für Zusammensetzbarkeit auf Ethereum {#composability-in-ethereum} +## Beispiele für Zusammensetzbarkeit in Ethereum {#composability-in-ethereum} -### Token-Tausch {#token-swaps} +### Token-Swaps {#token-swaps} Wenn Sie eine DApp erstellen, für die Transaktionen in ETH bezahlt werden müssen, können Sie den Benutzern die Zahlung in anderen ERC-20-Token erlauben, indem Sie eine Token-Tausch-Logik integrieren. Der Code wandelt den Token des Benutzers automatisch in ETH um, bevor der Vertrag die aufgerufene Funktion ausführt. -### Verwaltung {#governance} +### Governance {#governance} -Die Entwicklung maßgeschneiderter Verwaltungssysteme für eine [DAO](/dao/) kann teuer und zeitaufwendig sein. Stattdessen könnten Sie ein Verwaltungs-Toolkit auf Open-Source-Basis wie [Aragon Client](https://client.aragon.org/) zur Gründung Ihrer DAO und schnellen Schaffung eines Verwaltungs-Frameworks verwenden. +Die Entwicklung maßgeschneiderter Governance-Systeme für eine [DAO](/dao/) kann teuer und zeitaufwendig sein. Stattdessen könnten Sie ein Open-Source-Governance-Toolkit wie [Aragon Client](https://client.aragon.org/) verwenden, um Ihre DAO zu bootstrappen und schnell ein Governance-Framework zu erstellen. ### Identitätsmanagement {#identity-management} -Anstatt ein benutzerdefiniertes Authentifizierungssystem zu entwickeln oder sich auf zentrale Anbieter zu verlassen, können Sie zur Verwaltung der Benutzerauthentifizierung Werkzeuge für dezentrale Identität (DID) integrieren. Ein Beispiel hierfür ist [SpruceID](https://www.spruceid.com/), ein Open-Source-Toolkit, das eine „Anmeldung bei Ethereum“-Funktionalität anbietet, mit der Benutzer Identitäten mithilfe einer Ethereum-Wallet authentifizieren können. +Anstatt ein benutzerdefiniertes Authentifizierungssystem zu entwickeln oder sich auf zentrale Anbieter zu verlassen, können Sie zur Verwaltung der Benutzerauthentifizierung Werkzeuge für dezentrale Identität (DID) integrieren. Ein Beispiel ist [SpruceID](https://www.spruceid.com/), ein Open-Source-Toolkit, das eine „Mit Ethereum anmelden“-Funktionalität anbietet, mit der Benutzer ihre Identität mithilfe einer Ethereum-Wallet authentifizieren können. -## Ähnliche Tutorials {#related-tutorials} +## Verwandte Tutorials {#related-tutorials} -- [Starten Sie die Entwicklung Ihres DApp-Frontends mit create-eth-app](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– Ein Überblick über die Verwendung von create-eth-app, um sofort einsatzbereite Apps mit beliebten Smart Contracts zu erstellen._ +- [Starten Sie die Entwicklung Ihres Dapp-Frontends mit create-eth-app](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– Ein Überblick über die Verwendung von create-eth-app, um sofort einsatzbereite Apps mit beliebten Smart Contracts zu erstellen._ -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -_Kennst du eine Community-Ressource, die dir geholfen hat? Bearbeite diese Seite und füge sie hinzu!_ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ -- [Kombinierbarkeit ist Innovation](https://future.a16z.com/how-composability-unlocks-crypto-and-everything-else/) +- [Zusammensetzbarkeit ist Innovation](https://a16zcrypto.com/posts/article/how-composability-unlocks-crypto-and-everything-else/) - [Warum Zusammensetzbarkeit für Web3 wichtig ist](https://hackernoon.com/why-composability-matters-for-web3) - [Was ist Zusammensetzbarkeit?](https://blog.aragon.org/what-is-composability/#:~:text=Aragon,connect%20to%20every%20other%20piece.) diff --git a/public/content/translations/de/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/de/developers/docs/smart-contracts/deploying/index.md index a6170340409..8de1ee495fd 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/deploying/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/deploying/index.md @@ -1,6 +1,6 @@ --- title: Smart Contracts bereitstellen -description: +description: Erfahren Sie, wie Sie Smart Contracts in Ethereum Netzwerken bereitstellen, einschließlich Voraussetzungen, Tools und Bereitstellungsschritten. lang: de --- @@ -10,32 +10,32 @@ Die Bereitstellung des Smart Contracts auf der Blockchain ist eigentlich nur das ## Voraussetzungen {#prerequisites} -Sie sollten mit [Ethereum-Netzwerken](/developers/docs/networks/), [Transaktionen](/developers/docs/transactions/) und der [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) vor der Umsetzung von Smart Contracts vertraut sein. +Sie sollten [Ethereum-Netzwerke](/developers/docs/networks/), [Transaktionen](/developers/docs/transactions/) und die [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) verstehen, bevor Sie Smart Contracts bereitstellen. -Die Veröffentlichung eines Contracts kostet auch Ether (ETH), da sie auf der Blockchain gespeichert werden. Daher sollten Sie mit [Gas und Gebühren](/developers/docs/gas/) auf Ethereum vertraut sein. +Das Bereitstellen eines Vertrags kostet auch Ether (ETH), da dieser auf der Blockchain gespeichert wird. Sie sollten daher mit [Gas und Gebühren](/developers/docs/gas/) auf Ethereum vertraut sein. -Zu guter letzt muss ein Vertrag vor der Bereitstellung kompiliert werden. Lesen Sie also vorher den Beitrag [Smart Contracts kompilieren](/developers/docs/smart-contracts/compiling/). +Schließlich müssen Sie Ihren Vertrag kompilieren, bevor Sie ihn bereitstellen. Stellen Sie also sicher, dass Sie den Artikel über das [Kompilieren von Smart Contracts](/developers/docs/smart-contracts/compiling/) gelesen haben. -## So laden Sie einen Smart Contract hoch {#how-to-deploy-a-smart-contract} +## Wie man einen Smart Contract bereitstellt {#how-to-deploy-a-smart-contract} -### Folgendes ist erforderlich {#what-youll-need} +### Was Sie benötigen {#what-youll-need} -- Ihr Contract-Bytecode – dieser wird durch [Kompilierung](/developers/docs/smart-contracts/compiling/) generiert. +- Der Bytecode Ihres Vertrags – dieser wird durch die [Kompilierung](/developers/docs/smart-contracts/compiling/) generiert - Ether for gas – Sie setzen Ihre Ressourcengrenze wie bei anderen Transaktionen fest. Beachten Sie dabei jedoch, dass das Integrieren von Smart Contracts viel mehr Ressourcen erfordert als eine einfache ETH-Transaktion. - Ein Bereitstellungsskript oder Plug-in -- Zugriff auf einen [Ethereum-Knoten](/developers/docs/nodes-and-clients/), entweder durch Betreiben Ihres eigenen Knotens, durch Verbindung zu einem öffentlichen Knoten oder über einen API-Schlüssel mit einem [Node-Service](/developers/docs/nodes-and-clients/nodes-as-a-service/) +- Zugriff auf einen [Ethereum-Node](/developers/docs/nodes-and-clients/), entweder durch den Betrieb eines eigenen, die Verbindung zu einem öffentlichen Node oder über einen API-Schlüssel bei einem [Node-Service](/developers/docs/nodes-and-clients/nodes-as-a-service/) ### Schritte zur Bereitstellung eines Smart Contracts {#steps-to-deploy} -Die spezifischen Schritte hängen vom jeweiligen Entwicklungsframework ab. Zum Beispiel können Sie sich [die Dokumentation von Hardhat zur Bereitstellung Ihrer Contracts](https://hardhat.org/docs/tutorial/deploying) oder [die Dokumentation von Foundry zur Bereitstellung und Verifizierung eines Smart Contract](https://book.getfoundry.sh/forge/deploying) ansehen. Nach Bereitstellung hat Ihr Vertrag wie andere [Konten](/developers/docs/accounts/) eine Ethereum-Adresse und kann mit [Werkzeugen zur Verifizierung des Quellcodes](/developers/docs/smart-contracts/verifying/#source-code-verification-tools) verifiziert werden. +Die spezifischen Schritte hängen vom jeweiligen Entwicklungsframework ab. Zum Beispiel können Sie sich die [Dokumentation von Hardhat zur Bereitstellung Ihrer Verträge](https://hardhat.org/docs/tutorial/deploying) oder die [Dokumentation von Foundry zur Bereitstellung und Verifizierung eines Smart Contracts](https://book.getfoundry.sh/forge/deploying) ansehen. Nach der Bereitstellung hat Ihr Vertrag wie andere [Konten](/developers/docs/accounts/) eine Ethereum-Adresse und kann mithilfe von [Tools zur Überprüfung des Quellcodes](/developers/docs/smart-contracts/verifying/#source-code-verification-tools) verifiziert werden. -## Verwandte Werkzeuge {#related-tools} +## Zugehörige Werkzeuge {#related-tools} -**Remix – _Remix IDE ermöglicht das Entwickeln, Bereitstellen und Verwalten von Smart Contracts für Ethereum-ähnliche Blockchains_** +**Remix – _Remix IDE ermöglicht die Entwicklung, Bereitstellung und Verwaltung von Smart Contracts für Ethereum-ähnliche Blockchains_** - [Remix](https://remix.ethereum.org) -**Tenderly - _Web3-Entwicklungsplattform, die Debugging, Beobachtbarkeit und Infrastrukturbausteine für die Entwicklung, das Testen, die Überwachung und den Betrieb von Smart Contracts bietet_** +**Tenderly – _Web3-Entwicklungsplattform, die Debugging, Beobachtbarkeit und Infrastruktur-Bausteine für die Entwicklung, das Testen, die Überwachung und den Betrieb von Smart Contracts bietet_** - [tenderly.co](https://tenderly.co/) - [Dokumentation](https://docs.tenderly.co/) @@ -45,11 +45,11 @@ Die spezifischen Schritte hängen vom jeweiligen Entwicklungsframework ab. Zum B **Hardhat – _Eine Entwicklungsumgebung zum Kompilieren, Bereitstellen, Testen und Debuggen Ihrer Ethereum-Software_** - [hardhat.org](https://hardhat.org/getting-started/) -- [Dokumente zur Bereitstellung Ihrer Verträge](https://hardhat.org/docs/tutorial/deploying) +- [Dokumentation zur Bereitstellung Ihrer Verträge](https://hardhat.org/docs/tutorial/deploying) - [GitHub](https://github.com/nomiclabs/hardhat) - [Discord](https://discord.com/invite/TETZs2KK4k) -**thirdweb - _Einfache Bereitstellung eines beliebigen Vertrags für eine EVM-kompatible Blockchain mit einem einzigen Befehl_** +**thirdweb – _Einfache Bereitstellung beliebiger Verträge auf jeder EVM-kompatiblen Chain mit einem einzigen Befehl_** - [Dokumentation](https://portal.thirdweb.com/deploy/) @@ -62,20 +62,20 @@ Die spezifischen Schritte hängen vom jeweiligen Entwicklungsframework ab. Zum B ## Verwandte Tutorials {#related-tutorials} -- [Bereitstellung Ihres ersten Smart Contracts](/developers/tutorials/deploying-your-first-smart-contract/) _– Eine Einführung in die Bereitstellung Ihres ersten Smart Contracts in einem Ethereum-Testnetzwerk._ -- [Hallo Welt | Smart Contract-Tutorial](/developers/tutorials/hello-world-smart-contract/) _– Ein leicht verständliches Tutorial zur Erstellung & Veröffentlichung eines einfachen Smart Contracts auf Ethereum._ -- [Mit anderen Verträgen aus Solidity interagieren](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– So können Sie einen Smart Contract aus einem bestehenden Vertrag aufbauen und mit ihm interagieren_ -- [So können Sie die Größe Ihres Vertrags reduzieren](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– So reduzieren Sie die Größe Ihres Vertrags, um sie unter dem Limit zu halten und Gas zu sparen_ +- [Bereitstellung Ihres ersten Smart Contracts](/developers/tutorials/deploying-your-first-smart-contract/) _– Eine Einführung in die Bereitstellung Ihres ersten Smart Contracts auf einem Ethereum-Testnet._ +- [Hallo Welt | Smart-Contract-Tutorial](/developers/tutorials/hello-world-smart-contract/) _– Ein leicht verständliches Tutorial zur Erstellung und Bereitstellung eines einfachen Smart Contracts auf Ethereum._ +- [Mit anderen Verträgen aus Solidity interagieren](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Wie man einen Smart Contract aus einem bestehenden Vertrag bereitstellt und mit ihm interagiert._ +- [So verkleinern Sie die Größe Ihres Vertrags](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– Wie Sie die Größe Ihres Vertrags reduzieren, um das Limit einzuhalten und Gas zu sparen_ -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [https://docs.openzeppelin.com/learn/deploying-and-interacting](https://docs.openzeppelin.com/learn/deploying-and-interacting) - _OpenZeppelin_ -- [Ihre Verträge mit Hardhat bereitstellen](https://hardhat.org/docs/tutorial/deploying) – _Nomic Labs_ +- [https://docs.openzeppelin.com/learn/deploying-and-interacting](https://docs.openzeppelin.com/learn/deploying-and-interacting) – _OpenZeppelin_ +- [Bereitstellung Ihrer Verträge mit Hardhat](https://hardhat.org/docs/tutorial/deploying) – _Nomic Labs_ _Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} - [Entwicklungs-Frameworks](/developers/docs/frameworks/) -- [Einen Ethereum-Knoten betreiben](/developers/docs/nodes-and-clients/run-a-node/) -- [Nodes als Dienstleistung](/developers/docs/nodes-and-clients/nodes-as-a-service) +- [Einen Ethereum-Node betreiben](/developers/docs/nodes-and-clients/run-a-node/) +- [Nodes-as-a-Service](/developers/docs/nodes-and-clients/nodes-as-a-service) diff --git a/public/content/translations/de/developers/docs/smart-contracts/formal-verification/index.md b/public/content/translations/de/developers/docs/smart-contracts/formal-verification/index.md index c6fc119f41b..3a1059cea4b 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/formal-verification/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/formal-verification/index.md @@ -6,7 +6,7 @@ lang: de [Smart Contracts](/developers/docs/smart-contracts/) machen es möglich, dezentrale, vertrauenslose und robuste Anwendungen zu entwickeln, die neue Einsatzmöglichkeiten bieten und den Nutzern einen Mehrwert verschaffen. Da mit Smart Contracts große Mengen an Wert verwaltet werden, ist die Sicherheit ein wichtiger Aspekt für die Entwickler. -Die formale Verifizierung ist eine der empfohlenen Techniken zur Verbesserung der [Smart-Contract-Sicherheit](/developers/docs/smart-contracts/security/). Die formale Verifizierung, die auf [formale Methoden](https://www.brookings.edu/techstream/formal-methods-as-a-path-toward-better-cybersecurity/) für die Spezifizierung, den Entwurf und die Verifizierung von Programmen zurückgreift, wird seit Jahren eingesetzt, um die Korrektheit von kritischen Hardware- und Softwaresystemen zu gewährleisten. +Die formale Verifizierung ist eine der empfohlenen Techniken zur Verbesserung der [Smart-Contract-Sicherheit](/developers/docs/smart-contracts/security/). Die formale Verifizierung, die auf [formale Methoden](https://www.brookings.edu/techstream/formal-methods-as-a-path-toward-better-cybersecurity/) zur Spezifizierung, zum Entwurf und zur Verifizierung von Programmen zurückgreift, wird seit Jahren eingesetzt, um die Korrektheit von kritischen Hardware- und Softwaresystemen zu gewährleisten. Wenn die formale Verifizierung in Smart Contracts implementiert wird, lässt sich mit ihr beweisen, dass die Geschäftslogik eines Vertrags einer vordefinierten Spezifizierung entspricht. Im Vergleich zu anderen Methoden zur Bewertung der Korrektheit des Vertragscodes, wie z. B. Tests, bietet die formale Verifizierung stärkere Garantien dafür, dass ein Smart Contract funktional korrekt ist. @@ -20,13 +20,13 @@ Die erwarteten Verhaltensweisen des Systems (in diesem Fall eines Smart Contract In der Informatik ist ein [formales Modell](https://en.wikipedia.org/wiki/Model_of_computation) eine mathematische Beschreibung eines Rechenprozesses. Programme werden in mathematische Funktionen (Gleichungen) abgetrennt, wobei das Modell beschreibt, wie die Ausgaben von Funktionen in Abhängigkeit von Eingaben berechnet werden. -Formale Modelle bieten eine Abstraktionsebene, auf der die Analyse des Verhaltens eines Programms bewertet werden kann. Das Vorhandensein von formalen Modellen ermöglicht die Erstellung einer _formalen Spezifizierung_, die die gewünschten Eigenschaften des betreffenden Modells beschreibt. +Formale Modelle bieten eine Abstraktionsebene, auf der die Analyse des Verhaltens eines Programms bewertet werden kann. Das Vorhandensein von formalen Modellen ermöglicht die Erstellung einer _formalen Spezifikation_, die die gewünschten Eigenschaften des betreffenden Modells beschreibt. Für die Modellierung von Smart Contracts zur formalen Verifizierung kommen verschiedene Techniken zum Einsatz. Einige Modelle werden beispielsweise verwendet, um Aussagen über das High-Level-Verhalten eines Smart Contracts zu treffen. Diese Modellierungstechniken wenden eine Blackbox-Sichtweise auf Smart Contracts an und betrachten sie als Systeme, die Eingaben akzeptieren und Berechnungen auf der Grundlage dieser Eingaben ausführen. High-Level-Modelle konzentrieren sich auf die Beziehung zwischen Smart Contracts und externen Agenten, wie z. B. extern geführten Konto (Externally Owned Accounts, EOAs), Vertragskonten und der Blockchain-Umgebung. Solche Modelle sind nützlich, um Eigenschaften zu definieren, die festlegen, wie sich ein Vertrag als Reaktion auf bestimmte Benutzerinteraktionen verhalten soll. -Im Gegensatz dazu konzentrieren sich andere formale Modelle auf das Low-Level-Verhalten eines Smart Contracts. High-Level-Modelle können zwar dabei helfen, Aussagen über die Funktionalität eines Vertrags zu treffen, aber sie erfassen möglicherweise keine Details über die interne Funktionsweise der Implementierung. Low-Level-Modelle wenden eine White-Box-Sicht auf die Programmanalyse an und stützen sich auf Lower-Level-Darstellungen von Smart-Contract-Anwendungen, wie z. B. Programmverläufe und [Kontrollflussdiagramme](https://en.wikipedia.org/wiki/Control-flow_graph), um Aussagen über Eigenschaften zu treffen, die für die Ausführung eines Vertrags relevant sind. +Im Gegensatz dazu konzentrieren sich andere formale Modelle auf das Low-Level-Verhalten eines Smart Contracts. High-Level-Modelle können zwar dabei helfen, Aussagen über die Funktionalität eines Vertrags zu treffen, aber sie erfassen möglicherweise keine Details über die interne Funktionsweise der Implementierung. Low-Level-Modelle wenden eine White-Box-Sicht auf die Programmanalyse an und stützen sich auf Lower-Level-Darstellungen von Smart-Contract-Anwendungen, wie z. B. Programmabläufe und [Kontrollflussdiagramme](https://en.wikipedia.org/wiki/Control-flow_graph), um Aussagen über Eigenschaften zu treffen, die für die Ausführung eines Vertrags relevant sind. Low-Level-Modelle gelten als ideal, da sie die tatsächliche Ausführung eines Smart Contracts in der Ausführungsumgebung von Ethereum (d. h. der [EVM](/developers/docs/evm/)) darstellen. Low-Level-Modellierungstechniken sind besonders nützlich, um kritische Sicherheitseigenschaften in Smart Contracts festzulegen und potenzielle Schwachstellen zu erkennen. @@ -34,65 +34,65 @@ Low-Level-Modelle gelten als ideal, da sie die tatsächliche Ausführung eines S Eine Spezifizierung ist einfach eine technische Anforderung, die ein bestimmtes System erfüllen muss. Beim Programmieren stellen Spezifizierungen allgemeine Vorstellungen über die Ausführung eines Programms dar (d. h., was das Programm tun soll). -Im Zusammenhang mit Smart Contracts beziehen sich die formalen Spezifizierungen auf _Eigenschaften_ – formale Beschreibungen der Anforderungen, die ein Vertrag erfüllen muss. Solche Eigenschaften werden als „Invarianten“ bezeichnet und stellen logische Behauptungen über die Ausführung eines Vertrags dar, die unter allen möglichen Umständen und ohne Ausnahmen wahr bleiben müssen. +Im Zusammenhang mit Smart Contracts beziehen sich formale Spezifikationen auf _Eigenschaften_ – formale Beschreibungen der Anforderungen, die ein Vertrag erfüllen muss. Solche Eigenschaften werden als „Invarianten“ bezeichnet und stellen logische Behauptungen über die Ausführung eines Vertrags dar, die unter allen möglichen Umständen und ohne Ausnahmen wahr bleiben müssen. Wir können uns eine formale Spezifizierung also als eine Sammlung von Aussagen vorstellen, die in einer formalen Sprache geschrieben sind und die beabsichtigte Ausführung eines Smart Contracts beschreiben. Spezifizierungen umfassen die Eigenschaften eines Vertrags und legen fest, wie sich der Vertrag unter verschiedenen Umständen verhalten soll. Der Zweck der formalen Verifizierung besteht darin, festzustellen, ob ein Smart Contract diese Eigenschaften (Invarianten) besitzt, und sicherzugehen, dass während der Ausführung nicht gegen diese Eigenschaften verstoßen wird. Formale Spezifizierungen sind entscheidend für die Entwicklung sicherer Implementierungen von Smart Contracts. Verträge, für die eine Implementierung von Invarianten nicht gelingt, oder gegen deren Eigenschaften während der Ausführung verstoßen wird, sind anfällig für Sicherheitslücken, die die Funktionalität beeinträchtigen oder böswillige Angriffe ermöglichen können. -## Verschiedene Arten formaler Spezifizierungen für Smart Contracts {#formal-specifications-for-smart-contracts} +## Arten von formalen Spezifikationen für Smart Contracts {#formal-specifications-for-smart-contracts} Formale Spezifizierungen ermöglichen mathematische Schlussfolgerungen über die Korrektheit der Programmausführung. Wie bei formalen Modellen können formale Spezifizierungen entweder die High-Level-Eigenschaften oder das Low-Level-Verhalten einer Vertragsimplementierung erfassen. -Formale Spezifizierungen werden aus Elementen der [Programmlogik](https://en.wikipedia.org/wiki/Logic_programming) abgeleitet, die formale Schlussfolgerungen über die Eigenschaften eines Programms ermöglichen. Eine Programmlogik enthält formale Regeln, die (in mathematischer Sprache) das erwartete Verhalten eines Programms ausdrücken. Verschiedene Programmlogiken werden zur Erstellung formaler Spezifizierungen verwendet, einschließlich [Erreichbarkeitslogik](https://en.wikipedia.org/wiki/Reachability_problem), [zeitliche Logik](https://en.wikipedia.org/wiki/Temporal_logic) und [Hoare-Logik](https://en.wikipedia.org/wiki/Hoare_logic). +Formale Spezifikationen werden aus Elementen der [Programmlogik](https://en.wikipedia.org/wiki/Logic_programming) abgeleitet, die formale Schlussfolgerungen über die Eigenschaften eines Programms ermöglichen. Eine Programmlogik enthält formale Regeln, die (in mathematischer Sprache) das erwartete Verhalten eines Programms ausdrücken. Bei der Erstellung formaler Spezifikationen werden verschiedene Programmlogiken verwendet, darunter die [Erreichbarkeitslogik](https://en.wikipedia.org/wiki/Reachability_problem), die [temporale Logik](https://en.wikipedia.org/wiki/Temporal_logic) und die [Hoare-Logik](https://en.wikipedia.org/wiki/Hoare_logic). -Formale Spezifizierungen für Smart Contracts lassen sich grob als **High-Level-** oder **Low-Level-**Spezifizierungen klassifizieren. Unabhängig davon, zu welcher Kategorie eine Spezifizierung gehört, muss sie die Eigenschaft des zu analysierenden Systems angemessen und eindeutig beschreiben. +Formale Spezifikationen für Smart Contracts lassen sich grob entweder als **High-Level**- oder **Low-Level**-Spezifikationen klassifizieren. Unabhängig davon, zu welcher Kategorie eine Spezifizierung gehört, muss sie die Eigenschaft des zu analysierenden Systems angemessen und eindeutig beschreiben. -### High-Level-Spezifizierungen {#high-level-specifications} +### High-Level-Spezifikationen {#high-level-specifications} -Wie der Name schon sagt, beschreibt eine High-Level-Spezifizierung (auch „modellorientierte Spezifizierung“ genannt) das High-Level-Verhalten eines Programms. High-Level-Spezifizierungen simulieren einen Smart Contract als [Zustandsmaschine](https://en.wikipedia.org/wiki/Finite-state_machine) (Finite State Machine, FSM), die aufgrund der Durchführung von Operationen zwischen Zuständen wechseln kann. In diesem Zusammenhang werden Zeitlogiken verwendet, um formale Eigenschaften für das FSM-Modell zu definieren. +Wie der Name schon sagt, beschreibt eine High-Level-Spezifizierung (auch „modellorientierte Spezifizierung“ genannt) das High-Level-Verhalten eines Programms. High-Level-Spezifikationen modellieren einen Smart Contract als [Zustandsmaschine](https://en.wikipedia.org/wiki/Finite-state_machine) (FSM), die durch die Ausführung von Operationen zwischen Zuständen übergehen kann, wobei temporale Logik verwendet wird, um formale Eigenschaften für das FSM-Modell zu definieren. -[Zeitlogiken](https://en.wikipedia.org/wiki/Temporal_logic) sind „Regeln für Schlussfolgerungen über Propositionen, die in Bezug auf die Zeit qualifiziert sind (z. B. „Ich bin _immer_ hungrig“ oder „Ich werde _letztendlich_ hungrig sein“).“ Werden Zeitlogiken auf die formale Verifizierung angewendet, werden mit ihnen Behauptungen über das korrekte Verhalten von Systemen aufgestellt, die als Zustandsmaschinen modelliert werden. Insbesondere beschreibt eine Zeitlogik die zukünftigen Zustände, die ein Smart Contract annehmen kann, und wie er zwischen den Zuständen wechselt. +[Temporale Logiken](https://en.wikipedia.org/wiki/Temporal_logic) sind \ Werden Zeitlogiken auf die formale Verifizierung angewendet, werden mit ihnen Behauptungen über das korrekte Verhalten von Systemen aufgestellt, die als Zustandsmaschinen modelliert werden. Insbesondere beschreibt eine Zeitlogik die zukünftigen Zustände, die ein Smart Contract annehmen kann, und wie er zwischen den Zuständen wechselt. -High-Level-Spezifizierungen erfassen im Allgemeinen zwei kritische zeitliche Eigenschaften für Smart Contracts: **Sicherheit** und **Liveness**. Sicherheitseigenschaften stehen für die Vorstellung, dass „nie irgendetwas Schlimmes passiert“, und drücken in der Regel Invarianz aus. Eine Sicherheitseigenschaft kann allgemeine Softwareanforderungen definieren, wie z. B. Freiheit von [Deadlocks](https://www.techtarget.com/whatis/definition/deadlock), oder Domänen-spezifische Eigenschaften für Verträge ausdrücken (z. B. Invarianten der Zugriffskontrolle für Funktionen, zulässige Werte von Zustandsvariablen oder Bedingungen für Token-Transfers). +High-Level-Spezifikationen erfassen im Allgemeinen zwei kritische temporale Eigenschaften für Smart Contracts: **Sicherheit** und **Liveness**. Sicherheitseigenschaften stehen für die Vorstellung, dass „nie irgendetwas Schlimmes passiert“, und drücken in der Regel Invarianz aus. Eine Sicherheitseigenschaft kann allgemeine Softwareanforderungen definieren, wie z. B. die Freiheit von [Deadlocks](https://www.techtarget.com/whatis/definition/deadlock), oder domänenspezifische Eigenschaften für Verträge ausdrücken (z. B. Invarianten bei der Zugriffskontrolle für Funktionen, zulässige Werte von Zustandsvariablen oder Bedingungen für Token-Transfers). -Nehmen Sie zum Beispiel diese Sicherheitsanforderung, die die Bedingungen für die Verwendung von `transfer()` oder `transferFrom()` in ERC-20-Token-Verträgen behandelt: _„Das Guthaben eines Absenders ist niemals niedriger als die angeforderte Menge der zu sendenden Token.“_. Diese Beschreibung einer Vertragsinvariante in natürlicher Sprache lässt sich in eine formale (mathematische) Spezifizierung übersetzen, die dann rigoros auf ihre Gültigkeit überprüft werden kann. +Nehmen Sie zum Beispiel diese Sicherheitsanforderung, die die Bedingungen für die Verwendung von `transfer()` oder `transferFrom()` in ERC-20-Token-Verträgen abdeckt: _„Das Guthaben eines Absenders ist niemals niedriger als die angeforderte Menge der zu sendenden Token.“_. Diese Beschreibung einer Vertragsinvariante in natürlicher Sprache lässt sich in eine formale (mathematische) Spezifizierung übersetzen, die dann rigoros auf ihre Gültigkeit überprüft werden kann. -Liveness-Eigenschaften besagen, dass „irgendwann etwas Gutes passiert“ und betreffen die Fähigkeit eines Vertrags, verschiedene Zustände zu durchlaufen. Ein Beispiel für eine Liveness-Eigenschaft ist die „Liquidität“, die sich auf die Fähigkeit eines Vertrags bezieht, sein Guthaben auf Anfrage an die Benutzer zu übertragen. Würde diese Eigenschaft verletzt, könnten Benutzer die im Vertrag gespeicherten Assets nicht mehr abheben, wie es im Rahmen des [Parity-Wallet-Vorfalls](https://www.cnbc.com/2017/11/08/accidental-bug-may-have-frozen-280-worth-of-ether-on-parity-wallet.html) geschah. +Liveness-Eigenschaften besagen, dass „irgendwann etwas Gutes passiert“ und betreffen die Fähigkeit eines Vertrags, verschiedene Zustände zu durchlaufen. Ein Beispiel für eine Liveness-Eigenschaft ist die „Liquidität“, die sich auf die Fähigkeit eines Vertrags bezieht, sein Guthaben auf Anfrage an die Benutzer zu übertragen. Wenn diese Eigenschaft verletzt wird, könnten Benutzer die im Vertrag gespeicherten Vermögenswerte nicht abheben, so wie es beim [Vorfall mit der Parity-Wallet](https://www.cnbc.com/2017/11/08/accidental-bug-may-have-frozen-280-worth-of-ether-on-parity-wallet.html) geschah. -### Low-Level-Spezifizierungen {#low-level-specifications} +### Low-Level-Spezifikationen {#low-level-specifications} High-Level-Spezifizierungen nehmen als Ausgangspunkt ein endliches Zustandsmodell eines Vertrags und definieren gewünschte Eigenschaften für dieses Modell. Im Gegensatz dazu modellieren Low-Level-Spezifizierungen (auch „eigenschaftsorientierte Spezifizierungen“ genannt) häufig Programme (Smart Contracts) als Systeme, die sich aus einer Sammlung von mathematischen Funktionen zusammensetzen, und beschreiben das korrekte Verhalten solcher Systeme. -Einfacher ausgedrückt: Low-Level-Spezifizierungen analysieren _Programmabläufe_ und versuchen, Eigenschaften eines Smart Contracts über diese Abläufe zu definieren. Abläufe beziehen sich auf Sequenzen von Funktionsausführungen, die den Zustand eines Smart Contracts verändern; daher helfen Low-Level-Spezifizierungen bei der Festlegung von Anforderungen an die interne Ausführung eines Vertrags. +Einfacher ausgedrückt: Low-Level-Spezifikationen analysieren _Programmabläufe_ und versuchen, Eigenschaften eines Smart Contracts über diese Abläufe zu definieren. Abläufe beziehen sich auf Sequenzen von Funktionsausführungen, die den Zustand eines Smart Contracts verändern; daher helfen Low-Level-Spezifizierungen bei der Festlegung von Anforderungen an die interne Ausführung eines Vertrags. Formale Spezifizierungen auf Low-Level-Ebene können in Form von entweder Eigenschaften im Hoare-Stil oder Invarianten auf Ausführungspfaden angegeben werden. -### Hoare-Stil-Eigenschaften {#hoare-style-properties} +### Eigenschaften im Hoare-Stil {#hoare-style-properties} -Die [Hoare-Logik](https://en.wikipedia.org/wiki/Hoare_logic) bietet eine Reihe von formalen Regeln für Schlussfolgerungen über die Korrektheit von Programmen, einschließlich der von Smart Contracts. Eine Eigenschaft im Hoare-Stil wird durch ein Hoare-Tripel `{P}c{Q}` dargestellt, wobei `c` ein Programm ist und `P` und `Q` Prädikate über den Zustand von `c` (d.h. das Programm) sind, die formal als _Präkonditionen_ bzw. _Postkonditionen_ beschrieben werden. +[Die Hoare-Logik](https://en.wikipedia.org/wiki/Hoare_logic) bietet eine Reihe von formalen Regeln für Schlussfolgerungen über die Korrektheit von Programmen, einschließlich Smart Contracts. Eine Eigenschaft im Hoare-Stil wird durch ein Hoare-Tripel `{P}c{Q}` dargestellt, wobei `c` ein Programm ist und `P` und `Q` Prädikate für den Zustand von `c` (d.h. des Programms) sind, die formal als _Vorbedingungen_ bzw. _Nachbedingungen_ beschrieben werden. -Eine Präkondition ist ein Prädikat, das die für die korrekte Ausführung einer Funktion erforderlichen Bedingungen beschreibt; Benutzer, die den Vertrag aufrufen, müssen diese Bedingung erfüllen. Eine Nachbedingung ist ein Prädikat, das die Bedingung beschreibt, die eine Funktion bei korrekter Ausführung festlegt; die Benutzer können davon ausgehen, dass diese Bedingung nach dem Aufruf der Funktion als erfüllt gilt. Eine _Invariante_ in der Hoare-Logik ist ein Prädikat, das durch die Ausführung einer Funktion erhalten bleibt (d. h. sich nicht verändert). +Eine Präkondition ist ein Prädikat, das die für die korrekte Ausführung einer Funktion erforderlichen Bedingungen beschreibt; Benutzer, die den Vertrag aufrufen, müssen diese Bedingung erfüllen. Eine Nachbedingung ist ein Prädikat, das die Bedingung beschreibt, die eine Funktion bei korrekter Ausführung festlegt; die Benutzer können davon ausgehen, dass diese Bedingung nach dem Aufruf der Funktion als erfüllt gilt. Eine _Invariante_ in der Hoare-Logik ist ein Prädikat, das bei der Ausführung einer Funktion erhalten bleibt (d. h. es ändert sich nicht). -Spezifizierungen im Hoare-Stil können entweder _teilweise Korrektheit_ oder _vollständige Korrektheit_ garantieren. Die Implementierung einer Vertragsfunktion ist „teilweise korrekt“, wenn die Vorbedingung erfüllt ist, bevor die Funktion ausgeführt wird, und sobald die Ausführung beendet ist, auch die Nachbedingung erfüllt ist. Ein Beweis für vollständige Korrektheit liegt vor, wenn eine Vorbedingung vor der Ausführung der Funktion wahr ist, die Ausführung garantiert beendet wird und, wenn das der Fall ist, die Nachbedingung wahr ist. +Spezifikationen im Hoare-Stil können entweder _partielle Korrektheit_ oder _totale Korrektheit_ garantieren. Die Implementierung einer Vertragsfunktion ist „teilweise korrekt“, wenn die Vorbedingung erfüllt ist, bevor die Funktion ausgeführt wird, und sobald die Ausführung beendet ist, auch die Nachbedingung erfüllt ist. Ein Beweis für vollständige Korrektheit liegt vor, wenn eine Vorbedingung vor der Ausführung der Funktion wahr ist, die Ausführung garantiert beendet wird und, wenn das der Fall ist, die Nachbedingung wahr ist. Der Nachweis der vollständigen Korrektheit ist schwierig, da einige Ausführungen sich verzögern können, bevor sie beendet werden, oder überhaupt nicht beendet werden. Abgesehen davon ist die Frage, ob die Ausführung beendet wird, ein strittiger Punkt, da der Gas-Mechanismus von Ethereum unendliche Programmschleifen verhindert (die Ausführung wird entweder erfolgreich beendet oder endet aufgrund eines „Out-of-Gas“-Fehlers). Die mit Hoare-Logik erstellten Spezifizierungen für Smart Contracts enthalten Vorbedingungen, Nachbedingungen und Invarianten für die Ausführung von Funktionen und Schleifen in einem Vertrag. Vorbedingungen beinhalten oft die Möglichkeit von fehlerhaften Eingaben für eine Funktion, wobei Nachbedingungen die erwartete Reaktion auf solche Eingaben beschreiben (z. B. das Auslösen einer bestimmten Ausnahme). Auf diese Weise sind Eigenschaften im Hoare-Stil eine wirksame Möglichkeit zur Gewährleistung der Korrektheit von Vertragsimplementierungen. -Viele formale Verifizierungs-Frameworks verwenden Spezifizierungen im Hoare-Stil, um die semantische Korrektheit von Funktionen zu beweisen. Es ist auch möglich, Eigenschaften im Hoare-Stil (als Behauptungen) direkt zum Vertragscode hinzuzufügen, indem die Aussagen `require` („erfordern“) und `assert` („behaupten“) in Solidity verwendet werden. +Viele formale Verifizierungs-Frameworks verwenden Spezifizierungen im Hoare-Stil, um die semantische Korrektheit von Funktionen zu beweisen. Es ist auch möglich, Eigenschaften im Hoare-Stil (als Zusicherungen) durch die Verwendung der `require`- und `assert`-Anweisungen in Solidity direkt zum Vertragscode hinzuzufügen. -`require`-Aussagen drücken eine Vorbedingung oder Invariante aus und werden häufig zur Validierung von Benutzereingaben verwendet, wohingegen `assert` eine für die Sicherheit notwendige Nachbedingung erfasst. Zum Beispiel kann eine angemessene Zugriffskontrolle für Funktionen (ein Beispiel für eine Sicherheitseigenschaft) mithilfe von `require` als Vorbedingungsprüfung der Identität des aufrufenden Kontos erreicht werden. Auf ähnliche Weise kann eine Invariante über zulässige Werte von Zustandsvariablen in einem Vertrag (z. B. die Gesamtzahl der sich im Umlauf befindlichen Token) vor einem Verstoß geschützt werden, indem `assert` verwendet wird, um den Zustand des Vertrags nach der Funktionsausführung zu bestätigen. +`require`-Anweisungen drücken eine Vorbedingung oder Invariante aus und werden oft verwendet, um Benutzereingaben zu validieren, während `assert` eine für die Sicherheit notwendige Nachbedingung erfasst. Beispielsweise kann eine ordnungsgemäße Zugriffskontrolle für Funktionen (ein Beispiel für eine Sicherheitseigenschaft) durch die Verwendung von `require` als Vorbedingungsprüfung der Identität des aufrufenden Kontos erreicht werden. In ähnlicher Weise kann eine Invariante für zulässige Werte von Zustandsvariablen in einem Vertrag (z. B. die Gesamtzahl der im Umlauf befindlichen Token) vor einer Verletzung geschützt werden, indem `assert` verwendet wird, um den Zustand des Vertrags nach der Ausführung der Funktion zu bestätigen. -### Eigenschaften auf Trace-Level {#trace-level-properties} +### Eigenschaften auf Trace-Ebene {#trace-level-properties} Trace-basierte Spezifizierungen beschreiben Vorgänge, die für den Wechsel eines Vertrag zwischen verschiedenen Zuständen sorgen, sowie die Beziehungen zwischen diesen Vorgängen. Wie bereits erläutert, handelt es sich bei Traces um Abfolgen von Vorgängen, die den Zustand eines Vertrags auf eine bestimmte Weise verändern. -Dieser Ansatz beruht auf einem Modell von Smart Contracts als Zustandswechselsystemen mit einigen vordefinierten Zuständen (beschrieben durch Zustandsvariablen) und einer Reihe von vordefinierten Wechseln (beschrieben durch Vertragsfunktionen). Darüber hinaus wird ein[Kontrollflussdiagramm](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/) („Control Flow Graph“, CFG), eine grafische Darstellung des Ausführungsflusses eines Programms, häufig zur Beschreibung der operativen Semantik eines Vertrags verwendet. Hier wird jede Trace als ein Pfad im Kontrollflussdiagramm dargestellt. +Dieser Ansatz beruht auf einem Modell von Smart Contracts als Zustandswechselsystemen mit einigen vordefinierten Zuständen (beschrieben durch Zustandsvariablen) und einer Reihe von vordefinierten Wechseln (beschrieben durch Vertragsfunktionen). Darüber hinaus wird häufig ein [Kontrollflussdiagramm](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/) (CFG), eine grafische Darstellung des Ausführungsflusses eines Programms, zur Beschreibung der operationalen Semantik eines Vertrags verwendet. Hier wird jede Trace als ein Pfad im Kontrollflussdiagramm dargestellt. In erster Linie werden Spezifizierungen auf Trace-Level eingesetzt, um Schlussfolgerungen über Muster bei der internen Ausführung von Smart Contracts zu ziehen. Durch die Erstellung von Spezifizierungen auf Trace-Level stellen wir die zulässigen Ausführungspfade (d. h. Zustandswechsel) für einen Smart Contract fest. Mithilfe von Techniken wie der symbolischen Ausführung können wir formal verifizieren, dass die Ausführung niemals einem Pfad folgt, der nicht im formalen Modell definiert ist. -Sehen wir uns das Beispiel eines [DAO](/dao/)-Vertrags an, der über einige öffentlich zugängliche Funktionen zur Beschreibung von Trace-Level-Eigenschaften verfügt. Hier gehen wir davon aus, dass der DAO-Vertrag den Benutzern die folgenden Vorgänge erlaubt: +Verwenden wir als Beispiel einen [DAO](/dao/)-Vertrag, der einige öffentlich zugängliche Funktionen hat, um Eigenschaften auf Trace-Ebene zu beschreiben. Hier gehen wir davon aus, dass der DAO-Vertrag den Benutzern die folgenden Vorgänge erlaubt: - Geldmittel einzahlen @@ -100,7 +100,7 @@ Sehen wir uns das Beispiel eines [DAO](/dao/)-Vertrags an, der über einige öff - Eine Rückerstattung beantragen, wenn nicht über einen Vorschlag abgestimmt wird -Beispiele für „Trace-Level“-Eigenschaften könnten folgendermaßen aussehen: _„Benutzer, die keine Geldmittel einzahlen, können nicht über einen Vorschlag abstimmen“_ oder _„Benutzer, die nicht über einen Vorschlag abstimmen, sollten immer die Möglichkeit haben, eine Rückerstattung zu beantragen“_. Beiden Eigenschaften liegen bevorzugte Ausführungsreihenfolgen zugrunde (die Abstimmung kann nicht _vor_ der Einzahlung von Geldmitteln erfolgen und die Beantragung einer Rückerstattung kann nicht _nach_ der Abstimmung über einen Vorschlag erfolgen). +Beispiele für Eigenschaften auf Trace-Ebene könnten sein: _„Benutzer, die keine Gelder einzahlen, können nicht über einen Vorschlag abstimmen“_ oder _„Benutzer, die nicht über einen Vorschlag abstimmen, sollten immer eine Rückerstattung beantragen können“_. Beide Eigenschaften sichern bevorzugte Ausführungsreihenfolgen zu (eine Abstimmung kann nicht _vor_ der Einzahlung von Geldern stattfinden und die Beantragung einer Rückerstattung kann nicht _nach_ der Abstimmung über einen Vorschlag erfolgen). ## Techniken zur formalen Verifizierung von Smart Contracts {#formal-verification-techniques} @@ -108,11 +108,11 @@ Beispiele für „Trace-Level“-Eigenschaften könnten folgendermaßen aussehen Die Modellprüfung ist eine formale Verifizierungstechnik, bei der ein Algorithmus ein formales Modell eines Smart Contracts gegen seine Spezifizierung prüft. Bei einer Modellprüfung werden Smart Contracts oft als Zustandsübergangssysteme dargestellt, wohingegen die Eigenschaften zulässiger Vertragszustände mithilfe der Zeitlogik definiert werden. -Die Modellprüfung erfordert die Erstellung einer abstrakten mathematischen Repräsentation eines Systems (z. B. eines Vertrags) und den Ausdruck von Eigenschaften dieses Systems durch Formeln, die in der [Aussagenlogik](https://www.baeldung.com/cs/propositional-logic) wurzeln. Dies vereinfacht die Aufgabe des Modellprüfungsalgorithmus, nämlich zu beweisen, dass ein mathematisches Modell eine gegebene logische Formel erfüllt. +Die Modellprüfung erfordert die Erstellung einer abstrakten mathematischen Darstellung eines Systems (d. h. eines Vertrags) und den Ausdruck von Eigenschaften dieses Systems mithilfe von Formeln, die in der [Aussagenlogik](https://www.baeldung.com/cs/propositional-logic) verwurzelt sind. Dies vereinfacht die Aufgabe des Modellprüfungsalgorithmus, nämlich zu beweisen, dass ein mathematisches Modell eine gegebene logische Formel erfüllt. -Die Modellprüfung in der formalen Verifizierung dient in erster Linie der Bewertung zeitlicher Eigenschaften, die das Verhalten eines Vertrags im Lauf der Zeit beschreiben. Zu den zeitlichen Eigenschaften von Smart Contracts gehören _Sicherheit_ und _Liveness_, die wir bereits erläutert haben. +Die Modellprüfung in der formalen Verifizierung dient in erster Linie der Bewertung zeitlicher Eigenschaften, die das Verhalten eines Vertrags im Lauf der Zeit beschreiben. Temporale Eigenschaften für Smart Contracts umfassen _Sicherheit_ und _Liveness_, die wir bereits erklärt haben. -Zum Beispiel kann eine Sicherheitseigenschaft, die sich auf Zugriffskontrollen bezieht (z. B., _Nur der Eigentümer des Vertrags kann `selfdestruct` („Selbstzerstörung“) aufrufen_), in formaler Logik geschrieben werden. Danach kann der Modellprüfungsalgorithmus verifizieren, ob der Vertrag diese formale Spezifizierung erfüllt. +Beispielsweise kann eine Sicherheitseigenschaft, die sich auf die Zugriffskontrolle bezieht (z. B. _Nur der Eigentümer des Vertrags kann `selfdestruct` aufrufen_), in formaler Logik geschrieben werden. Danach kann der Modellprüfungsalgorithmus verifizieren, ob der Vertrag diese formale Spezifizierung erfüllt. Bei der Modellprüfung wird der Zustandsraum erforscht, wobei alle möglichen Zustände eines Smart Contracts konstruiert werden und versucht wird, erreichbare Zustände zu finden, die zu Eigenschaftsverstößen führen. Dies kann jedoch zu einer unendlichen Anzahl von Zuständen führen (bekannt als „Problem der Zustandsexplosion“). Aus diesem Grund sind Modellprüfprogramme auf Abstraktionstechniken angewiesen, um eine effiziente Analyse von Smart Contracts zu ermöglichen. @@ -120,7 +120,7 @@ Bei der Modellprüfung wird der Zustandsraum erforscht, wobei alle möglichen Zu Der Theorembeweis ist eine Methode, um mathematische Schlussfolgerungen über die Korrektheit von Programmen, einschließlich Smart Contracts, zu ziehen. Es geht darum, das Modell eines Vertragssystems und seine Spezifizierungen in mathematische Formeln (Logikaussagen) zu transformieren. -Das Ziel des Theorembeweises ist es, die logische Äquivalenz zwischen diesen Aussagen zu verifizieren. „Logische Äquivalenz“ (auch „logische Bi-Implikation“ genannt) ist eine Art von Beziehung zwischen zwei Aussagen, wobei die erste Aussage wahr ist, _wenn und nur wenn_ die zweite Aussage wahr ist. +Das Ziel des Theorembeweises ist es, die logische Äquivalenz zwischen diesen Aussagen zu verifizieren. „Logische Äquivalenz“ (auch „logische Bi-Implikation“ genannt) ist eine Art von Beziehung zwischen zwei Aussagen, bei der die erste Aussage _genau dann_ wahr ist, _wenn_ die zweite Aussage wahr ist. Die geforderte Beziehung (logische Äquivalenz) zwischen Aussagen über das Modell eines Vertrages und seiner Eigenschaft wird als beweisbare Aussage (genannt „Theorem“) formuliert. Mithilfe eines formalen Inferenzsystems kann der automatisierte Theoremprüfer die Gültigkeit des Theorems verifizieren. Mit anderen Worten: Ein Theoremprüfer kann schlüssig beweisen, dass das Modell eines Smart Contracts genau seinen Spezifizierungen entspricht. @@ -130,13 +130,13 @@ Daher ist oft menschliche Hilfe erforderlich, um den Theoremprüfer bei der Able ### Symbolische Ausführung {#symbolic-execution} -Die symbolische Ausführung ist eine Methode zur Analyse eines Smart Contracts, bei der Funktionen mit _symbolischen Werten_ (z. B., `x > 5`) anstelle von _konkreten Werten_ (z. B., `x == 5`) ausgeführt werden. Als formale Verifizierungsstechnik wird die symbolische Ausführung eingesetzt, um auf formale Weise Schlussfolgerungen über die Trace-Level-Eigenschaften im Code eines Vertrags zu ziehen. +Symbolische Ausführung ist eine Methode zur Analyse eines Smart Contracts, bei der Funktionen mit _symbolischen Werten_ (z. B. `x > 5`) anstelle von _konkreten Werten_ (z. B. `x == 5`) ausgeführt werden. Als formale Verifizierungsstechnik wird die symbolische Ausführung eingesetzt, um auf formale Weise Schlussfolgerungen über die Trace-Level-Eigenschaften im Code eines Vertrags zu ziehen. -Die symbolische Ausführung stellt eine Ausführungs-Trace als mathematische Formel über symbolischen Eingabewerten dar, die auch als _Pfad-Prädikat_ bezeichnet werden. Ein [SMT Solver](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories) wird verwendet, um zu prüfen, ob ein Pfadprädikat „erfüllbar“ ist (d. h. ob es einen Wert gibt, der die Formel erfüllen kann). Wenn ein anfälliger Pfad erfüllbar ist, erzeugt der SMT Solver einen konkreten Wert, der die Ausführung in Richtung dieses Pfades auslöst und lenkt. +Die symbolische Ausführung stellt einen Ausführungs-Trace als mathematische Formel über symbolischen Eingabewerten dar, auch _Pfadprädikat_ genannt. Ein [SMT-Solver](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories) wird verwendet, um zu prüfen, ob ein Pfadprädikat \ Wenn ein anfälliger Pfad erfüllbar ist, erzeugt der SMT Solver einen konkreten Wert, der die Ausführung in Richtung dieses Pfades auslöst und lenkt. -Angenommen, eine Funktion eines Smart Contracts nimmt einen `uint`-Wert (`x`) als Eingabe an und macht dies rückgängig, wenn `x` größer als `5` und gleichzeitig kleiner als `10` ist. Damit ein Wert für `x` gefunden wird, der den Fehler im Rahmen eines normalen Testverfahrens auslöst, müssten Dutzende von Testfällen (oder mehr) durchlaufen werden, wobei keine Gewissheit besteht, dass tatsächlich eine fehlerauslösende Eingabe gefunden wird. +Angenommen, die Funktion eines Smart Contracts nimmt einen `uint`-Wert (`x`) als Eingabe entgegen und revertiert, wenn `x` größer als `5` und gleichzeitig kleiner als `10` ist. Einen Wert für `x` zu finden, der den Fehler auslöst, würde bei einem normalen Testverfahren das Durchlaufen von Dutzenden von Testfällen (oder mehr) erfordern, ohne die Gewissheit, tatsächlich eine fehlerverursachende Eingabe zu finden. -Umgekehrt würde ein Werkzeug zur symbolischen Ausführung die Funktion mit dem folgenden symbolischen Wert ausführen: `X > 5 ∧ X < 10` (d.h., `x` ist größer als 5 UND `x` ist kleiner als 10). Das zugehörige Pfadprädikat `x = X > 5 ∧ X < 10` würde dann an einen SMT Solver zur Lösung übergeben werden. Wenn ein bestimmter Wert die Formel `x = X > 5 ∧ X < 10` erfüllt, wird dieser vom SMT Solver berechnet – zum Beispiel könnte der Solver `7` als einen Wert für `x` berechnen. +Umgekehrt würde ein Werkzeug für die symbolische Ausführung die Funktion mit dem symbolischen Wert ausführen: `X > 5 ∧ X < 10` (d. h. `x` ist größer als 5 UND `x` ist kleiner als 10). Das zugehörige Pfadprädikat `x = X > 5 ∧ X < 10` würde dann einem SMT-Solver zur Lösung übergeben. Wenn ein bestimmter Wert die Formel `x = X > 5 ∧ X < 10` erfüllt, berechnet der SMT-Solver diesen – zum Beispiel könnte der Solver `7` als Wert für `x` ausgeben. Da die symbolische Ausführung auf Eingaben in ein Programm angewiesen ist und die Menge der Eingaben zur Erforschung aller erreichbaren Zustände potenziell unendlich ist, handelt es sich dabei dennoch um eine Form von Tests. Wie das Beispiel zeigt, ist die symbolische Ausführung jedoch effizienter als reguläre Tests, wenn es darum geht, Eingaben zu finden, die Eigenschaftsverstöße auslösen. @@ -152,15 +152,16 @@ function safe_add(uint x, uint y) returns(uint z){ require(z>=y); return z; +} ``` -Eine Ausführungs-Trace, die zu einem Ganzzahlüberlauf führt, müsste die folgende Formel erfüllen: `z = x + y UND (z >= x) UND (z=>y) UND (z < x ODER z < y)` Es ist unwahrscheinlich, dass solch eine Formel gelöst wird, daher dient sie als mathematischer Beweis, dass die Funktion `safe_add` niemals überläuft. +Ein Ausführungs-Trace, der zu einem Ganzzahlüberlauf führt, müsste die Formel erfüllen: `z = x + y AND (z >= x) AND (z >= y) AND (z < x OR z < y)` Eine solche Formel kann wahrscheinlich nicht gelöst werden, daher dient sie als mathematischer Beweis dafür, dass die Funktion `safe_add` niemals überläuft. -### Warum die formale Verifizierung für Smart Contracts? {#benefits-of-formal-verification} +### Warum die formale Verifizierung für Smart Contracts? Vorteile der formalen Verifizierung {#benefits-of-formal-verification} -#### Notwendigkeit der Zuverlässigkeit {#need-for-reliability} +#### Bedarf an Zuverlässigkeit {#need-for-reliability} -Die formale Verifizierung wird eingesetzt, um die Korrektheit sicherheitskritischer Systeme zu bewerten, deren Versagen verheerende Folgen haben kann, wie Tod, Verletzung oder finanziellen Ruin. Smart Contracts sind High-Value-Anwendungen, die enorme Werte kontrollieren, und einfache Fehler in ihrem Aufbau können zu [unwiederbringlichen Verlusten für die Benutzer](https://www.freecodecamp.org/news/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce/amp/) führen. Die formale Verifizierung eines Vertrags vor der Veröffentlichung kann jedoch die Garantien erhöhen, dass er wie erwartet funktioniert, sobald er auf der Blockchain läuft. +Die formale Verifizierung wird eingesetzt, um die Korrektheit sicherheitskritischer Systeme zu bewerten, deren Versagen verheerende Folgen haben kann, wie Tod, Verletzung oder finanziellen Ruin. Smart Contracts sind hochwertige Anwendungen, die enorme Werte kontrollieren, und einfache Designfehler können zu [irreversiblen Verlusten für Benutzer](https://www.freecodecamp.org/news/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce/amp/) führen. Die formale Verifizierung eines Vertrags vor der Veröffentlichung kann jedoch die Garantien erhöhen, dass er wie erwartet funktioniert, sobald er auf der Blockchain läuft. Zuverlässigkeit ist eine äußerst wünschenswerte Eigenschaft eines jeden Smart Contracts, insbesondere weil Code, der in der Ethereum Virtual Machine (EVM) veröffentlicht wurde, in der Regel unveränderbar ist. Da Upgrades nach dem Launch nicht ohne weiteres möglich sind, ist eine formale Verifizierung erforderlich, um die Zuverlässigkeit der Verträge zu gewährleisten. Dank formaler Verifizierung können heikle Probleme wie Ganzzahlunterläufe und -überläufe, Wiedereintritte und schlechte Gasoptimierungen erkannt werden, die Auditoren und Testern möglicherweise entgehen. @@ -168,9 +169,9 @@ Zuverlässigkeit ist eine äußerst wünschenswerte Eigenschaft eines jeden Smar Programmtests sind die gängigste Methode, um zu beweisen, dass ein Smart Contract bestimmte Anforderungen erfüllt. In diesem Zusammenhang wird ein Vertrag mit Beispieldaten, die verarbeitet werden sollen, ausgeführt und sein Verhalten analysiert. Wenn der Vertrag die erwarteten Ergebnisse für die Beispieldaten liefert, dann haben die Entwickler einen objektiven Beweis für seine Korrektheit. -Mit diesem Ansatz kann jedoch nicht die korrekte Ausführung für Eingabewerte bewiesen werden, die nicht Teil der Beispieldaten sind. Daher kann das Testen eines Vertrages dabei helfen, Bugs zu entdecken (z. B. wenn einige Codepfade während der Ausführung nicht die gewünschten Ergebnisse liefern), aber **es kann nicht schlüssig beweisen, dass keine Bugs vorhanden sind**. +Mit diesem Ansatz kann jedoch nicht die korrekte Ausführung für Eingabewerte bewiesen werden, die nicht Teil der Beispieldaten sind. Daher kann das Testen eines Vertrags helfen, Fehler zu entdecken (d. h. wenn einige Codepfade während der Ausführung nicht die gewünschten Ergebnisse liefern), aber **es kann nicht schlüssig die Abwesenheit von Fehlern beweisen**. -Umgekehrt kann mithilfe der formalen Verifizierung formal bewiesen werden, dass ein Smart Contract die Anforderungen für einen unendlichen Bereich von Ausführungen _erfüllt, ohne_ den Vertrag überhaupt auszuführen. Dies erfordert die Erstellung einer formalen Spezifizierung, die das korrekte Verhalten von Verträgen genau beschreibt, und die Entwicklung eines formalen (mathematischen) Modells für das System des Vertrags. Dann können wir ein formales Beweisverfahren anwenden, um die Konsistenz zwischen dem Vertragsmodell und seiner Spezifizierung zu überprüfen. +Umgekehrt kann die formale Verifizierung formal beweisen, dass ein Smart Contract die Anforderungen für einen unendlichen Bereich von Ausführungen erfüllt, _ohne_ den Vertrag überhaupt auszuführen. Dies erfordert die Erstellung einer formalen Spezifizierung, die das korrekte Verhalten von Verträgen genau beschreibt, und die Entwicklung eines formalen (mathematischen) Modells für das System des Vertrags. Dann können wir ein formales Beweisverfahren anwenden, um die Konsistenz zwischen dem Vertragsmodell und seiner Spezifizierung zu überprüfen. Bei der formalen Verifizierung ist die Frage, ob die Geschäftslogik eines Vertrags den Anforderungen entspricht, eine mathematische Proposition, die bewiesen oder widerlegt werden kann. Durch den formalen Beweis einer Proposition können wir eine unendliche Anzahl von Testfällen mit einer endlichen Anzahl von Schritten verifizieren. Auf diese Weise bestehen bei der formalen Verifizierung bessere Aussichten darauf, zu beweisen, dass ein Vertrag in Bezug auf eine Spezifizierung funktional korrekt ist. @@ -182,7 +183,7 @@ Smart Contracts erfüllen – zumindest bis zu einem gewissen Grad – beide Anf ### Schnellerer Entwicklungszyklus {#faster-development-cycle} -Formale Verifizierungstechniken wie die Modellprüfung und symbolische Ausführung sind in der Regel effizienter als die reguläre Analyse von Smart-Contract-Code (die im Rahmen von Tests oder Audits durchgeführt wird). Dies liegt daran, dass die formale Verifizierung auf symbolischen Werten beruht, um Behauptungen zu testen („Was, wenn ein Benutzer versucht, _n_ Ether abzuheben?“) – im Gegensatz zu Tests, bei denen konkrete Werte zum Einsatz kommen („Was, wenn ein Benutzer versucht, 5 Ether abzuheben?“). +Formale Verifizierungstechniken wie die Modellprüfung und symbolische Ausführung sind in der Regel effizienter als die reguläre Analyse von Smart-Contract-Code (die im Rahmen von Tests oder Audits durchgeführt wird). Dies liegt daran, dass die formale Verifizierung auf symbolischen Werten beruht, um Zusicherungen zu testen (\ im Gegensatz zu Tests, bei denen konkrete Werte zum Einsatz kommen („Was, wenn ein Benutzer versucht, 5 Ether abzuheben?“). Symbolische Eingabevariablen können mehrere Klassen konkreter Werte abdecken, sodass formale Verifizierungsansätze eine größere Codeabdeckung in kürzerer Zeit versprechen. Wenn sie effektiv eingesetzt wird, kann die formale Verifizierung den Entwicklungszyklus für Entwickler beschleunigen. @@ -196,88 +197,88 @@ Für die formale Verifizierung, insbesondere die halbautomatische Verifizierung, Aufgrund dieser Faktoren (Aufwand und Fähigkeiten) ist die formale Verifizierung anspruchsvoller und teurer als die üblichen Methoden zur Bewertung der Korrektheit von Verträgen, wie etwa Tests und Audits. Angesichts der Kosten von Fehlern bei der Implementierung von Smart Contracts ist es jedoch sinnvoll, die Kosten für ein vollständiges Verifizierungsaudit zu tragen. -### Falsch-negative Ergebnisse {#false-negatives} +### Falsch negative Ergebnisse {#false-negatives} Bei einer formalen Verifizierung kann nur geprüft werden, ob die Ausführung des Smart Contracts der formalen Spezifizierung entspricht. Daher muss sichergestellt werden, dass die Spezifizierung die erwarteten Verhaltensweisen eines Smart Contracts korrekt beschreibt. Wenn Spezifizierungen schlecht geschrieben sind, können Verstöße gegen Eigenschaften – die auf anfällige Ausführungen hinweisen – durch das formale Verifizierungsaudit nicht entdeckt werden. In diesem Fall könnte der Entwickler irrtümlicherweise zur Annahme verleitet werden, dass der Vertrag keine Bugs enthält. -### Probleme mit der Leistungsfähigkeit {#performance-issues} +### Performance-Probleme {#performance-issues} Bei der formalen Verifizierung kommt es zu einer Reihe von Leistungsproblemen. So können beispielsweise Probleme mit Zustands- und Pfadexplosionen, die bei der Modellprüfung bzw. der symbolischen Prüfung auftreten, die Verifizierungsverfahren beeinträchtigen. Außerdem kommen als Werkzeuge für formale Verifizierungen häufig SMT-Solver und andere Constraint-Solver auf ihrer zugrunde liegenden Ebene zum Einsatz, und diese Solver sind auf rechenintensive Verfahren angewiesen. -Außerdem ist es für Programm-Verifizierer nicht immer möglich, festzustellen, ob eine (als logische Formel beschriebene) Eigenschaft erfüllt werden kann oder nicht (das „[Entscheidbarkeitsproblem](https://en.wikipedia.org/wiki/Decision_problem)“), da ein Programm möglicherweise nie endet. Daher kann es unmöglich sein, einige Eigenschaften eines Vertrags nachzuweisen, selbst wenn er gut spezifiziert ist. +Außerdem ist es für Programmverifizierer nicht immer möglich festzustellen, ob eine Eigenschaft (als logische Formel beschrieben) erfüllt werden kann oder nicht (das \ Daher kann es unmöglich sein, einige Eigenschaften eines Vertrags nachzuweisen, selbst wenn er gut spezifiziert ist. -## Werkzeuge zur formalen Verifizierung von Ethereum-Smart-Contracts {#formal-verification-tools} +## Werkzeuge zur formalen Verifizierung für Ethereum-Smart-Contracts {#formal-verification-tools} -### Spezifizierungssprachen zur Erstellung formaler Spezifizierungen {#specification-languages} +### Spezifikationssprachen zur Erstellung formaler Spezifikationen {#specification-languages} -**Act**: _*Act ermöglicht die Spezifizierung von Speicher-Updates, Vor- und Nachbedingungen und Vertragsinvarianten. Die Tool-Suite verfügt auch über Proof Backends, die viele Eigenschaften über Coq, SMT Solver oder hevm beweisen können.** +**Act**: __Act ermöglicht die Spezifikation von Speicher-Updates, Vor-/Nachbedingungen und Vertragsinvarianten.__ Die Tool-Suite verfügt auch über Proof Backends, die viele Eigenschaften über Coq, SMT Solver oder hevm beweisen können.\*_ - [GitHub](https://github.com/ethereum/act) -- [Dokumentation](https://ethereum.github.io/act/) +- [Dokumentation](https://github.com/argotorg/act) -**Scribble** - _*Scribble wandelt Code-Annotationen in der Scribble-Spezifizierungssprache in konkrete Behauptungen um, die die Spezifizierung überprüfen.** +**Scribble** – __Scribble wandelt Code-Annotationen in der Scribble-Spezifikationssprache in konkrete Zusicherungen um, die die Spezifikation überprüfen.__ - [Dokumentation](https://docs.scribble.codes/) -**Dafny** – _*Dafny ist eine verifizierungsbereite Programmiersprache, die sich auf High-Level-Annotationen stützt, um Schlussfolgerungen über den Code zu ziehen und dessen Korrektheit zu beweisen.** +**Dafny** – __Dafny ist eine verifizierungsbereite Programmiersprache, die auf High-Level-Annotationen beruht, um über die Korrektheit von Code zu schlussfolgern und diese zu beweisen.__ - [GitHub](https://github.com/dafny-lang/dafny) ### Programmverifizierer zur Überprüfung der Korrektheit {#program-verifiers} -**Certora Prover** – _Certora Prover ist ein automatisches, formales Verifizierungstool zur Überprüfung der Korrektheit von Code in Smart Contracts. Die Spezifizierungen werden in CVL (Certora Verification Language) geschrieben, wobei Verstöße gegen Eigenschaften durch eine Kombination aus statischer Analyse und Constraint Solving aufgedeckt werden._ +**Certora Prover** – _Certora Prover ist ein automatisches formales Verifizierungswerkzeug zur Überprüfung der Code-Korrektheit in Smart Contracts._ Die Spezifizierungen werden in CVL (Certora Verification Language) geschrieben, wobei Verstöße gegen Eigenschaften durch eine Kombination aus statischer Analyse und Constraint Solving aufgedeckt werden._ - [Website](https://www.certora.com/) - [Dokumentation](https://docs.certora.com/en/latest/index.html) -**Solidity SMTChecker** – _*Der SMTChecker von Solidity ist ein eingebauter Model Checker, der auf SMT (Satisfiability Modulo Theories) und Horn Solving basiert. Er bestätigt, ob der Quellcode eines Vertrags während der Kompilierung mit den Spezifizierungen übereinstimmt und prüft statisch auf Verstöße gegen die Sicherheitseigenschaften.** +**Solidity SMTChecker** – __Der SMTChecker von Solidity ist ein integrierter Modellprüfer, der auf SMT (Satisfiability Modulo Theories) und Horn-Solving basiert.__ Er bestätigt, ob der Quellcode eines Vertrags während der Kompilierung mit den Spezifizierungen übereinstimmt und prüft statisch auf Verstöße gegen die Sicherheitseigenschaften.\*_ - [GitHub](https://github.com/ethereum/solidity) -**solc-verify** – _*solc-verify ist eine erweiterte Version des Solidity-Compilers, die automatisierte formale Verifizierungen von Solidity-Code mithilfe von Annotationen und modularer Programmverifizierung durchführen kann.** +**solc-verify** – __solc-verify ist eine erweiterte Version des Solidity-Compilers, die eine automatisierte formale Verifizierung von Solidity-Code mithilfe von Annotationen und modularer Programmverifizierung durchführen kann.__ - [GitHub](https://github.com/SRI-CSL/solidity) -**KEVM** – _*KEVM ist eine formale Semantik der Ethereum Virtual Machine (EVM), die im K-Framework geschrieben wurde. KEVM ist ausführbar und kann bestimmte eigenschaftsbezogene Behauptungen mithilfe der Erreichbarkeitslogik beweisen.** +**KEVM** – __KEVM ist eine formale Semantik der Ethereum Virtual Machine (EVM), die im K-Framework geschrieben ist.__ KEVM ist ausführbar und kann bestimmte eigenschaftsbezogene Behauptungen mithilfe der Erreichbarkeitslogik beweisen.\*_ - [GitHub](https://github.com/runtimeverification/evm-semantics) - [Dokumentation](https://jellopaper.org/) ### Logische Frameworks für den Theorembeweis {#theorem-provers} -**Isabelle** – _Isabelle/HOL ist ein Beweisassistent, der es ermöglicht, mathematische Formeln in einer formalen Sprache auszudrücken, und Werkzeuge zum Beweisen dieser Formeln bereitstellt. Seine Hauptanwendung ist die Formalisierung mathematischer Beweise und insbesondere die formale Verifizierung, die den Nachweis der Korrektheit von Computerhardware oder -software und den Nachweis der Eigenschaften von Computersprachen und -protokollen umfasst._ +**Isabelle** – _Isabelle/HOL ist ein Beweisassistent, der es ermöglicht, mathematische Formeln in einer formalen Sprache auszudrücken und Werkzeuge zum Beweisen dieser Formeln bereitstellt._ Seine Hauptanwendung ist die Formalisierung mathematischer Beweise und insbesondere die formale Verifizierung, die den Nachweis der Korrektheit von Computerhardware oder -software und den Nachweis der Eigenschaften von Computersprachen und -protokollen umfasst._ - [GitHub](https://github.com/isabelle-prover) - [Dokumentation](https://isabelle.in.tum.de/documentation.html) -**Coq** – _Coq ist ein interaktiver Theorem-Prüfer, mit dem sich Programme unter Verwendung von Theoremen definieren und interaktiv maschinengeprüfte Korrektheitsbeweise erzeugen lassen._ +**Rocq** – _Rocq ist ein interaktiver Theorembeweiser, mit dem Sie Programme mithilfe von Theoremen definieren und interaktiv maschinell geprüfte Korrektheitsnachweise erstellen können._ -- [GitHub](https://github.com/coq/coq) -- [Dokumentation](https://coq.github.io/doc/v8.13/refman/index.html) +- [GitHub](https://github.com/rocq-prover/rocq) +- [Dokumentation](https://rocq-prover.org/docs) -### Auf symbolischer Durchführung basierende Werkzeuge zur Erkennung anfälliger Muster in Smart Contracts {#symbolic-execution-tools} +### Auf symbolischer Ausführung basierende Werkzeuge zur Erkennung anfälliger Muster in Smart Contracts {#symbolic-execution-tools} -**Manticore** – _*Ein Tool zur Analyse des EVM-Bytecodes basierend auf symbolischer Ausführung*.* +**Manticore** – __Ein Werkzeug zur Analyse von EVM-Bytecode, das auf symbolischer Ausführung basiert.__ - [GitHub](https://github.com/trailofbits/manticore) - [Dokumentation](https://github.com/trailofbits/manticore/wiki) -**hevm** – _*hevm ist eine symbolische Ausführungsengine und ein Äquivalenzprüfer für EVM-Bytecode.** +**hevm** – __hevm ist eine symbolische Ausführungs-Engine und ein Äquivalenzprüfer für EVM-Bytecode.__ - [GitHub](https://github.com/dapphub/dapptools/tree/master/src/hevm) -**Mythril** - _Ein Werkzeug zur symbolischen Ausführung zum Erkennen von Schwachstellen in Ethereum-Smart-Contracts_ +**Mythril** – _Ein Werkzeug für die symbolische Ausführung zur Erkennung von Schwachstellen in Ethereum-Smart-Contracts_ - [GitHub](https://github.com/ConsenSys/mythril-classic) - [Dokumentation](https://mythril-classic.readthedocs.io/en/develop/) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Wie die formale Verifizierung von Smart Contracts funktioniert](https://runtimeverification.com/blog/how-formal-verification-of-smart-contracts-works/) -- [Wie die formale Verifizierung fehlerfreie Smart Contracts sicherstellen kann](https://media.consensys.net/how-formal-verification-can-ensure-flawless-smart-contracts-cbda8ad99bd1) -- [Ein Überblick über Projekte zur formalen Verifizierung im Ethereum-Ökosystem](https://github.com/leonardoalt/ethereum_formal_verification_overview) -- [Formale End-to-End-Verifizierung des Ethereum 2.0 Deposit Smart Contract](https://runtimeverification.com/blog/end-to-end-formal-verification-of-ethereum-2-0-deposit-smart-contract/) -- [Die formale Verifizierung der weltweit populärsten Smart Contracts](https://www.zellic.io/blog/formal-verification-weth) +- [Wie formale Verifizierung fehlerfreie Smart Contracts gewährleisten kann](https://media.consensys.net/how-formal-verification-can-ensure-flawless-smart-contracts-cbda8ad99bd1) +- [Ein Überblick über formale Verifizierungsprojekte im Ethereum-Ökosystem](https://github.com/leonardoalt/ethereum_formal_verification_overview) +- [Durchgängige formale Verifizierung des Ethereum 2.0 Einzahlungs-Smart-Contracts](https://runtimeverification.com/blog/end-to-end-formal-verification-of-ethereum-2-0-deposit-smart-contract/) +- [Formale Verifizierung des beliebtesten Smart Contracts der Welt](https://www.zellic.io/blog/formal-verification-weth) - [SMTChecker und formale Verifizierung](https://docs.soliditylang.org/en/v0.8.15/smtchecker.html) diff --git a/public/content/translations/de/developers/docs/smart-contracts/index.md b/public/content/translations/de/developers/docs/smart-contracts/index.md index c858d676332..d661d6a543c 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/index.md @@ -4,7 +4,7 @@ description: Eine Übersicht zu Smart Contracts mit dem Fokus auf ihre einzigart lang: de --- -## Was ist ein Smart Contract? {#what-is-a-smart-contract} +## Was ist ein Smart Contract? Was ist ein Smart Contract? {#what-is-a-smart-contract} Ein "Smart Contract" oder intelligenter Vertrag ist einfach ein Programm, das auf der Ethereum-Blockchain läuft. Es ist eine Sammlung von Anweisungen (seinen Funktionen) und Daten (seinem Zustand), die sich an einer bestimmten Adresse in der Ethereum-Blockchain befindet. @@ -12,9 +12,9 @@ Smart Contracts sind eine Art [Ethereum-Konto](/developers/docs/accounts/). Das ## Voraussetzungen {#prerequisites} -Wenn Sie gerade erst anfangen, sich mit dem Thema zu beschäftigen, oder auf der Suche nach einer weniger technischen Einführung sind, empfehlen wir Ihnen unsere [Einführung in Smart Contracts](/smart-contracts/). +Wenn Sie gerade erst anfangen oder nach einer weniger technischen Einführung suchen, empfehlen wir unsere [Einführung in Smart Contracts](/smart-contracts/). -Machen Sie sich mit [Konten](/developers/docs/accounts/), [Transaktionen](/developers/docs/transactions/) und der [Ethereum-Virtual Machine](/developers/docs/evm/) vertraut, bevor Sie in die Welt der Smart Contracts einsteigen. +Lesen Sie unbedingt die Informationen zu [Konten](/developers/docs/accounts/), [Transaktionen](/developers/docs/transactions/) und der [Ethereum Virtual Machine](/developers/docs/evm/), bevor Sie in die Welt der Smart Contracts eintauchen. ## Ein digitaler Verkaufsautomat {#a-digital-vending-machine} @@ -33,30 +33,30 @@ Einem Smart Contract wurde, wie auch einem Verkaufsautomaten, eine Logik einprog ```solidity pragma solidity 0.8.7; -contract Verkaufsautomat { +contract VendingMachine { - // Deklariere Zustandsvariablen des Vertrags + // Zustandsvariablen des Vertrags deklarieren address public owner; - mapping (address => uint) public toertchenBestand; + mapping (address => uint) public cupcakeBalances; - // Wenn der 'Verkaufsautomat'-Vertrag bereitgestellt wird: - // 1. Setze die Bereitstellungsadresse als Eigentümer des Vertrags - // 2. set the deployed smart contract's cupcake balance to 100 + // Wenn der „VendingMachine“-Vertrag bereitgestellt wird: + // 1. Die bereitstellende Adresse als Eigentümer des Vertrags festlegen + // 2. Den Cupcake-Bestand des bereitgestellten Smart Contracts auf 100 setzen constructor() { owner = msg.sender; cupcakeBalances[address(this)] = 100; } - // Allow the owner to increase the smart contract's cupcake balance + // Dem Eigentümer erlauben, den Cupcake-Bestand des Smart Contracts zu erhöhen function refill(uint amount) public { - require(msg.sender == owner, "Only the owner can refill."); + require(msg.sender == owner, "Nur der Eigentümer kann nachfüllen."); cupcakeBalances[address(this)] += amount; } - // Allow anyone to purchase cupcakes + // Jedem erlauben, Cupcakes zu kaufen function purchase(uint amount) public payable { - require(msg.value >= amount * 1 ether, "You must pay at least 1 ETH per cupcake"); - require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase"); + require(msg.value >= amount * 1 ether, "Sie müssen mindestens 1 ETH pro Cupcake bezahlen"); + require(cupcakeBalances[address(this)] >= amount, "Nicht genügend Cupcakes auf Lager, um diesen Kauf abzuschließen"); cupcakeBalances[address(this)] -= amount; cupcakeBalances[msg.sender] += amount; } @@ -67,46 +67,46 @@ Wenn ein Verkaufsautomat vorhanden ist, benötigt man keinen Verkäufer mehr. Ge ## Genehmigungsfrei {#permissionless} -Jeder kann einen Smart Contract erstellen und ihn im Netzwerk bereitstellen. Sie müssen nur lernen, wie Sie in einer [intelligenten Vertragssprache](/developers/docs/smart-contracts/languages/) codieren. Zudem benötigen Sie ausreichend ETH, um Ihren Vertrag bereitzustellen. Das Bereitstellen eines Smart Contracts ist technisch gesehen eine Transaktion, so dass Sie [Gas](/developers/docs/gas/) bezahlen müssen wie für eine einfache ETH-Überweisung. Allerdings sind die Gaskosten für die Vertragsbereitstellung weitaus höher. +Jeder kann einen Smart Contract erstellen und ihn im Netzwerk bereitstellen. Sie müssen nur lernen, wie man in einer [Smart-Contract-Sprache](/developers/docs/smart-contracts/languages/) programmiert und genügend ETH besitzt, um Ihren Vertrag bereitzustellen. Das Bereitstellen eines Smart Contracts ist technisch gesehen eine Transaktion, also müssen Sie [Gas](/developers/docs/gas/) auf die gleiche Weise bezahlen wie für eine einfache ETH-Überweisung. Allerdings sind die Gaskosten für die Vertragsbereitstellung weitaus höher. Ethereum bietet entwicklerfreundliche Sprachen zum Schreiben von Smart Contracts: - Solidity - Vyper -[Mehr zu den Sprachen](/developers/docs/smart-contracts/languages/) +[Mehr über Sprachen](/developers/docs/smart-contracts/languages/) -Allerdings müssen sie kompiliert werden, bevor sie bereitgestellt werden können, damit die Ethereum-Virtual Machine den Vertrag interpretieren und speichern kann. [Mehr zum Kompilieren](/developers/docs/smart-contracts/compiling/) +Allerdings müssen sie kompiliert werden, bevor sie bereitgestellt werden können, damit die Ethereum-Virtual Machine den Vertrag interpretieren und speichern kann. [Mehr zur Kompilierung](/developers/docs/smart-contracts/compiling/) -## Komposition {#composability} +## Zusammensetzbarkeit {#composability} Smart Contracts sind auf Ethereum öffentlich. Sie können sie sich als offene APIs vorstellen. Das bedeutet, dass Sie andere Smart Contracts in Ihrem eigenen Smart Contract aufrufen können, um die Anwendungsmöglichkeiten deutlich zu erweitern. Verträge können sogar andere Verträge bereitstellen. -Erfahren Sie mehr über die [Kombinierbarkeit von Smart Contracts](/developers/docs/smart-contracts/composability/). +Erfahren Sie mehr über die [Zusammensetzbarkeit von Smart Contracts](/developers/docs/smart-contracts/composability/). ## Einschränkungen {#limitations} Smart Contracts allein können keine Informationen über „echte Welt“-Ereignisse erhalten, da sie keine Daten von Offchain-Quellen abrufen können. Das bedeutet, dass sie nicht auf Ereignisse in der realen Welt reagieren können. Das ist beabsichtigt. Sich auf externe Informationen zu verlassen, könnte den für Sicherheit und Dezentralisierung wichtigen Konsens gefährden. -Allerdings ist es wichtig, dass Blockchain-Anwendungen Off-Chain-Daten nutzen können. Die Lösung sind [Orakel](/developers/docs/oracles/), also Werkzeuge, die Off-Chain-Daten aufnehmen und sie für Smart Contracts verfügbar machen. +Allerdings ist es wichtig, dass Blockchain-Anwendungen Off-Chain-Daten nutzen können. Die Lösung sind [Orakel](/developers/docs/oracles/), Werkzeuge, die Off-Chain-Daten aufnehmen und sie für Smart Contracts verfügbar machen. -Eine weitere Einschränkung von Smart Contracts ist die maximale Vertragsgröße. Ein Smart Contract kann maximal 24 KB groß sein, sonst gehen ihm die Ressourcen aus. Das kann mit [The Diamond Pattern](https://eips.ethereum.org/EIPS/eip-2535) behoben werden. +Eine weitere Einschränkung von Smart Contracts ist die maximale Vertragsgröße. Ein Smart Contract kann maximal 24 KB groß sein, sonst gehen ihm die Ressourcen aus. Dies kann durch die Verwendung des [Diamond Pattern](https://eips.ethereum.org/EIPS/eip-2535) umgangen werden. ## Multisig-Verträge {#multisig} -Multisig-Verträge (multiple Signaturen) sind Smart Contract-Accounts, die mehrere gültige Unterschriften erfordern, um eine Transaktion durchzuführen. Dies ist sehr nützlich, um einzelne Schwachstellen bei Verträgen zu vermeiden, die große Mengen an Ether oder anderen Token enthalten. Multisig-Verträge teilen außerdem die Verantwortung für die Vertragsausführung und die Schlüsselverwaltung auf mehrere Parteien auf und verhindern den Verlust eines einzigen privaten Schlüssels, der sonst zu einem irreversiblen Verlust von Geldern führt. Aus diesen Gründen können Multisig-Verträge für eine einfache DAO-Governance verwendet werden. Multisig-Verträge erfordern N Unterschriften von M möglichen akzeptablen Unterschriften (wobei N ≤ M und M > 1), um ausgeführt werden zu können. Üblicherweise werden `N = 3, M = 5` und `N = 4, M = 7` verwendet. Ein 4/7-Multisig-Vertrag erfordert vier von sieben möglichen gültigen Unterschriften. Das bedeutet, dass die Gelder auch dann noch abrufbar sind, wenn drei Unterschriften verloren gehen. In diesem Fall bedeutet es auch, dass die Mehrheit der Schlüsselinhaber zustimmen und unterschreiben muss, damit der Vertrag ausgeführt werden kann. +Multisig-Verträge (multiple Signaturen) sind Smart Contract-Accounts, die mehrere gültige Unterschriften erfordern, um eine Transaktion durchzuführen. Dies ist sehr nützlich, um einzelne Schwachstellen bei Verträgen zu vermeiden, die große Mengen an Ether oder anderen Token enthalten. Multisig-Verträge teilen außerdem die Verantwortung für die Vertragsausführung und die Schlüsselverwaltung auf mehrere Parteien auf und verhindern den Verlust eines einzigen privaten Schlüssels, der sonst zu einem irreversiblen Verlust von Geldern führt. Aus diesen Gründen können Multisig-Verträge für eine einfache DAO-Governance verwendet werden. Multisigs erfordern N von M möglichen akzeptablen Signaturen (wobei N ≤ M und M > 1), um ausgeführt zu werden. `N = 3, M = 5` und `N = 4, M = 7` werden häufig verwendet. Ein 4/7-Multisig-Vertrag erfordert vier von sieben möglichen gültigen Unterschriften. Das bedeutet, dass die Gelder auch dann noch abrufbar sind, wenn drei Unterschriften verloren gehen. In diesem Fall bedeutet es auch, dass die Mehrheit der Schlüsselinhaber zustimmen und unterschreiben muss, damit der Vertrag ausgeführt werden kann. ## Ressourcen für Smart Contracts {#smart-contract-resources} -**OpenZeppelin Contracts –** **_Bibliothek für die sichere Entwicklung von Smart Contracts_** +**OpenZeppelin Contracts -** **_Bibliothek für die sichere Entwicklung von Smart Contracts._** - [openzeppelin.com/contracts/](https://openzeppelin.com/contracts/) - [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) - [Community-Forum](https://forum.openzeppelin.com/c/general/16) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Coinbase: Was ist ein Smart Contract?](https://www.coinbase.com/learn/crypto-basics/what-is-a-smart-contract) - [Chainlink: Was ist ein Smart Contract?](https://chain.link/education/smart-contracts) - [Video: Einfach erklärt – Smart Contracts](https://youtu.be/ZE2HxTmxfrI) -- [Cyfrin Updraft: Web3-Lern- und Auditierungsplattform](https://updraft.cyfrin.io) +- [Cyfrin Updraft: Web3-Lern- und Audit-Plattform](https://updraft.cyfrin.io) diff --git a/public/content/translations/de/developers/docs/smart-contracts/languages/index.md b/public/content/translations/de/developers/docs/smart-contracts/languages/index.md index ff70b59f9dc..aeb73970387 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/languages/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/languages/index.md @@ -4,16 +4,16 @@ description: Übersicht und Vergleich der zwei wichtigsten Smart-Contract-Sprach lang: de --- -Das Tolle an Ethereum ist, dass Smart Contracts mit relativ Entwickler-freundlichen Sprachen programmiert werden können. Wenn Sie mit Python oder einer anderen [Sprache mit geschweiften Klammern](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages) vertraut sind, können Sie eine Sprache mit vertrauter Syntax finden. +Das Tolle an Ethereum ist, dass Smart Contracts mit relativ Entwickler-freundlichen Sprachen programmiert werden können. Wenn Sie Erfahrung mit Python oder einer [Sprache mit geschweiften Klammern](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages) haben, können Sie eine Sprache mit vertrauter Syntax finden. Die zwei häufig genutzten und aktuellsten Sprachen sind: - Solidity - Vyper -Remix IDE bietet eine umfassende Entwicklungsumgebung zum Erstellen und Testen von Contracts in Solidity als auch in Vyper. [Probieren Sie die Remix IDE im Browser](https://remix.ethereum.org), um mit dem Codieren zu beginnen. +Remix IDE bietet eine umfassende Entwicklungsumgebung zum Erstellen und Testen von Contracts in Solidity als auch in Vyper. [Probieren Sie die Remix IDE im Browser aus](https://remix.ethereum.org), um mit dem Programmieren zu beginnen. -Für erfahrene Entwickler könnten außerdem Yul, eine intermediäre Sprache für die [Ethereum-Virtual Machine](/developers/docs/evm/), oder Yul+, eine Erweiterung für Yul, interessant sein. +Erfahrenere Entwickler möchten vielleicht auch Yul, eine Zwischensprache für die [Ethereum Virtual Machine](/developers/docs/evm/), oder Yul+, eine Erweiterung von Yul, verwenden. Wenn Sie neugierig sind und gerne dabei helfen, neue, noch in der Entwicklung befindliche Sprachen zu testen, können Sie mit Fe experimentieren, einer aufstrebenden Smart-Contract-Sprache, die derzeit noch in den Kinderschuhen steckt. @@ -34,15 +34,15 @@ Vorwissen über andere Programmiersprachen, insbesondere JavaScript oder Python, ### Wichtige Links {#important-links} - [Dokumentation](https://docs.soliditylang.org/en/latest/) -- [Solidity Sprachportal](https://soliditylang.org/) -- [Solidity am Beispiel](https://docs.soliditylang.org/en/latest/solidity-by-example.html) +- [Solidity-Sprachportal](https://soliditylang.org/) +- [Solidity by Example](https://docs.soliditylang.org/en/latest/solidity-by-example.html) - [GitHub](https://github.com/ethereum/solidity/) -- [Solidity Gitter Chatroom](https://gitter.im/ethereum/solidity) verbunden mit [Solidity Matrix Chatroom](https://matrix.to/#/#ethereum_solidity:gitter.im) +- [Solidity Gitter-Chatroom](https://gitter.im/ethereum/solidity) überbrückt zum [Solidity Matrix-Chatroom](https://matrix.to/#/#ethereum_solidity:gitter.im) - [Spickzettel](https://reference.auditless.com/cheatsheet) - [Solidity-Blog](https://blog.soliditylang.org/) -- [Solidity Twitter](https://twitter.com/solidity_lang) +- [Solidity auf Twitter](https://twitter.com/solidity_lang) -### Beispiel {#example-contract} +### Beispielvertrag {#example-contract} ```solidity // SPDX-License-Identifier: GPL-3.0 @@ -50,21 +50,21 @@ pragma solidity >= 0.7.0; contract Coin { // Das Schlüsselwort "public" macht Variablen - // für anderen Verträgen zugreifbar + // für andere Verträge zugänglich address public minter; mapping (address => uint) public balances; - // Ereignisse ermöglichen es Nutzern spezifisch auf - // von deklarierte Vertragsänderungen zu reagieren + // Ereignisse ermöglichen es Clients, auf bestimmte + // von Ihnen deklarierte Vertragsänderungen zu reagieren event Sent(address from, address to, uint amount); - // Die Konstruktoranweisungen werden nur ausgeführt wenn - // der Vertrag erstellt wird + // Konstruktor-Code wird nur ausgeführt, wenn der Vertrag + // erstellt wird constructor() { minter = msg.sender; } - // Sendet eine Anzahl neu erstellter Coins an eine Adresse + // Sendet eine Menge neu erstellter Münzen an eine Adresse // Kann nur vom Vertragsersteller aufgerufen werden function mint(address receiver, uint amount) public { require(msg.sender == minter); @@ -72,10 +72,10 @@ contract Coin { balances[receiver] += amount; } - // Sendet eine Anzahl vorhandener Coins - // von einem Aufrufer an eine Adresse + // Sendet eine Menge vorhandener Münzen + // von einem beliebigen Aufrufer an eine Adresse function send(address receiver, uint amount) public { - require(amount <= balances[msg.sender], "Insufficient balance."); + require(amount <= balances[msg.sender], "Guthaben nicht ausreichend."); balances[msg.sender] -= amount; balances[receiver] += amount; emit Sent(msg.sender, receiver, amount); @@ -83,12 +83,12 @@ contract Coin { } ``` -Dieses Beispiel soll ein Gefühl vermitteln, wie die Smart-Contract-Syntax in Solidity aussieht. Für eine ausführliche Beschreibung aller Funktionen und Variablen [sollten Sie die Dokumentation lesen](https://docs.soliditylang.org/en/latest/contracts.html). +Dieses Beispiel soll ein Gefühl vermitteln, wie die Smart-Contract-Syntax in Solidity aussieht. Eine detailliertere Beschreibung der Funktionen und Variablen finden Sie [in der Dokumentation](https://docs.soliditylang.org/en/latest/contracts.html). ## Vyper {#vyper} - Pythonische Programmiersprache -- Stark typisiert +- Starke Typisierung - Kompilierter Code ist kurz und nachvollziehbar - Effiziente Bytecode-Generierung - Hat beabsichtigterweise weniger Funktionen als Solidity – mit dem Ziel, die Smart Contracts sicherer und einfacherer auditierbar zu machen. Vyper bietet keine Untersützung für: @@ -101,29 +101,29 @@ Dieses Beispiel soll ein Gefühl vermitteln, wie die Smart-Contract-Syntax in So - Schleifen mit unendlicher Länge - Binäre Fixpunkte -Weitere Informationen finden Sie im [Vyper-Grundprinzip](https://vyper.readthedocs.io/en/latest/index.html). +Für weitere Informationen [lesen Sie die Begründung für Vyper](https://vyper.readthedocs.io/en/latest/index.html). ### Wichtige Links {#important-links-1} - [Dokumentation](https://vyper.readthedocs.io) -- [Vyper am Beispiel](https://vyper.readthedocs.io/en/latest/vyper-by-example.html) -- [Mehr Vyper am Beispiel](https://vyper-by-example.org/) +- [Vyper by Example](https://vyper.readthedocs.io/en/latest/vyper-by-example.html) +- [More Vyper by Example](https://vyper-by-example.org/) - [GitHub](https://github.com/vyperlang/vyper) -- [Vyper-Community Discord-Chat](https://discord.gg/SdvKC79cJk) +- [Vyper-Community-Discord-Chat](https://discord.gg/SdvKC79cJk) - [Spickzettel](https://reference.auditless.com/cheatsheet) -- [Entwicklungsframeworks für Smart Contracts und Tools für Vyper](/developers/docs/programming-languages/python/) -- [VyperPunk - Lernen Sie, Vyper Smart Contracts zu sichern und zu hacken](https://github.com/SupremacyTeam/VyperPunk) -- [Vyper Hub für Entwicklung](https://github.com/zcor/vyper-dev) -- [Vyper Greatest Hits Smart Contract – Beispiele](https://github.com/pynchmeister/vyper-greatest-hits/tree/main/contracts) -- [Großartige, sorgfältig ausgewählte Vyper-Ressourcen](https://github.com/spadebuilders/awesome-vyper) +- [Entwicklungsframeworks und Tools für Smart Contracts für Vyper](/developers/docs/programming-languages/python/) +- [VyperPunk – Lernen Sie, Vyper-Smart-Contracts zu sichern und zu hacken](https://github.com/SupremacyTeam/VyperPunk) +- [Vyper-Hub für die Entwicklung](https://github.com/zcor/vyper-dev) +- [Vyper Greatest Hits: Beispiele für Smart Contracts](https://github.com/pynchmeister/vyper-greatest-hits/tree/main/contracts) +- [Awesome Vyper – Kuratierte Ressourcen](https://github.com/spadebuilders/awesome-vyper) ### Beispiel {#example} ```python -# Öffne Auktion +# Offene Auktion # Auktionsparameter -# Begünstigter erhält Geld vom Meistbietenden +# Der Begünstigte erhält Geld vom Höchstbietenden beneficiary: public(address) auctionStart: public(uint256) auctionEnd: public(uint256) @@ -132,69 +132,69 @@ auctionEnd: public(uint256) highestBidder: public(address) highestBid: public(uint256) -# Setze am Ende auf wahr, um jede Änderung zu verbieten +# Wird am Ende auf „true“ gesetzt, verbietet jede Änderung ended: public(bool) -# Erstattete Gebote nachverfolgen, um dem Abhebemuster folgen zu können +# Nachverfolgung der zurückgezahlten Gebote, damit wir dem Auszahlungsmuster folgen können pendingReturns: public(HashMap[address, uint256]) -# Eine einfache Auktion mit `_bidding_time` -# Sekunden Bieterzeit für die -# Begünstigtenadresse `_beneficiary` erstellen. +# Erstellt eine einfache Auktion mit `_bidding_time` +# Sekunden Bietzeit im Namen der +# Begünstigten-Adresse `_beneficiary`. @external def __init__(_beneficiary: address, _bidding_time: uint256): self.beneficiary = _beneficiary self.auctionStart = block.timestamp self.auctionEnd = self.auctionStart + _bidding_time -# Biete in der Auktion mit dem Betrag der -# zusammen mit dieser Transaktion gesendet wurde. -# Der Betrag wird nur erstattet, wenn die -# Auktion nicht gewonnen wurde. +# Mit dem Wert, der zusammen mit dieser Transaktion +# gesendet wird, auf die Auktion bieten. +# Der Wert wird nur dann zurückerstattet, +# wenn die Auktion nicht gewonnen wird. @external @payable def bid(): - # Prüfe, ob die Bietezeit vorrüber ist. + # Prüfen, ob die Bietfrist abgelaufen ist. assert block.timestamp < self.auctionEnd - # Prüfe, ob Gebot hoch genug ist + # Prüfen, ob das Gebot hoch genug ist assert msg.value > self.highestBid - # Verfolge die Erstattung der vorigen Meistbietenden nach + # Rückerstattung für den vorherigen Höchstbietenden nachverfolgen self.pendingReturns[self.highestBidder] += self.highestBid - # Verfolge das neue Höchstgebot nach + # Neues Höchstgebot nachverfolgen self.highestBidder = msg.sender self.highestBid = msg.value -# Ziehe ein zuvor erstattetes Gebot zurück. Das Abhebemuster -# wird verwendet um ein Sicherheitsproblem zu vermeiden. Wenn Erstattungen direkt -# als Teil von bid() gesendet würden, könnte ein böswilliger Bieter-Vertrag -# diese Erstattungen blockieren und damit den Eingang neuer Höchstgebote. +# Ein zuvor erstattetes Gebot abheben. Das Auszahlungsmuster wird +# hier verwendet, um ein Sicherheitsproblem zu vermeiden. Wenn Rückerstattungen direkt +# als Teil von bid() gesendet würden, könnte ein bösartiger Bietvertrag +# diese Rückerstattungen blockieren und somit das Eingehen neuer, höherer Gebote verhindern. @external def withdraw(): pending_amount: uint256 = self.pendingReturns[msg.sender] self.pendingReturns[msg.sender] = 0 send(msg.sender, pending_amount) -# Beende die Auktion und sende das Höchstgebot -# an den Begünstigten. -@extern +# Die Auktion beenden und das höchste Gebot an +# den Begünstigten senden. +@external def endAuction(): - # Es ist eine gute Richtlinie, Funktionen zu strukturieren, die - # mit anderen Verträgen interagieren (d. h. sie rufen Funktionen auf oder senden Ether), - # in drei Phasen zu unterteilen: - # 1. Bedingungen prüfen - # 2. Aktionen ausführen (potentiell die Bedingungen ändernd) - # 3. mit anderen Verträgen interagieren - # Wenn diese Abschnitte vermischt werden, könnte der andere Vertrag - # zurück im aktuellen Vertrag ein Aufruf durchführen und den Zustand verändern oder - # Effekte (Ether-Auszahlung) mehrfach ausführen. - # Wenn interne Funktionen aufgerufen werden, die eine Interaktion mit externen - # Verträgen beinhalten, muss auch die Interaktion mit - # den externen Verträgen berücksichtigt werden. + # Es ist eine gute Richtlinie, Funktionen, die mit anderen Verträgen interagieren + # (d. h. sie rufen Funktionen auf oder senden Ether), + # in drei Phasen zu gliedern: + # 1. Überprüfung der Bedingungen + # 2. Ausführung von Aktionen (potenziell ändernde Bedingungen) + # 3. Interaktion mit anderen Verträgen + # Wenn diese Phasen vermischt werden, könnte der andere Vertrag + # in den aktuellen Vertrag zurückrufen und den Zustand ändern oder bewirken, + # dass Effekte (Ether-Auszahlung) mehrmals ausgeführt werden. + # Wenn intern aufgerufene Funktionen die Interaktion mit externen + # Verträgen beinhalten, müssen sie ebenfalls als Interaktion mit + # externen Verträgen betrachtet werden. # 1. Bedingungen - # Prüfe ob der Zeitpunkt des Auktionsendes erreicht wurde + # Prüfen, ob die Endzeit der Auktion erreicht ist assert block.timestamp >= self.auctionEnd - # Prüfe ob diese Funktion bereit aufgerufen wurde + # Prüfen, ob diese Funktion bereits aufgerufen wurde assert not self.ended # 2. Effekte @@ -204,7 +204,7 @@ def endAuction(): send(self.beneficiary, self.highestBid) ``` -Dieses Beispiel soll ein Gefühl vermitteln, wie die Smart-Contract-Syntax in Vyper aussieht. Eine ausführlicher Beschreibung aller Funktionen und Variablen [finden Sie in der Dokumentation](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction). +Dieses Beispiel soll ein Gefühl vermitteln, wie die Smart-Contract-Syntax in Vyper aussieht. Eine detailliertere Beschreibung der Funktionen und Variablen finden Sie [in der Dokumentation](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction). ## Yul und Yul+ {#yul} @@ -213,24 +213,25 @@ Falls Sie noch nicht mit Ethereum vertraut sind und Sie noch nie mit Smart-Contr **Yul** - Intermediäre Sprache für Ethereum. -- Unterstützt die [EVM](/developers/docs/evm) und [Ewasm](https://github.com/ewasm), eine Ethereum ähnliche WebAssembly, sie ist so konzipiert, dass sie ein nutzbarer gemeinsamer Nenner für beide Plattformen ist +- Unterstützt die [EVM](/developers/docs/evm) und [Ewasm](https://github.com/ewasm), ein WebAssembly im Ethereum-Stil, und ist als brauchbarer gemeinsamer Nenner beider Plattformen konzipiert. - Ein gutes Ziel für High-Level-Optimierungsstufen, von denen sowohl EVM als auch eWASM-Plattformen gleichermaßen profitieren können **Yul+** - Eine hocheffiziente Yul-Erweiterung auf unterer Ebene -- Wurde ursprünglich für einen [Optimistic Rollup](/developers/docs/scaling/optimistic-rollups/)-Vertrag konzipiert +- Ursprünglich für einen [Optimistic Rollup](/developers/docs/scaling/optimistic-rollups/)-Vertrag konzipiert. - Yul+ kann als ein Vorschlag für ein experimentelles Upgrade für Yul betrachtet werden, das neue Funktionen hinzufügt ### Wichtige Links {#important-links-2} - [Yul-Dokumentation](https://docs.soliditylang.org/en/latest/yul.html) - [Yul+-Dokumentation](https://github.com/fuellabs/yulp) -- [Yul+-Einführungsartikel](https://medium.com/@fuellabs/introducing-yul-a-new-low-level-language-for-ethereum-aa64ce89512f) +- [Yul+-Einführungsbeitrag](https://medium.com/@fuellabs/introducing-yul-a-new-low-level-language-for-ethereum-aa64ce89512f) -### Beispiel {#example-contract-2} +### Beispielvertrag {#example-contract-2} -Das folgende einfache Beispiel implementiert eine Power-Funktion. Es kann mit `solc --strict-assembly --bin input.yul` kompiliert werden. Das Beispiel sollte in der Datei "input.yul" gespeichert werden. +Das folgende einfache Beispiel implementiert eine Power-Funktion. Es kann mit `solc --strict-assembly --bin input.yul` kompiliert werden. Das Beispiel +sollte in der Datei "input.yul" gespeichert werden. ``` { @@ -251,7 +252,7 @@ Das folgende einfache Beispiel implementiert eine Power-Funktion. Es kann mit `s } ``` -Wenn Sie bereits Erfahrung mit Smart Contracts haben, finden Sie [hier](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example) eine vollständige ERC20-Implementierung in Yul. +Wenn Sie bereits viel Erfahrung mit Smart Contracts haben, finden Sie eine vollständige ERC20-Implementierung in Yul [hier](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example). ## Fe {#fe} @@ -264,11 +265,11 @@ Wenn Sie bereits Erfahrung mit Smart Contracts haben, finden Sie [hier](https:// - [GitHub](https://github.com/ethereum/fe) - [Fe-Ankündigung](https://snakecharmers.ethereum.org/fe-a-new-language-for-the-ethereum-ecosystem/) -- [Fe 2021-Roadmap](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg) -- [Fe-Chat auf Discord](https://discord.com/invite/ywpkAXFjZH) -- [Fe Twitter](https://twitter.com/official_fe) +- [Fe-Roadmap 2021](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg) +- [Fe Discord-Chat](https://discord.com/invite/ywpkAXFjZH) +- [Fe auf Twitter](https://twitter.com/official_fe) -### Beispiel {#example-contract-3} +### Beispielvertrag {#example-contract-3} Im Folgenden ist ein einfacher Vertrag in Fe implementiert: @@ -291,7 +292,7 @@ contract GuestBook: ``` -## So wählen Sie die richtige Sprache {#how-to-choose} +## Wie Sie die richtige Wahl treffen {#how-to-choose} Wie bei jeder anderen Programmiersprache geht es vor allem darum, das geeignete Tool für den richtigen Job nach den persönlichen Präferenzen zu wählen. @@ -299,7 +300,7 @@ Im Folgenden finden Sie einige Apsekte, die Sie in Betracht ziehen können, wenn ### Was ist gut an Solidity? {#solidity-advantages} -- Wenn Sie Anfänger sind, gibt es viele Tutorials und Lerntools. Mehr dazu finden Sie im Bereich [Beim Programmieren lernen](/developers/learning-tools/). +- Wenn Sie Anfänger sind, gibt es viele Tutorials und Lerntools. Weitere Informationen dazu finden Sie im Abschnitt [Lernen durch Programmieren](/developers/learning-tools/). - Gute Entwicklertools verfügbar - Solidity hat eine große Entwickler-Community. Das bedeutet, dass Sie höchstwahrscheinlich ziemlich schnell Antworten auf Ihre Fragen finden. @@ -314,11 +315,11 @@ Im Folgenden finden Sie einige Apsekte, die Sie in Betracht ziehen können, wenn - Einfache und funktionale Low-Level-Sprachen - Ermöglicht die Annäherung an rohe EVM, was dazu beitragen kann, den Ressourcnverbrauch Ihrer Smart Contracts zu optimieren. -## Vergleich zwischen den Sprachen {#language-comparisons} +## Sprachvergleiche {#language-comparisons} -Für Vergleiche von Basissyntax, des Vertragslebenszyklus, Schnittstellen, Operatoren, Datenstrukturen, Funktionen, Steuerungsfluss und mehr sollten Sie sich diesen [Spickzettel von Auditless](https://reference.auditless.com/cheatsheet/) ansehen. +Vergleiche von grundlegender Syntax, Vertragslebenszyklus, Schnittstellen, Operatoren, Datenstrukturen, Funktionen, Kontrollfluss und mehr finden Sie in diesem [Spickzettel von Auditless](https://reference.auditless.com/cheatsheet/) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Solidity-Vertragsbibliothek von OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/) -- [Solidity am Beispiel](https://solidity-by-example.org) +- [Solidity by Example](https://solidity-by-example.org) diff --git a/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md index 46a3bf0a4d4..e555015e6c5 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/libraries/index.md @@ -1,6 +1,6 @@ --- title: Smart Contract-Bibliotheken -description: +description: Entdecken Sie wiederverwendbare Smart Contract Bibliotheken und Bausteine, um Ihre Ethereum-Entwicklungsprojekte zu beschleunigen. lang: de --- @@ -8,19 +8,19 @@ Sie müssen in Ihrem Projekt nicht jeden Smart Contract von Grund auf neu erstel ## Voraussetzungen {#prerequisites} -Bevor wir in die Smart-Contract-Bibliothek einsteigen, ist es ratsam, sich mit den Grundlagen der Smart-Contract-Struktur vertraut zu machen. Falls noch nicht geschehen, sehen Sie sich die [Smart-Contract-Anatomie](/developers/docs/smart-contracts/anatomy/) an. +Bevor wir in die Smart-Contract-Bibliothek einsteigen, ist es ratsam, sich mit den Grundlagen der Smart-Contract-Struktur vertraut zu machen. Schaue bei der [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) vorbei, falls du das noch nicht getan hast. -## Was beinhaltet eine Bibliothek {#whats-in-a-library} +## Was steckt in einer Bibliothek? {#whats-in-a-library} Normalerweise finden Sie zwei Arten von Erstellungsblöcken in einer Smart Contract Bibliothek: wiederverwendbare Verhaltensweisen, die Sie Ihren Verträgen hinzufügen können, und die Implementierungen verschiedener Standards. ### Verhaltensweisen {#behaviors} -Wenn Sie einen Smart Contract schreiben, ist es wahrscheinlich das Sie immer wieder dieselben Muster erstellen, zum Beispiel das Zuweisen einer _Admin-_Adresse, um geschützte Vorgänge in einem Vertrag auszuführen, oder das Hinzufügen einer Notfall-_Unterbrechungs_-Schaltfläche, falls ein unvorhergesehenes Problem auftritt. +Wenn du Smart Contracts schreibst, ist die Wahrscheinlichkeit groß, dass du immer wieder ähnliche Muster schreibst, wie z. B. die Zuweisung einer _Admin_-Adresse zur Durchführung geschützter Operationen in einem Vertrag oder das Hinzufügen einer Notfall-_Pause_-Schaltfläche für den Fall eines unerwarteten Problems. -Smart-Contract-Bibliotheken bieten in der Regel wiederverwendbare Implementierungen dieser Vorgehensweisen als [Bibliotheken](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries) oder über eine [Vererbung](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance) an. +Bibliotheken für Smart Contracts bieten in der Regel wiederverwendbare Implementierungen dieser Verhaltensweisen als [Bibliotheken](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries) oder über [Vererbung](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance) in Solidity. -Als Beispiel eine vereinfachte Version des [`Eigentümer` Vertrags](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol) aus der [OpenZeppelin-Vertragsbibliothek](https://github.com/OpenZeppelin/openzeppelin-contracts), erstellt wird darin eine Adresse des Inhabers eines Vertrags und zugleich ein Modifizierer, um den Zugriff nur dem Eigentümer zu ermöglichen. +Als Beispiel folgt eine vereinfachte Version des [`Ownable`-Vertrags](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol) aus der [OpenZeppelin Contracts-Bibliothek](https://github.com/OpenZeppelin/openzeppelin-contracts), der eine Adresse als Eigentümer eines Vertrags festlegt und einen Modifikator zur Verfügung stellt, um den Zugriff auf eine Methode nur auf diesen Eigentümer zu beschränken. ```solidity contract Ownable { @@ -37,7 +37,7 @@ contract Ownable { } ``` -Um einen solchen Baustein in Ihrem Vertrag zu verwenden, müssen Sie ihn zuerst importieren und dann in Ihren eigenen Verträgen erweitern. Das erlaubt Ihnen die Nutzung des Modifikators, der über den `Ownable`-Vertrag (Vertrag mit Eigentümer) bereitgestellt wird, um Ihre eigenen Funktionen abzusichern. +Um einen solchen Baustein in Ihrem Vertrag zu verwenden, müssen Sie ihn zuerst importieren und dann in Ihren eigenen Verträgen erweitern. Dadurch kannst du den vom Basisvertrag `Ownable` bereitgestellten Modifikator verwenden, um deine eigenen Funktionen zu sichern. ```solidity import ".../Ownable.sol"; // Path to the imported library @@ -50,19 +50,19 @@ contract MyContract is Ownable { } ``` -Ein weiteres gängiges Beispiel ist [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) oder [DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html). Das sind Bibliotheken (im Gegensatz zu Basisverträgen), die arithmetische Funktionen mit Überlaufprüfungen bereitstellen, die von der Sprache nicht bereitgestellt werden. Es empfiehlt sich, eine dieser Bibliotheken anstelle von nativen arithmetischen Operationen zu verwenden, um Ihren Vertrag vor Überläufen zu schützen, die katastrophale Folgen haben können! +Ein weiteres beliebtes Beispiel ist [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) oder [DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html). Das sind Bibliotheken (im Gegensatz zu Basisverträgen), die arithmetische Funktionen mit Überlaufprüfungen bereitstellen, die von der Sprache nicht bereitgestellt werden. Es empfiehlt sich, eine dieser Bibliotheken anstelle von nativen arithmetischen Operationen zu verwenden, um Ihren Vertrag vor Überläufen zu schützen, die katastrophale Folgen haben können! ### Standards {#standards} -Um die [Komponierbarkeit und Interoperabilität](/developers/docs/smart-contracts/composability/) zu erleichtern, hat die Ethereum-Community mehrere Standards in Form von **ERCs** definiert. Weitere Informationen hierzu finden Sie im Abschnitt [Standards](/developers/docs/standards/). +Um die [Komponierbarkeit und Interoperabilität](/developers/docs/smart-contracts/composability/) zu erleichtern, hat die Ethereum-Community mehrere Standards in Form von **ERCs** definiert. Mehr darüber erfährst du im Abschnitt [Standards](/developers/docs/standards/). -Wenn Sie einen ERC in Ihre Verträge aufnehmen, sollten Sie nach Standardimplementierungen suchen, anstatt Ihre eigenen einzuführen. Viele Smart-Contract-Bibliotheken enthalten Implementierungen für die gängigsten ERCs. Den allgegenwärtigen [ERC20-Standard für fungible Token](/developers/tutorials/understand-the-erc-20-token-smart-contract/) finden Sie in [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md), [DappSys](https://github.com/dapphub/ds-token/) und [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20). Darüber hinaus bieten einige ERCs auch kanonische Implementierungen als Teil des ERC selbst. +Wenn Sie einen ERC in Ihre Verträge aufnehmen, sollten Sie nach Standardimplementierungen suchen, anstatt Ihre eigenen einzuführen. Viele Smart-Contract-Bibliotheken enthalten Implementierungen für die gängigsten ERCs. Zum Beispiel ist der allgegenwärtige [Standard für fungible ERC20-Token](/developers/tutorials/understand-the-erc-20-token-smart-contract/) in [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md), [DappSys](https://github.com/dapphub/ds-token/) und [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20) zu finden. Darüber hinaus bieten einige ERCs auch kanonische Implementierungen als Teil des ERC selbst. -Es ist erwähnenswert, dass einige ERCs nicht eigenständig sind, sondern Ergänzungen zu anderen ERCs sind. Zum Beispiel fügt [ERC2612](https://eips.ethereum.org/EIPS/eip-2612) eine Erweiterung zu ERC20 hinzu, um die Benutzerfreundlichkeit zu verbessern. +Es ist erwähnenswert, dass einige ERCs nicht eigenständig sind, sondern Ergänzungen zu anderen ERCs sind. Zum Beispiel fügt [ERC2612](https://eips.ethereum.org/EIPS/eip-2612) eine Erweiterung zu ERC20 hinzu, um dessen Benutzerfreundlichkeit zu verbessern. -## So fügen Sie eine Bibliothek hinzu {#how-to} +## So fügst du eine Bibliothek hinzu {#how-to} -Beziehen Sie sich immer auf die Dokumentation der Bibliothek, die Sie einbinden, um genaue Anweisungen zur Einbindung in Ihr Projekt zu bekommen. Viele Solidity-Vertragsbibliotheken werden mit `npm` gepackt, sodass Sie sie einfach `npm install` benutzen können. Die meisten Anwendungen zum [Kompilieren](/developers/docs/smart-contracts/compiling/) von Verträgen prüfen Ihre `node_modules` für Smart-Contract-Bibliotheken, sodass Sie Folgendes tun können: +Beziehen Sie sich immer auf die Dokumentation der Bibliothek, die Sie einbinden, um genaue Anweisungen zur Einbindung in Ihr Projekt zu bekommen. Mehrere Solidity-Bibliotheken für Verträge werden mit `npm` gepackt, so dass du sie einfach mit `npm install` installieren kannst. Die meisten Tools zum [Kompilieren](/developers/docs/smart-contracts/compiling/) von Verträgen suchen in deinen `node_modules` nach Bibliotheken für Smart Contracts, sodass du Folgendes tun kannst: ```solidity // Dadurch wird die @openzeppelin/contracts-Bibliothek von Ihren node_modules geladen @@ -73,45 +73,45 @@ contract MyNFT is ERC721 { } ``` -Unabhängig von der verwendeten Methode sollten Sie beim Einbinden einer Bibliothek immer die [Sprachversion](/developers/docs/smart-contracts/languages/) im Auge behalten. Sie können beispielsweise keine Bibliothek für Solidity 0.6 verwenden, wenn Sie Ihre Verträge in Solidity 0.5 schreiben. +Unabhängig von der Methode, die du verwendest, solltest du beim Einbinden einer Bibliothek immer die [Sprachversion](/developers/docs/smart-contracts/languages/) im Auge behalten. Sie können beispielsweise keine Bibliothek für Solidity 0.6 verwenden, wenn Sie Ihre Verträge in Solidity 0.5 schreiben. -## Wann verwendet man eine Bibliothek? {#when-to-use} +## Wann verwenden {#when-to-use} Wenn Sie eine Smart-Contract-Bibliothek für Ihr Projekt nutzen, bietet das gleich mehrere Vorteile. In erster Linie sparen Sie Zeit, denn die Bibliothek stellt fertige Bausteine zur Verfügung stellt, die Sie einfach in Ihr System integrieren können, anstatt sie selbst schreiben zu müssen. -Sicherheit ist ein großes Plus. Auch Open-Source-Smart-Contract-Bibliotheken werden oft intensiv untersucht. Da viele Projekte von der Bibliothek abhängen, besteht ein starker Anreiz vonseiten der Communty, sie ständig zu überprüfen. Fehler finden sich viel häufiger im Anwendungscode als in wiederverwendbaren Vertragsbibliotheken. Einige Bibliotheken werden auch [externen Audits](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/audits) unterzogen, um deren Sicherheit zu erhöhen. +Sicherheit ist ein großes Plus. Auch Open-Source-Smart-Contract-Bibliotheken werden oft intensiv untersucht. Da viele Projekte von der Bibliothek abhängen, besteht ein starker Anreiz vonseiten der Communty, sie ständig zu überprüfen. Fehler finden sich viel häufiger im Anwendungscode als in wiederverwendbaren Vertragsbibliotheken. Einige Bibliotheken werden für zusätzliche Sicherheit auch [externen Audits](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/audits) unterzogen. Die Verwendung von Smart-Contract-Bibliotheken birgt jedoch das Risiko, dass Sie Code in Ihr Projekt integreiren, mit dem Sie nicht vertraut sind. Es ist verlockend, einen Vertrag zu importieren und direkt in Ihr Projekt aufzunehmen, doch ohne ein gutes Verständnis dessen, was dieser Vertrag bewirkt, können Sie aufgrund eines unerwarteten Verhaltens versehentlich ein Problem in Ihrem System einführen. Lesen Sie immer die Dokumentation des Codes, den Sie importieren, und überprüfen Sie dann den Code selbst, bevor Sie ihn in Ihr Projekt aufnehmen. Schließlich sollten Sie bei der Entscheidung, ob Sie eine Bibliothek integrieren möchten, ihren Gesamtnutzen berücksichtigen. Eine weit verbreitete Version hat den Vorteil, dass sie eine größere Community hat und Fehler schneller erkannt werden. Beim Erstellen von Smart Contracts sollte Sicherheit sollte Ihr Hauptaugenmerk sein. -## Verwandte Tools {#related-tools} +## Zugehörige Werkzeuge {#related-tools} -**OpenZeppelin Contracts –** **_Gängigste Bibliothek für die sichere Entwicklung von Smart Contracts_ ** +**OpenZeppelin Contracts –** **_Die beliebteste Bibliothek für die sichere Entwicklung von Smart Contracts._** - [Dokumentation](https://docs.openzeppelin.com/contracts/) - [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) - [Community-Forum](https://forum.openzeppelin.com/c/general/16) -**DappSys –** **_Sichere, einfache und flexible Bausteine für Smart Contracts_** +**DappSys –** **_Sichere, einfache und flexible Bausteine für Smart Contracts._** - [Dokumentation](https://dappsys.readthedocs.io/) - [GitHub](https://github.com/dapphub/dappsys) -**HQ20 –** **_Ein Solidity-Projekt mit Verträgen, Bibliotheken und Beispielen, die Ihnen helfen, voll funktionsfähige, verteilte Anwendungen für die reale Welt zu erstellen_** +**HQ20 –** **_Ein Solidity-Projekt mit Verträgen, Bibliotheken und Beispielen, die dir helfen, voll funktionsfähige, verteilte Anwendungen für die reale Welt zu erstellen._** - [GitHub](https://github.com/HQ20/contracts) -**thirdweb Solidity SDK -** **_Bietet die Tools, die zum effizienten Erstellen von benutzerdefinierten Smart Contracts erforderlich sind_** +**thirdweb Solidity SDK –** **_Bietet die Tools, die zum effizienten Erstellen von benutzerdefinierten Smart Contracts erforderlich sind._** -- [Dokumentation](https://portal.thirdweb.com/solidity/) +- [Dokumentation](https://portal.thirdweb.com/contracts/build/overview) - [GitHub](https://github.com/thirdweb-dev/contracts) -## Ähnliche Tutorials {#related-tutorials} +## Verwandte Tutorials {#related-tutorials} -- [Sicherheitsüberlegungen für Ethereum-Entwickler](/developers/docs/smart-contracts/security/) _– Ein Tutorial zu Sicherheitsüberlegungen beim Erstellen von Smart Contracts, einschließlich der Bibliotheksnutzung_ -- [Den intelligenten Vertrag des ERC-20-Token verstehen](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Tutorial zum ERC20-Standard, bereitgestellt von mehreren Bibliotheken_ +- [Sicherheitsüberlegungen für Ethereum-Entwickler](/developers/docs/smart-contracts/security/) _– Ein Tutorial zu Sicherheitsaspekten bei der Erstellung von Smart Contracts, einschließlich der Verwendung von Bibliotheken._ +- [Den ERC-20-Token-Smart-Contract verstehen](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Tutorial zum ERC20-Standard, bereitgestellt von mehreren Bibliotheken._ -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} _Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/smart-contracts/naming/index.md b/public/content/translations/de/developers/docs/smart-contracts/naming/index.md new file mode 100644 index 00000000000..79459bca3fa --- /dev/null +++ b/public/content/translations/de/developers/docs/smart-contracts/naming/index.md @@ -0,0 +1,101 @@ +--- +title: Benennung von Smart Contracts +description: Bewährte Praktiken für die Benennung von Ethereum Smart Contracts mit ENS +lang: de +--- + +Smart Contracts sind ein Grundpfeiler der dezentralen Infrastruktur von Ethereum und ermöglichen autonome Anwendungen und Protokolle. Doch auch wenn sich die Vertragsfähigkeiten weiterentwickeln, verlassen sich Benutzer und Entwickler immer noch auf hexadezimale Adressen, um diese Verträge zu identifizieren und auf sie zu verweisen. + +Die Benennung von Smart Contracts mit dem [Ethereum Name Service (ENS)](https://ens.domains/) verbessert die Benutzererfahrung, indem hexadezimale Vertragsadressen überflüssig werden, und reduziert das Risiko von Angriffen wie Address-Poisoning- und Spoofing-Angriffen. Dieser Leitfaden erklärt, warum die Benennung von Smart Contracts wichtig ist, wie sie umgesetzt werden kann und welche Tools wie [Enscribe](https://www.enscribe.xyz) zur Verfügung stehen, um den Prozess zu vereinfachen und Entwicklern bei der Übernahme dieser Praxis zu helfen. + +## Warum Smart Contracts benennen? {#why-name-contracts} + +### Menschenlesbare Bezeichner {#human-readable-identifiers} + +Anstatt mit undurchsichtigen Vertragsadressen wie `0x8f8e...f9e3` zu interagieren, können Entwickler und Benutzer menschenlesbare Namen wie `v2.myapp.eth` verwenden. Dies vereinfacht die Interaktionen mit Smart Contracts. + +Dies wird durch den [Ethereum Name Service](https://ens.domains/) ermöglicht, der einen dezentralen Benennungsdienst für Ethereum-Adressen bereitstellt. Dies ist analog dazu, wie der Domain Name Service (DNS) es Internetnutzern ermöglicht, auf Netzwerkadressen zuzugreifen, indem sie einen Namen wie ethereum.org anstelle einer IP-Adresse wie `104.18.176.152` verwenden. + +### Verbesserte Sicherheit und Vertrauen {#improved-security-and-trust} + +Benannte Verträge helfen, versehentliche Transaktionen an die falsche Adresse zu reduzieren. Sie helfen Benutzern auch dabei, Verträge zu identifizieren, die mit bestimmten Apps oder Marken verbunden sind. Dies schafft zusätzliches Vertrauen durch Reputation, insbesondere wenn Namen mit bekannten übergeordneten Domains wie `uniswap.eth` verknüpft sind. + +Aufgrund der Länge von 42 Zeichen einer Ethereum-Adresse ist es für Benutzer sehr schwierig, kleine Änderungen in Adressen zu erkennen, bei denen ein paar Zeichen geändert wurden. Beispielsweise würde eine Adresse wie `0x58068646C148E313CB414E85d2Fe89dDc3426870` von benutzerorientierten Anwendungen wie Wallets normalerweise auf `0x580...870` gekürzt. Es ist unwahrscheinlich, dass ein Benutzer eine bösartige Adresse bemerkt, bei der ein paar Zeichen geändert wurden. + +Diese Art von Technik wird bei Address-Spoofing- und -Poisoning-Angriffen eingesetzt, bei denen Benutzer dazu verleitet werden zu glauben, dass sie mit der richtigen Adresse interagieren oder Gelder an sie senden, obwohl die Adresse in Wirklichkeit der richtigen Adresse nur ähnelt, aber nicht dieselbe ist. + +ENS-Namen für Wallets und Verträge schützen vor dieser Art von Angriffen. Ähnlich wie DNS-Spoofing-Angriffe können auch ENS-Spoofing-Angriffe durchgeführt werden, jedoch wird ein Benutzer einen Tippfehler in einem ENS-Namen eher bemerken als eine kleine Änderung an einer hexadezimalen Adresse. + +### Bessere UX für Wallets und Explorer {#better-ux} + +Wenn ein Smart Contract mit einem ENS-Namen konfiguriert wurde, können Apps wie Wallets und Blockchain-Explorer ENS-Namen für Smart Contracts anstelle von hexadezimalen Adressen anzeigen. Dies stellt für die Benutzer eine erhebliche Verbesserung der Benutzererfahrung (UX) dar. + +Wenn Benutzer beispielsweise mit einer App wie Uniswap interagieren, sehen sie normalerweise, dass die App, mit der sie interagieren, auf der Website `uniswap.org` gehostet wird, aber ihnen würde eine hexadezimale Vertragsadresse angezeigt, wenn Uniswap seine Smart Contracts nicht mit ENS benannt hat. Wenn der Vertrag benannt ist, könnten sie stattdessen `v4.contracts.uniswap.eth` sehen, was weitaus nützlicher ist. + +## Benennung bei der Bereitstellung vs. nach der Bereitstellung {#when-to-name} + +Es gibt zwei Zeitpunkte, zu denen Smart Contracts benannt werden können: + +- **Zum Zeitpunkt der Bereitstellung**: Zuweisung eines ENS-Namens zum Vertrag bei dessen Bereitstellung. +- **Nach der Bereitstellung**: Zuordnung einer bestehenden Vertragsadresse zu einem neuen ENS-Namen. + +Beide Ansätze setzen voraus, dass man Eigentümer- oder Managerzugriff auf eine ENS-Domain hat, um ENS-Einträge erstellen und festlegen zu können. + +## Wie die ENS-Benennung für Verträge funktioniert {#how-ens-naming-works} + +ENS-Namen werden on-chain gespeichert und über ENS-Resolver in Ethereum-Adressen aufgelöst. Um einen Smart Contract zu benennen: + +1. Registrieren oder kontrollieren Sie eine übergeordnete ENS-Domain (z. B. `myapp.eth`) +2. Erstellen Sie eine Subdomain (z. B. `v1.myapp.eth`) +3. Setzen Sie den `address`-Eintrag der Subdomain auf die Vertragsadresse +4. Setzen Sie den Reverse Record des Vertrags auf den ENS, damit der Name über seine Adresse gefunden werden kann + +ENS-Namen sind hierarchisch und unterstützen unbegrenzt viele Unternamen. Das Festlegen dieser Einträge erfordert in der Regel die Interaktion mit den Verträgen der ENS-Registry und des Public Resolvers. + +## Tools zur Benennung von Verträgen {#tools} + +Es gibt zwei Ansätze, um Smart Contracts zu benennen. Entweder über die [ENS App](https://app.ens.domains) mit einigen manuellen Schritten oder über [Enscribe](https://www.enscribe.xyz). Diese werden im Folgenden beschrieben. + +### Manuelle ENS-Einrichtung {#manual-ens-setup} + +Mit der [ENS App](https://app.ens.domains) können Entwickler manuell Unternamen erstellen und Forward-Address-Einträge festlegen. Allerdings können sie über die ENS-App keinen primären Namen für einen Smart Contract festlegen, indem sie den Reverse Record für den Namen setzen. Es müssen manuelle Schritte unternommen werden, die in den [ENS-Dokumenten](https://docs.ens.domains/web/naming-contracts/) behandelt werden. + +### Enscribe {#enscribe} + +[Enscribe](https://www.enscribe.xyz) vereinfacht die Benennung von Smart Contracts mit ENS und stärkt das Vertrauen der Benutzer in Smart Contracts. Es bietet: + +- **Atomare Bereitstellung und Benennung**: Zuweisung eines ENS-Namens bei der Bereitstellung eines neuen Vertrags +- **Benennung nach der Bereitstellung**: Verknüpfung von Namen mit bereits bereitgestellten Verträgen +- **Multi-Chain-Unterstützung**: Funktioniert auf Ethereum- und L2-Netzwerken, auf denen ENS unterstützt wird +- **Vertragsverifizierungsdaten**: Beinhaltet Vertragsverifizierungsdaten aus mehreren Quellen, um das Vertrauen der Benutzer zu erhöhen + +Enscribe unterstützt von Benutzern bereitgestellte ENS-Namen oder seine eigenen Domains, falls der Benutzer keinen ENS-Namen besitzt. + +Sie können auf die [Enscribe App](https://app.enscribe.xyz) zugreifen, um mit der Benennung und Anzeige von Smart Contracts zu beginnen. + +## Bewährte Praktiken {#best-practices} + +- **Verwenden Sie klare, versionierte Namen** wie `v1.myapp.eth`, um Vertrags-Upgrades transparent zu machen +- **Legen Sie Reverse Records fest**, um Verträge mit ENS-Namen zu verknüpfen und die Sichtbarkeit in Apps wie Wallets und Blockchain-Explorern zu gewährleisten. +- **Überwachen Sie die Ablaufdaten genau**, um unbeabsichtigte Eigentümerwechsel zu verhindern +- **Überprüfen Sie die Vertragsquelle**, damit Benutzer darauf vertrauen können, dass sich der benannte Vertrag wie erwartet verhält + +## Risiken {#risks} + +Die Benennung von Smart Contracts bietet erhebliche Vorteile für die Benutzer von Ethereum, jedoch müssen die Eigentümer von ENS-Domains bei deren Verwaltung wachsam sein. Zu den nennenswerten Risiken gehören: + +- **Ablauf**: Genau wie bei DNS-Namen haben auch ENS-Namensregistrierungen eine begrenzte Dauer. Daher ist es von entscheidender Bedeutung, dass die Eigentümer die Ablaufdaten ihrer Domains überwachen und sie rechtzeitig vor Ablauf erneuern. Sowohl die ENS App als auch Enscribe bieten Domain-Eigentümern visuelle Hinweise, wenn ein Ablaufdatum bevorsteht. +- **Eigentümerwechsel**: ENS-Einträge werden als NFTs auf Ethereum abgebildet, wobei der Eigentümer einer bestimmten `.eth`-Domain den zugehörigen NFT in seinem Besitz hat. Sollte also ein anderes Konto das Eigentum an diesem NFT übernehmen, kann der neue Eigentümer alle ENS-Einträge nach Belieben ändern. + +Um solche Risiken zu mindern, sollte das Eigentümerkonto für die `.eth` Second-Level-Domains (2LD) durch eine Multi-Sig-Wallet gesichert werden, wobei Subdomains zur Verwaltung der Vertragsbenennung erstellt werden. Auf diese Weise können im Falle von unbeabsichtigten oder bösartigen Eigentümerwechseln auf Subdomain-Ebene diese vom 2LD-Eigentümer überschrieben werden. + +## Zukunft der Vertragsbenennung {#future} + +Die Vertragsbenennung wird zu einer bewährten Praxis für die Dapp-Entwicklung, ähnlich wie Domainnamen IP-Adressen im Web ersetzt haben. Da immer mehr Infrastrukturen wie Wallets, Explorer und Dashboards die ENS-Auflösung für Verträge integrieren, werden benannte Verträge die Sicherheit verbessern und Fehler im gesamten Ökosystem reduzieren. + +Indem Smart Contracts leichter zu erkennen und nachzuvollziehen sind, hilft die Benennung, die Lücke zwischen Benutzern und Apps auf Ethereum zu schließen, wodurch sowohl die Sicherheit als auch die UX für die Benutzer verbessert werden. + +## Weiterführende Lektüre {#further-reading} + +- [Benennung von Smart Contracts mit ENS](https://docs.ens.domains/web/naming-contracts/) +- [Benennung von Smart Contracts mit Enscribe](https://www.enscribe.xyz/docs). diff --git a/public/content/translations/de/developers/docs/smart-contracts/security/index.md b/public/content/translations/de/developers/docs/smart-contracts/security/index.md index a16b6412425..146e5115732 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/security/index.md @@ -6,49 +6,49 @@ lang: de Smart Contracts sind äußerst flexibel und in der Lage, große Mengen an Werten und Daten zu kontrollieren, während sie eine unveränderliche Logik auf der Grundlage von auf der Blockchain bereitgestelltem Code ausführen. So ist ein lebendiges Ökosystem aus vertrauenswürdigen und dezentralisierten Applikationen entstanden, das viele Vorteile gegenüber den alten Systemen bietet. Sie bieten auch eine Chance für Angreifer, die durch die Ausnutzung von Schwachstellen in Smart Contracts Profit machen wollen. -Öffentliche Blockchains wie Ethereum erschweren das Problem der Sicherung von Smart Contracts zusätzlich. Der Code des veröffentlichten Vertrags _kann in der Regel _ nicht geändert werden, um Sicherheitslücken zu schließen, während die aus Smart Contracts gestohlenen Vermögenswerte aufgrund der Unveränderlichkeit extrem schwer nachzuverfolgen und meist nicht wiederherzustellen sind. +Öffentliche Blockchains wie Ethereum erschweren das Problem der Sicherung von Smart Contracts zusätzlich. Der Code eines bereitgestellten Vertrags kann _normalerweise_ nicht geändert werden, um Sicherheitslücken zu schließen, während die aus Smart Contracts gestohlenen Vermögenswerte aufgrund der Unveränderlichkeit extrem schwer zu verfolgen und meistens nicht wiederherstellbar sind. -Obwohl die Zahlen variieren, wird geschätzt, dass der Gesamtbetrag des gestohlenen oder verlorenen Werts aufgrund von Sicherheitsmängeln in Smart Contracts weit über 1 Milliarde US-Dollar beträgt. Dies beinhaltet hochkarätige Vorfälle, wie den [DAO-Hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 Mio. ETH gestohlen, nach heutigen Preisen über 1 Milliarde US-Dollar wert), den [Parity Multi-Sig Wallet-Hack](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (30 Mio. US-Dollar von Hackern verloren) und das [Problem mit den eingefrorenen Parity-Wallets](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (über 300 Mio. US-Dollar in ETH gesperrt). +Obwohl die Zahlen variieren, wird geschätzt, dass der Gesamtbetrag des gestohlenen oder verlorenen Werts aufgrund von Sicherheitsmängeln in Smart Contracts weit über 1 Milliarde US-Dollar beträgt. Dazu gehören hochkarätige Vorfälle wie der [DAO-Hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 Mio. ETH gestohlen, was nach heutigen Preisen über 1 Mrd. USD wert ist), der [Parity Multi-Sig-Wallet-Hack](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (30 Mio. USD an Hacker verloren) und das [Problem mit der eingefrorenen Parity-Wallet](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (über 300 Mio. USD in ETH für immer gesperrt). Die oben genannten Probleme machen es für Entwickler zwingend erforderlich, in die Entwicklung sicherer, robuster und widerstandsfähiger Smart Contracts zu investieren. Die Sicherheit von Smart Contracts ist eine ernste Angelegenheit, die jeder Entwickler lernen sollte. In diesem Ratgeber werden Sicherheitsüberlegungen für Ethereum-Entwickler behandelt und Ressourcen zur Verbesserung der Smart Contract-Sicherheit vorgestellt. ## Voraussetzungen {#prerequisites} -Stellen Sie sicher, dass Sie mit den [Grundlagen der Smart Contract-Entwicklung](/developers/docs/smart-contracts/) vertraut sind, bevor Sie sich mit der Sicherheit befassen. +Stellen Sie sicher, dass Sie mit den [Grundlagen der Smart-Contract-Entwicklung](/developers/docs/smart-contracts/) vertraut sind, bevor Sie sich mit der Sicherheit befassen. -## Richtlinien für die Erstellung sicherer Ethereum Smart Contracts {#smart-contract-security-guidelines} +## Richtlinien für die Erstellung sicherer Ethereum-Smart-Contracts {#smart-contract-security-guidelines} -### 1. Gestaltung geeigneter Zugriffskontrollen {#design-proper-access-controls} +### 1. Entwerfen Sie ordnungsgemäße Zugriffskontrollen {#design-proper-access-controls} -Bei Smart Contracts können Funktionen, die als `public` oder `external` markiert sind, von beliebigen extern verwalteten Konten (EOAs) oder Vertragskonten aufgerufen werden. Die Festlegung der öffentlichen Sichtbarkeit von Funktionen ist notwendig, wenn Sie möchten, dass andere Personen mit Ihrem Vertrag interagieren können. Funktionen, die als `private` gekennzeichnet sind, können jedoch nur von Funktionen innerhalb des Smart Contracts aufgerufen werden, nicht von externen Accounts. Jedem Netzwerkteilnehmer Zugang zu Vertragsfunktionen zu gewähren, kann zu Problemen führen, insbesondere wenn dies bedeutet, dass jeder Nutzer sensible Operationen durchführen kann (z. B. das Minting neuer Token). +In Smart Contracts können Funktionen, die als `public` oder `external` markiert sind, von beliebigen extern verwalteten Konten (EOAs) oder Vertragskonten aufgerufen werden. Die Festlegung der öffentlichen Sichtbarkeit von Funktionen ist notwendig, wenn Sie möchten, dass andere Personen mit Ihrem Vertrag interagieren können. Funktionen, die als `private` gekennzeichnet sind, können jedoch nur von Funktionen innerhalb des Smart Contracts aufgerufen werden, nicht von externen Konten. Jedem Netzwerkteilnehmer Zugang zu Vertragsfunktionen zu gewähren, kann zu Problemen führen, insbesondere wenn dies bedeutet, dass jeder Nutzer sensible Operationen durchführen kann (z. B. das Minting neuer Token). -Um die unbefugte Nutzung von Smart Contract-Funktionen zu verhindern, müssen sichere Zugriffskontrollen implementiert werden. Die Zugriffskontrolle beschränkt die Möglichkeit, bestimmte Funktionen in einem Smart Contract zu nutzen, auf zugelassene Stellen, wie z. B. die für die Verwaltung des Vertrags zuständigen Konten. Das **Ownable-Modell** und **Rollenbasierte Kontrolle** sind zwei Parameter, die für die Implementierung der Zugriffskontrolle in Smart Contracts nützlich sind: +Um die unbefugte Nutzung von Smart Contract-Funktionen zu verhindern, müssen sichere Zugriffskontrollen implementiert werden. Die Zugriffskontrolle beschränkt die Möglichkeit, bestimmte Funktionen in einem Smart Contract zu nutzen, auf zugelassene Stellen, wie z. B. die für die Verwaltung des Vertrags zuständigen Konten. Das **Ownable-Muster** und die **rollenbasierte Steuerung** sind zwei nützliche Muster zur Implementierung der Zugriffskontrolle in Smart Contracts: -#### Ownable-Modell {#ownable-pattern} +#### Ownable-Muster {#ownable-pattern} Beim Ownable-Modell wird während der Vertragserstellung eine Adresse als „Eigentümer“ des Vertrags festgelegt. Geschützten Funktionen wird ein `OnlyOwner`-Modifikator zugewiesen, der sicherstellt, dass der Vertrag die Identität der aufrufenden Adresse authentifiziert, bevor die Funktion ausgeführt wird. Aufrufe geschützter Funktionen von anderen Adressen als der des Vertragseigentümers werden immer zurückgewiesen, um unerwünschte Zugriffe zu verhindern. #### Rollenbasierte Zugriffskontrolle {#role-based-access-control} -Die Registrierung einer einzigen Adresse als `Eigentümer` in einem Smart Contract birgt das Risiko der Zentralisierung und stellt einen einzelnen Ausfallpunkt dar. Wenn die Kontoschlüssel des Eigentümers gefährdet sind, können Angreifer den entsprechenden Vertrag angreifen. Aus diesem Grund kann die Verwendung eines rollenbasierten Zugriffskontrollmusters mit mehreren administrativen Konten eine bessere Option sein. +Die Registrierung einer einzigen Adresse als `Owner` in einem Smart Contract birgt das Risiko der Zentralisierung und stellt einen Single Point of Failure dar. Wenn die Kontoschlüssel des Eigentümers gefährdet sind, können Angreifer den entsprechenden Vertrag angreifen. Aus diesem Grund kann die Verwendung eines rollenbasierten Zugriffskontrollmusters mit mehreren administrativen Konten eine bessere Option sein. Bei der rollenbasierten Zugriffskontrolle wird der Zugriff auf sensible Funktionen auf eine Reihe von vertrauenswürdigen Teilnehmern verteilt. So kann beispielsweise ein Konto für das Minting von Token zuständig sein, während ein anderes Konto Upgrades durchführt oder den Vertrag pausiert. Durch diese dezentrale Zugriffskontrolle werden „einzelne Ausfallpunkte“ eliminiert und die Vertrauensvoraussetzungen für Benutzer reduziert. ##### Verwendung von Wallets mit Multi-Signature-Option -Ein weiterer Ansatz für die Implementierung einer sicheren Zugriffskontrolle ist die Verwendung eines [Multi-Signatur-Kontos](/developers/docs/smart-contracts/#multisig) zur Verwaltung eines Vertrags. Im Gegensatz zu einem regulären EOA sind Multi-Signatur-Konten das Eigentum von mehreren Instanzen und erfordern Signaturen von einer Mindestanzahl von Konten, beispielsweise 3 von 5, um Transaktionen auszuführen. +Ein weiterer Ansatz zur Implementierung einer sicheren Zugriffskontrolle ist die Verwendung eines [Multi-Signatur-Kontos](/developers/docs/smart-contracts/#multisig), um einen Vertrag zu verwalten. Im Gegensatz zu einem regulären EOA sind Multi-Signatur-Konten das Eigentum von mehreren Instanzen und erfordern Signaturen von einer Mindestanzahl von Konten, beispielsweise 3 von 5, um Transaktionen auszuführen. Die Verwendung einer Mehrfachsignatur für die Zugriffskontrolle führt eine zusätzliche Sicherheitsebene ein, da Aktionen auf dem Zielvertrag die Zustimmung von mehreren Parteien erfordern. Dies ist besonders nützlich, wenn die Verwendung der Ownable-Funktion erforderlich ist, da es für einen Angreifer oder einen böswilligen Insider schwieriger ist, sensible Vertragsfunktionen für böswillige Zwecke zu manipulieren. -### 2. Verwenden Sie die Anweisungen require(), assert() und revert(), um Vertragsoperationen zu schützen. {#use-require-assert-revert} +### 2. Verwenden Sie die Anweisungen require(), assert() und revert(), um Vertragsoperationen zu schützen {#use-require-assert-revert} Wie bereits erwähnt, kann jeder Nutzer öffentliche Funktionen in Ihrem Smart Contract aufrufen, sobald dieser auf der Blockchain veröffentlicht wurde. Da Sie nicht im Voraus wissen können, wie externe Konten mit einem Vertrag interagieren werden, ist es ideal, interne Schutzmaßnahmen gegen problematische Funktionen zu implementieren, bevor Sie sie Veröffentlichen. Sie können korrektes Verhalten in Smart Contracts durch die Verwendung der Anweisungen `require()`, `assert()` und `revert()` erzwingen, um Ausnahmen auszulösen und Zustandsänderungen rückgängig zu machen, wenn die Ausführung bestimmte Anforderungen nicht erfüllt. -**`require()`**: `require` werden am Anfang von Funktionen definiert und stellen sicher, dass vordefinierte Bedingungen erfüllt sind, bevor die aufgerufene Funktion ausgeführt wird. Eine `require`-Anweisung kann verwendet werden, um Nutzereingaben zu validieren, Zustandsvariablen zu überprüfen oder die Identität des aufrufenden Accounts zu authentifizieren, bevor eine Funktion ausgeführt wird. +**`require()`**: `require` wird am Anfang von Funktionen definiert und stellt sicher, dass vordefinierte Bedingungen erfüllt sind, bevor die aufgerufene Funktion ausgeführt wird. Eine `require`-Anweisung kann verwendet werden, um Nutzereingaben zu validieren, Zustandsvariablen zu überprüfen oder die Identität des aufrufenden Kontos zu authentifizieren, bevor eine Funktion ausgeführt wird. -**`assert()`**: `assert()` wird verwendet, um interne Fehler zu erkennen und Verletzungen von „Invarianten“ in Ihrem Code zu überprüfen. Eine Invariante ist eine logische Behauptung über den Zustand eines Vertrags, die für alle Funktionsausführungen gelten soll. Ein Beispiel für eine Invariante ist das maximale Gesamtangebot oder der maximale Saldo eines Token-Vertrags. Die Verwendung von `assert()` stellt sicher, dass Ihr Vertrag niemals einen verwundbaren Zustand erreicht, und falls doch, werden alle Änderungen an den Zustandsvariablen zurückgesetzt. +**`assert()`**: `assert()` wird verwendet, um interne Fehler zu erkennen und Verletzungen von „Invarianten“ in Ihrem Code zu überprüfen. Eine Invariante ist eine logische Behauptung über den Zustand eines Vertrags, die für alle Funktionsausführungen gelten soll. Ein Beispiel für eine Invariante ist das maximale Gesamtangebot oder der maximale Saldo eines Token-Vertrags. Die Verwendung von `assert()` stellt sicher, dass Ihr Vertrag niemals einen anfälligen Zustand erreicht, und falls doch, werden alle Änderungen an den Zustandsvariablen rückgängig gemacht. -**`revert()`**: `revert()` kann in einer if-else-Anweisung verwendet werden, die eine Ausnahme auslöst, wenn die erforderliche Bedingung nicht erfüllt ist. Der folgende Mustervertrag verwendet `revert()`, um die Ausführung von Funktionen zu überwachen: +**`revert()`**: `revert()` kann in einer if-else-Anweisung verwendet werden, die eine Ausnahme auslöst, wenn die erforderliche Bedingung nicht erfüllt ist. Der folgende Beispielvertrag verwendet `revert()`, um die Ausführung von Funktionen zu schützen: ``` pragma solidity ^0.8.4; @@ -58,8 +58,8 @@ contract VendingMachine { error Unauthorized(); function buy(uint amount) public payable { if (amount > msg.value / 2 ether) - revert("Not enough Ether provided."); - // Perform the purchase. + revert("Nicht genügend Ether bereitgestellt."); + // Führen Sie den Kauf durch. } function withdraw() public { if (msg.sender != owner) @@ -70,40 +70,40 @@ contract VendingMachine { } ``` -### 3. Testen Sie Smart Contracts und überprüfen Sie die Richtigkeit des Codes {#test-smart-contracts-and-verify-code-correctness} +### 3. Testen Sie Smart Contracts und überprüfen Sie die Korrektheit des Codes {#test-smart-contracts-and-verify-code-correctness} -Die Unveränderlichkeit des Codes, der auf der [Ethereum Virtual Machine](/developers/docs/evm/) läuft, bedeutet, dass Smart Contracts ein höheres Maß an Qualitätsbewertung während der Entwicklungsphase erfordern. Wenn Sie Ihren Vertrag ausgiebig testen und auf unerwartete Ergebnisse achten, verbessern Sie die Sicherheit erheblich und schützen Ihre Nutzer auf lange Sicht. +Die Unveränderlichkeit des Codes, der in der [Ethereum Virtual Machine](/developers/docs/evm/) läuft, bedeutet, dass Smart Contracts in der Entwicklungsphase ein höheres Maß an Qualitätsbewertung erfordern. Wenn Sie Ihren Vertrag ausgiebig testen und auf unerwartete Ergebnisse achten, verbessern Sie die Sicherheit erheblich und schützen Ihre Nutzer auf lange Sicht. -Die übliche Methode besteht darin, kleine Unit-Tests mit Scheindaten zu schreiben, die der Vertrag von den Nutzern erhalten würde. [Unit-Testing](/developers/docs/smart-contracts/testing/#unit-testing) ist gut, um die Funktionalität bestimmter Funktionen zu testen und sicherzustellen, dass ein Smart Contract wie erwartet funktioniert. +Die übliche Methode besteht darin, kleine Unit-Tests mit Scheindaten zu schreiben, die der Vertrag von den Nutzern erhalten würde. [Unit-Tests](/developers/docs/smart-contracts/testing/#unit-testing) sind gut geeignet, um die Funktionalität bestimmter Funktionen zu testen und sicherzustellen, dass ein Smart Contract wie erwartet funktioniert. Leider sind Unit-Tests für die Verbesserung der Sicherheit von Smart Contracts nur wenig effektiv, wenn sie nur isoliert angewendet werden. Ein Unit-Test kann beweisen, dass eine Funktion bei Mock-Daten korrekt ausgeführt wird, Unit-Tests sind jedoch nur so effektiv wie die Tests, die verfasst werden. Das macht es schwierig, unentdeckte Sonderfälle und Schwachstellen zu erkennen, die die Sicherheit Ihres Smart Contracts gefährden könnten. -Ein besserer Ansatz besteht darin, Unit-Tests mit eigenschaftsbasierten Tests zu kombinieren, die mit [statischer und dynamischer Analyse](/developers/docs/smart-contracts/testing/#static-dynamic-analysis) durchgeführt werden. Die statische Analyse stützt sich auf Low-Level-Darstellungen, wie [Kontrollflussdiagramme](https://en.wikipedia.org/wiki/Control-flow_graph) und [abstrakte Syntaxstrukturen](https://deepsource.io/glossary/ast/), um die erreichbaren Programmzustände und Ausführungspfade zu analysieren. In der Zwischenzeit führen dynamische Analysetechniken wie etwa [Smart Contract Fuzzing](https://www.cyfrin.io/blog/smart-contract-fuzzing-and-invariants-testing-foundry) Contract-Code mit zufälligen Eingabewerten aus, um Operationen zu erkennen, die Sicherheitseigenschaften verletzen. +Ein besserer Ansatz ist es, Unit-Tests mit eigenschaftsbasierten Tests zu kombinieren, die mittels [statischer und dynamischer Analyse](/developers/docs/smart-contracts/testing/#static-dynamic-analysis) durchgeführt werden. Die statische Analyse stützt sich auf Low-Level-Darstellungen wie [Kontrollflussgraphen](https://en.wikipedia.org/wiki/Control-flow_graph) und [abstrakte Syntaxbäume](https://deepsource.io/glossary/ast/), um erreichbare Programmzustände und Ausführungspfade zu analysieren. In der Zwischenzeit führen dynamische Analysetechniken, wie z. B. [Smart-Contract-Fuzzing](https://www.cyfrin.io/blog/smart-contract-fuzzing-and-invariants-testing-foundry), Vertragscode mit zufälligen Eingabewerten aus, um Operationen zu erkennen, die Sicherheitseigenschaften verletzen. -[Die formale Verifizierung](/developers/docs/smart-contracts/formal-verification) ist eine weitere Technik zur Überprüfung der Sicherheitseigenschaften von Smart Contracts. Im Gegensatz zu regulären Tests kann die formale Verifizierung schlüssig beweisen, dass ein Smart Contract keine Fehler enthält. Dies wird erreicht, indem eine formale Spezifikation erstellt wird, die die gewünschten Sicherheitseigenschaften festhält, um dann zu gewährleisten, dass ein Formmodell des Vertrags mit dieser Spezifikation übereinstimmt. +Die [formale Verifizierung](/developers/docs/smart-contracts/formal-verification) ist eine weitere Technik zur Überprüfung der Sicherheitseigenschaften in Smart Contracts. Im Gegensatz zu regulären Tests kann die formale Verifizierung schlüssig beweisen, dass ein Smart Contract keine Fehler enthält. Dies wird erreicht, indem eine formale Spezifikation erstellt wird, die die gewünschten Sicherheitseigenschaften festhält, um dann zu gewährleisten, dass ein Formmodell des Vertrags mit dieser Spezifikation übereinstimmt. ### 4. Bitten Sie um eine unabhängige Überprüfung Ihres Codes {#get-independent-code-reviews} Nachdem Sie Ihren Vertrag getestet haben, sollten Sie andere bitten, den Quellcode auf Sicherheitsprobleme zu prüfen. Beim Testen werden nicht alle Schwachstellen in einem Smart Contract aufgedeckt, eine unabhängige Überprüfung erhöht jedoch die Wahrscheinlichkeit, dass Schwachstellen entdeckt werden. -#### Audits (Prüfungen) {#audits} +#### Audits {#audits} Die Beauftragung eines Smart Contract-Audits ist eine Möglichkeit zur Durchführung einer unabhängigen Code-Überprüfung. Prüfer spielen eine wichtige Rolle, wenn es darum geht sicherzustellen, dass Smart Contracts sicher und frei von Qualitätsmängeln und Planungsfehlern sind. Dennoch sollten Sie Audits nicht als Wunderwaffe betrachten. Smart Contract-Audits können nicht jeden Fehler aufspüren und sind hauptsächlich dazu gedacht, eine zusätzliche Runde von Überprüfungen durchzuführen, die dazu beitragen können, Probleme zu entdecken, die von den Entwicklern während der anfänglichen Entwicklung und Tests übersehen wurden. Sie sollten auch die Best Practices für die Zusammenarbeit mit Prüfern befolgen, z. B. den Code ordnungsgemäß dokumentieren und Inline-Kommentare hinzufügen, um den Nutzen eines Smart Contract-Audits zu maximieren. -- [Tipps und Tricks zum Smart-Contract-Auditing](https://twitter.com/tinchoabbate/status/1400170232904400897) – _@tinchoabbate_ +- [Tipps & Tricks für das Auditing von Smart Contracts](https://twitter.com/tinchoabbate/status/1400170232904400897) – _@tinchoabbate_ - [Holen Sie das Beste aus Ihrem Audit heraus](https://inference.ag/blog/2023-08-14-tips/) – _Inference_ -#### Aufdecken von Fehlern {#bug-bounties} +#### Bug-Bounties {#bug-bounties} Die Einrichtung eines Prämienprogramms für das Aufdecken von Fehlern (Bug Bounty Program) ist ein weiterer Ansatz zur Durchführung externer Codeüberprüfungen. Ein Bug Bounty ist eine finanzielle Belohnung für Personen (in der Regel Whitehat-Hacker), die Schwachstellen in einer Applikation entdecken. -Wenn sie richtig eingesetzt werden, geben Bug Bounties den Mitgliedern der Hacker-Community einen Anreiz, Ihren Code auf kritische Fehler zu untersuchen. Ein Beispiel aus der Praxis ist der „unendliches Geld“-Fehler, der einem Angreifer ermöglicht hätte, eine unbegrenzte Menge an Ether auf [Optimism](https://www.optimism.io/) zu erzeugen, einem [Layer-2](/layer-2/)-Protokoll, das auf Ethereum läuft. Glücklicherweise entdeckte ein Whitehat-Hacker [den Fehler](https://www.saurik.com/optimism.html) und meldete ihn dem Team, [und erhielt dafür eine hohe Belohnung](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/). +Wenn sie richtig eingesetzt werden, geben Bug Bounties den Mitgliedern der Hacker-Community einen Anreiz, Ihren Code auf kritische Fehler zu untersuchen. Ein Praxisbeispiel ist der „Infinite Money Bug“, der es einem Angreifer ermöglicht hätte, eine unbegrenzte Menge an Ether auf [Optimism](https://www.optimism.io/) zu erzeugen, einem [Layer-2](/layer-2/)-Protokoll, das auf Ethereum läuft. Glücklicherweise [entdeckte ein White-Hat-Hacker den Fehler](https://www.saurik.com/optimism.html) und benachrichtigte das Team, wodurch er [eine hohe Prämie erhielt](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/). -Eine sinnvolle Strategie besteht darin, die Auszahlung eines Bug-Bounty-Programms im Verhältnis zur Höhe der auf dem Spiel stehenden Mittel festzulegen. Dieser als „[Skalierung zum Aufdecken von Fehlern](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)“ bezeichnete Ansatz bietet finanzielle Anreize für Einzelpersonen, Schwachstellen verantwortungsbewusst offenzulegen, anstatt sie auszunutzen. +Eine sinnvolle Strategie besteht darin, die Auszahlung eines Bug-Bounty-Programms im Verhältnis zur Höhe der auf dem Spiel stehenden Mittel festzulegen. Dieser Ansatz, der als „[Scaling Bug Bounty](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)“ bezeichnet wird, bietet Einzelpersonen finanzielle Anreize, Schwachstellen verantwortungsvoll offenzulegen, anstatt sie auszunutzen. -### 5. Befolgen Sie bei der Entwicklung von Smart Contracts die bewährten Methoden {#follow-smart-contract-development-best-practices} +### 5. Befolgen Sie bei der Entwicklung von Smart Contracts bewährte Praktiken {#follow-smart-contract-development-best-practices} Die Verfügbarkeit von Audits und Bug Bounties entbindet Sie nicht von Ihrer Verantwortung, qualitativ hochwertigen Code zu schreiben. Die Sicherheit von Smart Contracts beginnt mit der Einhaltung geeigneter Planungs- und Entwicklungsprozesse: @@ -113,46 +113,46 @@ Die Verfügbarkeit von Audits und Bug Bounties entbindet Sie nicht von Ihrer Ver - Stellen Sie sicher, dass Pull-Requests mindestens einen unabhängigen Reviewer haben. Wenn Sie alleine an einem Projekt arbeiten, sollten Sie überlegen, ob Sie nicht andere Entwickler finden und mit diesen Code-Reviews austauschen -- Verwendung einer [Entwicklungsumgebung](/developers/docs/frameworks/) zum Testen, Kompilieren und Bereitstellen von Smart Contracts +- Verwenden Sie eine [Entwicklungsumgebung](/developers/docs/frameworks/) zum Testen, Kompilieren und Bereitstellen von Smart Contracts - Führen Sie Ihren Code durch grundlegende Code-Analyse-Tools wie [Cyfrin Aderyn](https://github.com/Cyfrin/aderyn), Mythril und Slither. Idealerweise sollten Sie dies tun, noch bevor eine Pull-Anfrage eingebunden wird, und die Unterschiede in der Ergebnisausgabe vergleichen - Stellen Sie sicher, dass Ihr Code ohne Fehler kompiliert wird und der Solidity-Compiler keine Warnungen ausgibt -- Dokumentieren Sie Ihren Code ordnungsgemäß (unter Verwendung von [NatSpec](https://solidity.readthedocs.io/en/develop/natspec-format.html)) und beschreiben Sie Einzelheiten der Vertragsarchitektur in leicht verständlicher Sprache. Dies erleichtert es anderen, Ihren Code zu überprüfen und zu kontrollieren. +- Dokumentieren Sie Ihren Code ordnungsgemäß (mit [NatSpec](https://solidity.readthedocs.io/en/develop/natspec-format.html)) und beschreiben Sie Details zur Vertragsarchitektur in einer leicht verständlichen Sprache. Dies erleichtert es anderen, Ihren Code zu überprüfen und zu kontrollieren. -### 6. Umsetzung solider Pläne für die Notfallwiederherstellung {#implement-disaster-recovery-plans} +### 6. Implementieren Sie robuste Notfallwiederherstellungspläne {#implement-disaster-recovery-plans} Die Entwicklung sicherer Zugriffskontrollen, die Implementierung von Funktionsmodifikatoren und andere Vorschläge können die Sicherheit von Smart Contracts verbessern, jedoch können sie die Möglichkeit böswilliger Angriffe nicht ausschließen. Der Aufbau sicherer Smart Contracts erfordert eine „Vorbereitung auf Fehler“ und einen Notfallplan, um wirksam auf Angriffe reagieren zu können. Ein angemessener Notfallwiederherstellungsplan umfasst einige oder alle der folgenden Komponenten: -#### Aktualisierungen von Verträgen {#contract-upgrades} +#### Vertrags-Upgrades {#contract-upgrades} Obwohl Ethereum Smart Contracts standardmäßig unveränderlich sind, ist es möglich, durch die Verwendung von Upgrade-Mustern einen gewissen Grad an Veränderbarkeit zu erreichen. Die Aktualisierung von Verträgen ist dann erforderlich, wenn ein kritischer Fehler Ihren alten Vertrag unbrauchbar macht und die Einführung einer neuen Logik die sinnvollste Option darstellt. -Die Mechanismen zur Aktualisierung von Verträgen funktionieren unterschiedlich, wobei jedoch das „Proxy-Muster“ einer der beliebtesten Ansätze für die Aktualisierung von Smart Contracts ist. [Proxy-Muster](https://www.cyfrin.io/blog/upgradeable-proxy-smart-contract-pattern) teilen den Status und die Logik einer Anwendung auf _zwei_ Contracts auf. Der erste Vertrag (ein so genannter „Proxy-Vertrag“) speichert Zustandsvariablen (z. B. Benutzerguthaben), während der zweite Vertrag (ein so genannter „Logik-Vertrag“) den Code für die Ausführung von Vertragsfunktionen enthält. +Die Mechanismen zur Aktualisierung von Verträgen funktionieren unterschiedlich, wobei jedoch das „Proxy-Muster“ einer der beliebtesten Ansätze für die Aktualisierung von Smart Contracts ist. [Proxy-Muster](https://www.cyfrin.io/blog/upgradeable-proxy-smart-contract-pattern) teilen den Zustand und die Logik einer Anwendung auf _zwei_ Verträge auf. Der erste Vertrag (ein so genannter „Proxy-Vertrag“) speichert Zustandsvariablen (z. B. Benutzerguthaben), während der zweite Vertrag (ein so genannter „Logik-Vertrag“) den Code für die Ausführung von Vertragsfunktionen enthält. -Konten interagieren mit dem Proxy-Vertrag, der alle Funktionsaufrufe über den [`delegatecall()`](https://docs.soliditylang.org/en/v0.8.16/introduction-to-smart-contracts.html?highlight=delegatecall#delegatecall-callcode-and-libraries) ein Low-Level-Aufruf, an den Logik-Vertrag weiterleitet. Im Gegensatz zu einem normalen Aufruf stellt `delegatecall()` sicher, dass der Code, welcher unter der Adresse des logischen Vertrags läuft, im Kontext des aufrufenden Vertrags ausgeführt wird. Das bedeutet, dass der Logikvertrag immer in den Speicher des Proxys schreibt (anstatt in seinen eigenen Speicher) und die ursprünglichen Werte von `msg.sender` und `msg.value` erhalten bleiben. +Konten interagieren mit dem Proxy-Vertrag, der alle Funktionsaufrufe an den Logikvertrag mithilfe des Low-Level-Aufrufs [`delegatecall()`](https://docs.soliditylang.org/en/v0.8.16/introduction-to-smart-contracts.html?highlight=delegatecall#delegatecall-callcode-and-libraries) weiterleitet. Im Gegensatz zu einem regulären Nachrichtenaufruf stellt `delegatecall()` sicher, dass der an der Adresse des Logikvertrags ausgeführte Code im Kontext des aufrufenden Vertrags ausgeführt wird. Das bedeutet, dass der Logikvertrag immer in den Speicher des Proxys schreibt (anstatt in seinen eigenen Speicher) und die ursprünglichen Werte von `msg.sender` und `msg.value` erhalten bleiben. Die Übertragung von Aufrufen an den Logikvertrag erfordert die Speicherung seiner Adresse im Speicher des Proxy-Vertrags. Um die Logik des Vertrags zu aktualisieren, muss daher nur ein anderer Logikvertrag eingesetzt und die neue Adresse im Proxy-Vertrag gespeichert werden. Da nachfolgende Aufrufe des Proxy-Vertrags automatisch an den neuen Logik-Vertrag weitergeleitet werden, hätten Sie den Vertrag „aktualisiert“, ohne den Code tatsächlich zu ändern. -[Mehr zum Thema Aktualisieren von Verträgen](/developers/docs/smart-contracts/upgrading/). +[Mehr zum Thema Vertrags-Upgrades](/developers/docs/smart-contracts/upgrading/). -#### Notausschalter {#emergency-stops} +#### Not-Stopps {#emergency-stops} Wie bereits erwähnt, können umfangreiche Prüfungen und Tests unmöglich alle Fehler in einem Smart Contract aufdecken. Wenn eine Schwachstelle in Ihrem Code nach der Veröffentlichung auftritt, ist es unmöglich, sie zu beheben, da Sie den Code, der unter der Vertragsadresse läuft, nicht ändern können. Außerdem kann die Implementierung von Upgrade-Mechanismen (z. B. Proxy-Muster) einige Zeit in Anspruch nehmen (sie erfordern oft die Zustimmung verschiedener Parteien), was den Angreifern nur mehr Zeit gibt, um mehr Schaden anzurichten. Die einzige Möglichkeit besteht darin, eine „Not-Aus“-Funktion zu implementieren, die Aufrufe anfälliger Funktionen in einem Vertrag blockiert. Notausschalter bestehen in der Regel aus den folgenden Komponenten: -1. Eine globale Boolesche Variable, die angibt, ob sich der Smart Contract in einem gestoppten Zustand befindet oder nicht. Diese Variable wird bei der Einrichtung des Vertrags auf `false` gesetzt, schaltet aber auf `true` um, sobald der Vertrag gestoppt wird. +1. Eine globale Boolesche Variable, die angibt, ob sich der Smart Contract in einem gestoppten Zustand befindet oder nicht. Diese Variable wird bei der Einrichtung des Vertrags auf `false` gesetzt, wechselt aber zu `true`, sobald der Vertrag angehalten wird. 2. Funktionen, die bei ihrer Ausführung auf die boolesche Variable verweisen. Auf diese Funktionen kann zugegriffen werden, wenn der Smart Contract in Betrieb ist, und sie werden unzugänglich, wenn die Notausfunktion ausgelöst wird. -3. Eine Person, die Zugriff auf die Notausfunktion hat, die die Boolesche Variable auf `true` schaltet. Um böswillige Aktionen zu verhindern, kann der Aufruf dieser Funktion auf eine vertrauenswürdige Adresse (z. B. den Vertragsinhaber) beschränkt werden. +3. Eine Entität, die Zugriff auf die Not-Stopp-Funktion hat, welche die boolesche Variable auf `true` setzt. Um böswillige Aktionen zu verhindern, kann der Aufruf dieser Funktion auf eine vertrauenswürdige Adresse (z. B. den Vertragsinhaber) beschränkt werden. -Sobald der Vertrag den Notausschalter aktiviert, sind bestimmte Funktionen nicht mehr aufrufbar. Dies wird erreicht, indem die ausgewählten Funktionen in einen Modifikator verpackt werden, der auf die globale Variable verweist. Im Folgenden wird [ein Beispiel](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol) für die Umsetzung dieses Konzepts in einem Vertrag beschrieben: +Sobald der Vertrag den Notausschalter aktiviert, sind bestimmte Funktionen nicht mehr aufrufbar. Dies wird erreicht, indem die ausgewählten Funktionen in einen Modifikator verpackt werden, der auf die globale Variable verweist. Nachfolgend finden Sie [ein Beispiel](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol), das eine Implementierung dieses Musters in Verträgen beschreibt: ```solidity -// This code has not been professionally audited and makes no promises about safety or correctness. Use at your own risk. +// Dieser Code wurde nicht professionell geprüft und gibt keine Zusicherungen bezüglich Sicherheit oder Korrektheit. Benutzung auf eigene Gefahr. contract EmergencyStop { @@ -169,7 +169,7 @@ contract EmergencyStop { } modifier onlyAuthorized { - // Check for authorization of msg.sender here + // Autorisierung von msg.sender hier prüfen _; } @@ -182,11 +182,11 @@ contract EmergencyStop { } function deposit() public payable stoppedInEmergency { - // Deposit logic happening here + // Einzahlungslogik hier } function emergencyWithdraw() public onlyWhenStopped { - // Emergency withdraw happening here + // Notfall-Auszahlung hier } } ``` @@ -195,50 +195,50 @@ Dieses Beispiel zeigt die grundlegenden Merkmale von Notstopps: - `isStopped` ist ein Boolescher Wert, der zu Beginn `false` ergibt und `true`, wenn der Vertrag in den Notfallmodus wechselt. -- Die Funktionsmodifikatoren `onlyWhenStopped` und `stoppedInEmergency` überprüfen die Variable `isStopped`. `stoppedInEmergency` wird verwendet, um Funktionen zu steuern, die nicht zugänglich sein sollten, wenn der Vertrag gefährdet ist (z. B. `deposit()`). Aufrufe dieser Funktionen werden einfach zurückgewiesen. +- Die Funktionsmodifikatoren `onlyWhenStopped` und `stoppedInEmergency` überprüfen die Variable `isStopped`. `stoppedInEmergency` wird verwendet, um Funktionen zu steuern, die unzugänglich sein sollten, wenn der Vertrag anfällig ist (z. B. `deposit()`). Aufrufe dieser Funktionen werden einfach zurückgewiesen. -`onlyWhenStopped` wird für Funktionen verwendet, die in einem Notfall aufrufbar sein sollten (z. B. `emergencyWithdraw()`). Diese Funktionen können zur Lösung des Problems beitragen, weshalb sie nicht in der Liste der „eingeschränkten Funktionen“ aufgeführt sind. +`onlyWhenStopped` wird für Funktionen verwendet, die während eines Notfalls aufrufbar sein sollten (z. B. `emergencyWithdraw()`). Diese Funktionen können zur Lösung des Problems beitragen, weshalb sie nicht in der Liste der „eingeschränkten Funktionen“ aufgeführt sind. Die Verwendung einer Notstopp-Funktion ist eine wirksame Notlösung für den Umgang mit schwerwiegenden Schwachstellen in Ihrem Smart Contract. Allerdings müssen die Nutzer darauf vertrauen können, dass die Entwickler sie nicht aus eigennützigen Gründen aktivieren. Zu diesem Zweck kann die Kontrolle über den Notstopp dezentralisiert werden, indem er entweder einem On-Chain-Abstimmungsmechanismus, einer Zeitsperre oder der Genehmigung durch eine Multisig-Wallet unterworfen wird. -#### Überwachung von Ereignissen {#event-monitoring} +#### Ereignisüberwachung {#event-monitoring} -[Ereignisse](https://docs.soliditylang.org/en/v0.8.15/contracts.html#events) ermöglichen es Ihnen, Aufrufe von Smart Contract-Funktionen zu verfolgen und Änderungen an Zustandsvariablen zu überwachen. Ideal ist es, wenn Sie Ihren Smart Contract so programmieren, dass er immer dann ein Ereignis auslöst, wenn eine Partei eine sicherheitskritische Aktion durchführt (z. B. das Abheben von Guthaben). +[Ereignisse](https://docs.soliditylang.org/en/v0.8.15/contracts.html#events) ermöglichen es Ihnen, Aufrufe von Smart-Contract-Funktionen zu verfolgen und Änderungen an Zustandsvariablen zu überwachen. Ideal ist es, wenn Sie Ihren Smart Contract so programmieren, dass er immer dann ein Ereignis auslöst, wenn eine Partei eine sicherheitskritische Aktion durchführt (z. B. das Abheben von Guthaben). Die Protokollierung von Ereignissen und deren Überwachung off-chain bietet Einblicke in Vertragsvorgänge und hilft, böswillige Handlungen schneller zu entdecken. Das bedeutet, dass Ihr Team schneller auf Hacks reagieren und Maßnahmen ergreifen kann, um die Auswirkungen auf die Benutzer zu minimieren, z. B. das Anhalten von Funktionen oder die Durchführung eines Upgrades. Sie können sich auch für ein handelsübliches Überwachungsprogramm entscheiden, das automatisch Warnmeldungen weiterleitet, sobald jemand mit Ihren Verträgen interagiert. Mit diesen Tools können Sie benutzerdefinierte Warnmeldungen erstellen, die auf verschiedenen Auslösern basieren, z. B. dem Transaktionsvolumen, der Häufigkeit von Funktionsaufrufen oder den spezifischen Funktionen. Sie könnten zum Beispiel eine Warnung programmieren, die eingeht, wenn der in einer einzigen Transaktion abgehobene Betrag einen bestimmten Schwellenwert überschreitet. -### 7. Sichere Governance-Systeme (Verwaltungssysteme) entwerfen {#design-secure-governance-systems} +### 7. Entwerfen Sie sichere Governance-Systeme {#design-secure-governance-systems} Vielleicht möchten Sie Ihre Anwendung dezentralisieren, indem Sie die Kontrolle über die wichtigsten Smart Contracts an Community-Mitglieder übergeben. In diesem Fall wird das Smart-Contract-System ein Governance-Modul enthalten - einen Mechanismus, der es den Mitgliedern der Gemeinschaft ermöglicht, administrative Aktionen über ein On-Chain-Governance-System zu genehmigen. So können die Token-Inhaber beispielsweise über einen Vorschlag abstimmen, einen Proxy-Vertrag auf eine neue Implementierung zu aktualisieren. -Eine dezentrale Verwaltung kann von Vorteil sein, insbesondere weil sie die Interessen von Entwicklern und Endnutzern in Einklang bringt. Dennoch können die Mechanismen zur Steuerung von Smart Contracts bei falscher Umsetzung neue Risiken mit sich bringen. Ein plausibles Szenario ist, dass ein Angreifer durch die Aufnahme eines [Flash-Darlehens](/defi/#flash-loans) enorme Stimmkraft (gemessen an der Anzahl der gehaltenen Token) erlangt und einen böswilligen Vorschlag durchsetzt. +Eine dezentrale Verwaltung kann von Vorteil sein, insbesondere weil sie die Interessen von Entwicklern und Endnutzern in Einklang bringt. Dennoch können die Mechanismen zur Steuerung von Smart Contracts bei falscher Umsetzung neue Risiken mit sich bringen. Ein plausibles Szenario ist, dass ein Angreifer enorme Stimmkraft (gemessen an der Anzahl der gehaltenen Token) durch die Aufnahme eines [Flash-Loans](/defi/#flash-loans) erlangt und einen bösartigen Vorschlag durchsetzt. -Eine Möglichkeit zur Vermeidung von Problemen im Zusammenhang mit der On-Chain-Governance besteht darin, [eine Zeitsperre zu nutzen](https://blog.openzeppelin.com/protect-your-users-with-smart-contract-timelocks/). Eine Zeitsperre verhindert, dass ein Smart Contract bestimmte Aktionen ausführt, bis eine bestimmte Zeitspanne verstrichen ist. Andere Strategien bestehen darin, jedem Token ein „Stimmgewicht“ zuzuweisen, das sich danach richtet, wie lange er gesperrt war, oder die Stimmkraft einer Adresse in einem historischen Zeitraum (z. B. 2-3 Blöcke in der Vergangenheit) anstelle des aktuellen Blocks zu messen. Beide Methoden reduzieren die Möglichkeit, schnell Stimmrecht anzuhäufen, um On-Chain-Abstimmungen zu beeinflussen. +Eine Möglichkeit, Probleme im Zusammenhang mit der Onchain-Governance zu vermeiden, ist die [Verwendung eines Timelocks](https://blog.openzeppelin.com/protect-your-users-with-smart-contract-timelocks/). Eine Zeitsperre verhindert, dass ein Smart Contract bestimmte Aktionen ausführt, bis eine bestimmte Zeitspanne verstrichen ist. Andere Strategien bestehen darin, jedem Token ein „Stimmgewicht“ zuzuweisen, das sich danach richtet, wie lange er gesperrt war, oder die Stimmkraft einer Adresse in einem historischen Zeitraum (z. B. 2-3 Blöcke in der Vergangenheit) anstelle des aktuellen Blocks zu messen. Beide Methoden reduzieren die Möglichkeit, schnell Stimmrecht anzuhäufen, um On-Chain-Abstimmungen zu beeinflussen. -Weitere Informationen zu [der Gestaltung sicherer Governance-Systeme](https://blog.openzeppelin.com/smart-contract-security-guidelines-4-strategies-for-safer-governance-systems/), [verschiedenen Abstimmungsmechanismen in DAOs](https://hackernoon.com/governance-is-the-holy-grail-for-daos) und [den gängigen DAO-Angriffsvektoren, die DeFi nutzen](https://dacian.me/dao-governance-defi-attacks), finden Sie unter den geteilten Links. +Mehr über das [Entwerfen sicherer Governance-Systeme](https://blog.openzeppelin.com/smart-contract-security-guidelines-4-strategies-for-safer-governance-systems/), [verschiedene Abstimmungsmechanismen in DAOs](https://hackernoon.com/governance-is-the-holy-grail-for-daos) und [die gängigen DAO-Angriffsvektoren, die DeFi nutzen](https://dacian.me/dao-governance-defi-attacks), finden Sie in den geteilten Links. -### 8. Reduzierung der Komplexität des Codes auf ein Minimum {#reduce-code-complexity} +### 8. Reduzieren Sie die Komplexität im Code auf ein Minimum {#reduce-code-complexity} Traditionelle Softwareentwickler sind mit dem KISS-Prinzip („Keep it simple, stupid“) vertraut, das davon abrät, unnötige Komplexität in das Softwaredesign einzubringen. Dies entspricht der seit langem vertretenen Auffassung, dass „komplexe Systeme auf komplexe Weise versagen“ und anfälliger für kostspielige Fehler sind. -Beim Schreiben von Smart Contracts ist es besonders wichtig, die Inhalte einfach zu halten, da Smart Contracts potenziell große Wertbeträge kontrollieren. Ein Tipp zur Vereinfachung beim Schreiben von intelligenten Verträgen ist die Wiederverwendung bestehender Bibliotheken, wie [OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/), wo immer möglich. Da diese Bibliotheken von den Entwicklern ausgiebig geprüft und getestet wurden, verringert sich durch ihre Verwendung die Wahrscheinlichkeit, dass durch das Schreiben neuer Funktionen von Grund auf Fehler eingeführt werden. +Beim Schreiben von Smart Contracts ist es besonders wichtig, die Inhalte einfach zu halten, da Smart Contracts potenziell große Wertbeträge kontrollieren. Ein Tipp zur Vereinfachung beim Schreiben von Smart Contracts ist die Wiederverwendung bestehender Bibliotheken, wie z. B. [OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/), wo immer dies möglich ist. Da diese Bibliotheken von den Entwicklern ausgiebig geprüft und getestet wurden, verringert sich durch ihre Verwendung die Wahrscheinlichkeit, dass durch das Schreiben neuer Funktionen von Grund auf Fehler eingeführt werden. Ein weiterer allgemeiner Ratschlag lautet, kleine Funktionen zu schreiben und Verträge modulartig zu halten, indem die Logik auf mehrere Verträge aufgeteilt wird. Das Schreiben von einfacherem Code verringert nicht nur die Angriffsfläche in einem Smart Contract, sondern macht es auch einfacher, Rückschlüsse auf die Korrektheit des Gesamtsystems zu ziehen und mögliche Planungsfehler frühzeitig zu erkennen. -### 9. Schutz vor häufigen Schwachstellen in Smart Contracts {#mitigate-common-smart-contract-vulnerabilities} +### 9. Schützen Sie sich vor häufigen Schwachstellen bei Smart Contracts {#mitigate-common-smart-contract-vulnerabilities} -#### Wiederholungsangriffe {#reentrancy} +#### Reentrancy {#reentrancy} -Die EVM erlaubt keine Nebenläufigkeit, was bedeutet, dass zwei Verträge, die an einem Nachrichtenaufruf beteiligt sind, nicht gleichzeitig ausgeführt werden können. Ein externer Aufruf unterbricht die Ausführung und den Speicher des aufrufenden Vertrags, bis der Aufruf erwidert wird, woraufhin die Ausführung normal fortgesetzt wird. Dieser Vorgang kann formal als Übertragung des [Kontrollflusses](https://www.computerhope.com/jargon/c/contflow.htm) auf einen anderen Vertrag beschrieben werden. +Die EVM erlaubt keine Nebenläufigkeit, was bedeutet, dass zwei Verträge, die an einem Nachrichtenaufruf beteiligt sind, nicht gleichzeitig ausgeführt werden können. Ein externer Aufruf unterbricht die Ausführung und den Speicher des aufrufenden Vertrags, bis der Aufruf erwidert wird, woraufhin die Ausführung normal fortgesetzt wird. Dieser Prozess kann formell als Übertragung des [Kontrollflusses](https://www.computerhope.com/jargon/c/contflow.htm) an einen anderen Vertrag beschrieben werden. Die Übertragung des Kontrollflusses an nicht vertrauenswürdige Verträge ist zwar meist harmlos, kann aber Probleme verursachen, wie z. B. Wiederholungsangriffe. Ein Wiederholungsangriff liegt vor, wenn ein böswilliger Vertrag in einen gefährdeten Vertrag eingreift, bevor der ursprüngliche Funktionsaufruf abgeschlossen ist. Diese Art des Angriffs lässt sich am besten anhand eines Beispiels erklären. Betrachten Sie einen einfachen Smart Contract („Opfer"), der es jedem ermöglicht, Ether einzuzahlen und abzuheben: ```solidity -// This contract is vulnerable. Do not use in production +// Dieser Vertrag ist anfällig. Nicht in der Produktion verwenden contract Victim { mapping (address => uint256) public balances; @@ -256,15 +256,15 @@ contract Victim { } ``` -Dieser Vertrag stellt eine `withdraw()`-Funktion zur Verfügung, die es den Nutzern ermöglicht, zuvor in den Vertrag eingezahlte ETH abzuheben. Bei der Bearbeitung einer Abhebung führt der Vertrag die folgenden Vorgänge durch: +Dieser Vertrag stellt eine `withdraw()`-Funktion zur Verfügung, die es Nutzern ermöglicht, zuvor in den Vertrag eingezahlte ETH abzuheben. Bei der Bearbeitung einer Abhebung führt der Vertrag die folgenden Vorgänge durch: 1. Überprüft das ETH-Guthaben des Nutzers 2. Sendet Guthaben an die anrufende Adresse 3. Setzt das Guthaben auf 0 zurück und verhindert so weitere Abhebungen durch den Nutzer -Die Funktion `withdraw()` im `Victim`-Vertrag folgt einem „Prüfungen-Auswirkungen-Interaktionen“-Modell. Sie _prüft_, ob die für die Ausführung notwendigen Bedingungen erfüllt sind (d. h. der Nutzer hat ein positives ETH-Guthaben) und führt die _Interaktion_ durch, indem sie ETH an die Adresse des Aufrufers sendet, bevor sie die _Auswirkungen_ der Transaktion anwendet (d. h. das Guthaben des Nutzers reduziert). +Die `withdraw()`-Funktion im `Victim`-Vertrag folgt einem „Prüfungen-Interaktionen-Auswirkungen“-Muster. Sie _prüft_, ob die für die Ausführung notwendigen Bedingungen erfüllt sind (d. h. der Nutzer hat ein positives ETH-Guthaben) und führt die _Interaktion_ durch, indem sie ETH an die Adresse des Aufrufers sendet, bevor sie die _Auswirkungen_ der Transaktion anwendet (d. h. das Guthaben des Nutzers verringert). -Wenn `withdraw()` von einem extern betriebenen Konto (EOA) aufgerufen wird, wird die Funktion wie erwartet ausgeführt: `msg.sender.call.value()` sendet ETH an den Aufrufer. Wenn `msg.sender` jedoch ein Smart Contract-Konto ist, welches `withdraw()` aufruft, wird das Senden von Geldmitteln mit `msg.sender.call.value()` auch die Ausführung von Code auslösen, der unter dieser Adresse gespeichert ist. +Wenn `withdraw()` von einem extern verwalteten Konto (EOA) aufgerufen wird, wird die Funktion wie erwartet ausgeführt: `msg.sender.call.value()` sendet ETH an den Aufrufer. Wenn `msg.sender` jedoch ein Smart-Contract-Konto ist, das `withdraw()` aufruft, löst das Senden von Geldern mit `msg.sender.call.value()` auch die Ausführung von Code aus, der an dieser Adresse gespeichert ist. Stellen Sie sich vor, dass dies der Code ist, der an der Vertragsadresse veröffentlicht wird: @@ -289,28 +289,28 @@ Dieser Vertrag ist darauf ausgelegt, drei Dinge zu tun: 2. 1 ETH in den Vertrag des Opfers einzahlen 3. Die im Smart Contract gespeicherten 1 ETH abheben -Hier ist nichts verkehrt, außer dass `Attacker` eine weitere Funktion hat, die `withdraw()` im `Victim` erneut aufruft, wenn das Gas, das vom eingehenden `msg.sender.call.value` übrig bleibt, mehr als 40.000 beträgt. Dies gibt `Attacker` die Möglichkeit, `Victim` erneut zu betreten und mehr Geld abzuheben, _bevor_ der erste Aufruf von `withdraw` abgeschlossen ist. Der Kreislauf sieht folgendermaßen aus: +Daran ist nichts auszusetzen, außer dass `Attacker` eine weitere Funktion hat, die `withdraw()` in `Victim` erneut aufruft, wenn das vom eingehenden `msg.sender.call.value` übrig gebliebene Gas mehr als 40.000 beträgt. Dies gibt `Attacker` die Möglichkeit, `Victim` erneut aufzurufen und mehr Geld abzuheben, _bevor_ die erste Ausführung von `withdraw` abgeschlossen ist. Der Kreislauf sieht folgendermaßen aus: ```solidity -- Attacker's EOA calls `Attacker.beginAttack()` with 1 ETH -- `Attacker.beginAttack()` deposits 1 ETH into `Victim` -- `Attacker` calls `withdraw() in `Victim` -- `Victim` checks `Attacker`’s balance (1 ETH) -- `Victim` sends 1 ETH to `Attacker` (which triggers the default function) -- `Attacker` calls `Victim.withdraw()` again (note that `Victim` hasn’t reduced `Attacker`’s balance from the first withdrawal) -- `Victim` checks `Attacker`’s balance (which is still 1 ETH because it hasn’t applied the effects of the first call) -- `Victim` sends 1 ETH to `Attacker` (which triggers the default function and allows `Attacker` to reenter the `withdraw` function) -- The process repeats until `Attacker` runs out of gas, at which point `msg.sender.call.value` returns without triggering additional withdrawals -- `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 +- EOA des Angreifers ruft `Attacker.beginAttack()` mit 1 ETH auf +- `Attacker.beginAttack()` zahlt 1 ETH in `Victim` ein +- `Attacker` ruft `withdraw()` in `Victim` auf +- `Victim` prüft das Guthaben von `Attacker` (1 ETH) +- `Victim` sendet 1 ETH an `Attacker` (was die Standardfunktion auslöst) +- `Attacker` ruft `Victim.withdraw()` erneut auf (beachten Sie, dass `Victim` das Guthaben von `Attacker` aus der ersten Auszahlung noch nicht reduziert hat) +- `Victim` prüft das Guthaben von `Attacker` (das immer noch 1 ETH beträgt, da die Auswirkungen des ersten Aufrufs noch nicht angewendet wurden) +- `Victim` sendet 1 ETH an `Attacker` (was die Standardfunktion auslöst und `Attacker` erlaubt, die `withdraw`-Funktion erneut aufzurufen) +- Der Prozess wiederholt sich, bis `Attacker` das Gas ausgeht. An diesem Punkt kehrt `msg.sender.call.value` zurück, ohne weitere Auszahlungen auszulösen +- `Victim` wendet schließlich die Ergebnisse der ersten Transaktion (und der nachfolgenden) auf seinen Zustand an, so dass das Guthaben von `Attacker` auf 0 gesetzt wird ``` -Da das Guthaben des Aufrufers nicht auf 0 gesetzt wird, bevor die Funktion ausgeführt wurde, können nachfolgende Aufrufe erfolgreich sein und dem Aufrufer ermöglichen, sein Guthaben mehrmals abzuheben. Diese Art von Angriff kann genutzt werden, um einem Smart Contract das Kapital zu entziehen, wie es beim [2016 DAO-Hack](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/) geschehen ist. Wiederholungsangriffe sind auch heute noch ein kritisches Thema für Smart Contracts, wie [öffentliche Auflistungen von Reentrancy-Exploits](https://github.com/pcaversaccio/reentrancy-attacks) zeigen. +Da das Guthaben des Aufrufers nicht auf 0 gesetzt wird, bevor die Funktion ausgeführt wurde, können nachfolgende Aufrufe erfolgreich sein und dem Aufrufer ermöglichen, sein Guthaben mehrmals abzuheben. Diese Art von Angriff kann genutzt werden, um die Gelder eines Smart Contracts zu entwenden, so wie es beim [DAO-Hack von 2016](https://www.coindesk.com/learn/understanding-the-dao-attack) geschah. Reentrancy-Angriffe sind auch heute noch ein kritisches Problem für Smart Contracts, wie [öffentliche Listen von Reentrancy-Exploits](https://github.com/pcaversaccio/reentrancy-attacks) zeigen. ##### So verhindert man Wiederholungsangriffe -Ein Ansatz für den Umgang mit Wiederholungsangriffen ist das [Prüfungen-Auswirkungen-Interaktionen-Modell](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern). Dieses Modell ordnet die Ausführung von Funktionen so an, dass Code, der vor der Ausführung notwendige Überprüfungen durchführt, zuerst kommt, gefolgt von Code, der den Vertragsstatus manipuliert, und Code, der mit anderen Verträgen oder EOAs interagiert, als letztes erfolgt. +Ein Ansatz zum Umgang mit Reentrancy ist die Befolgung des [Checks-Effects-Interactions-Musters](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern). Dieses Modell ordnet die Ausführung von Funktionen so an, dass Code, der vor der Ausführung notwendige Überprüfungen durchführt, zuerst kommt, gefolgt von Code, der den Vertragsstatus manipuliert, und Code, der mit anderen Verträgen oder EOAs interagiert, als letztes erfolgt. -Das „Prüfungen-Auswirkungen-Interaktionen“-Modell wird in einer überarbeiteten Version des `Victim`-Vertrags verwendet, wie unten gezeigt: +Das Prüfungen-Auswirkungen-Interaktionen-Muster wird in einer überarbeiteten Version des `Victim`-Vertrags verwendet, die unten gezeigt wird: ```solidity contract NoLongerAVictim { @@ -323,9 +323,9 @@ contract NoLongerAVictim { } ``` -Dieser Vertrag führt eine _Überprüfung_ des Guthabens des Nutzers durch, wendet die _Auswirkungen_ der `withdraw()`-Funktion an (indem das Guthaben des Nutzers auf 0 zurückgesetzt wird) und fährt mit der _Interaktion_ (Senden von ETH an die Adresse des Nutzers) fort. Auf diese Weise wird sichergestellt, dass der Vertrag seinen Speicher vor dem externen Aufruf aktualisiert und die Bedingung der Wiederverknüpfung, die den ersten Angriff ermöglichte, beseitigt. Der `Attacker`-Vertrag könnte immer noch zurück in `NoLongerAVictim` aufrufen, aber da `balances[msg.sender]` auf 0 gesetzt wurde, werden zusätzliche Abhebungen einen Fehler auslösen. +Dieser Vertrag führt eine _Prüfung_ des Guthabens des Nutzers durch, wendet die _Auswirkungen_ der `withdraw()`-Funktion an (indem das Guthaben des Nutzers auf 0 zurückgesetzt wird) und fährt dann mit der _Interaktion_ fort (dem Senden von ETH an die Adresse des Nutzers). Auf diese Weise wird sichergestellt, dass der Vertrag seinen Speicher vor dem externen Aufruf aktualisiert und die Bedingung der Wiederverknüpfung, die den ersten Angriff ermöglichte, beseitigt. Der `Attacker`-Vertrag könnte immer noch `NoLongerAVictim` zurückrufen, aber da `balances[msg.sender]` auf 0 gesetzt wurde, werden zusätzliche Abhebungen einen Fehler auslösen. -Eine andere Möglichkeit ist die Verwendung einer gegenseitigen Ausschlusssperre (allgemein als „Mutex“ bezeichnet), die einen Teil des Vertragsstatus sperrt, bis ein Funktionsaufruf abgeschlossen ist. Dies wird durch eine Boolesche Variable realisiert, die vor der Ausführung der Funktion auf `true` gesetzt wird und nach Beendigung des Aufrufs wieder auf `false` zurückkehrt. Wie im folgenden Beispiel zu sehen ist, schützt die Verwendung einer „Mutex“ eine Funktion vor wiederholten Aufrufen, während der ursprüngliche Aufruf noch in Bearbeitung ist, wodurch Wiederholungsangriffe effektiv verhindert werden. +Eine andere Möglichkeit ist die Verwendung einer gegenseitigen Ausschlusssperre (allgemein als „Mutex“ bezeichnet), die einen Teil des Vertragsstatus sperrt, bis ein Funktionsaufruf abgeschlossen ist. Dies wird durch eine boolesche Variable implementiert, die vor der Ausführung der Funktion auf `true` gesetzt wird und nach Abschluss des Aufrufs auf `false` zurückgesetzt wird. Wie im folgenden Beispiel zu sehen ist, schützt die Verwendung einer „Mutex“ eine Funktion vor wiederholten Aufrufen, während der ursprüngliche Aufruf noch in Bearbeitung ist, wodurch Wiederholungsangriffe effektiv verhindert werden. ```solidity pragma solidity ^0.7.0; @@ -335,15 +335,15 @@ contract MutexPattern { mapping(address => uint256) public balances; modifier noReentrancy() { - require(!locked, "Blocked from reentrancy."); + require(!locked, "Wiedereintritt blockiert."); locked = true; _; locked = false; } - // This function is protected by a mutex, so reentrant calls from within `msg.sender.call` cannot call `withdraw` again. - // The `return` statement evaluates to `true` but still evaluates the `locked = false` statement in the modifier + // Diese Funktion ist durch einen Mutex geschützt, so dass reentrante Aufrufe von innerhalb `msg.sender.call` `withdraw` nicht erneut aufrufen können. + // Die `return`-Anweisung wird zu `true` ausgewertet, wertet aber dennoch die `locked = false`-Anweisung im Modifikator aus function withdraw(uint _amount) public payable noReentrancy returns(bool) { - require(balances[msg.sender] >= _amount, "No balance to withdraw."); + require(balances[msg.sender] >= _amount, "Kein Guthaben zum Abheben."); balances[msg.sender] -= _amount; (bool success, ) = msg.sender.call{value: _amount}(""); @@ -354,32 +354,30 @@ contract MutexPattern { } ``` -Sie können auch ein [Pull-Zahlungssystem](https://docs.openzeppelin.com/contracts/5.x/api/security#PullPayment) verwenden, bei dem die Nutzer Geld von den Smart Contracts abheben müssen, anstelle eines „Push-Zahlungssystems“, das Guthaben an Konten sendet. Dies verhindert die Möglichkeit, unbeabsichtigt Code an unbekannten Adressen auszulösen (und kann auch bestimmte Denial-of-Service-Angriffe verhindern). +Sie können auch ein [Pull-Payments](https://docs.openzeppelin.com/contracts/5.x/api/security#PullPayment)-System verwenden, bei dem Nutzer Gelder von den Smart Contracts abheben müssen, anstatt eines „Push-Payments“-Systems, das Gelder an Konten sendet. Dies verhindert die Möglichkeit, unbeabsichtigt Code an unbekannten Adressen auszulösen (und kann auch bestimmte Denial-of-Service-Angriffe verhindern). -#### Integer-Unterläufe und -Überläufe {#integer-underflows-and-overflows} +#### Ganzzahl-Unterläufe und -Überläufe {#integer-underflows-and-overflows} -Ein Integer-Überlauf tritt auf, wenn das Ergebnis einer arithmetischen Operation außerhalb des zulässigen Wertebereichs liegt, so dass es auf den niedrigsten darstellbaren Wert „überläuft“. Zum Beispiel kann ein `uint8` nur Werte bis zu 2^8-1=255 speichern. Arithmetische Operationen, die zu höheren Werten als `255` führen, führen zu einem Überlauf und setzen `uint` auf `0` zurück, ähnlich wie der Kilometerzähler eines Autos auf 0 zurückgesetzt wird, wenn er den maximalen Kilometerstand (999999) erreicht hat. +Ein Integer-Überlauf tritt auf, wenn das Ergebnis einer arithmetischen Operation außerhalb des zulässigen Wertebereichs liegt, so dass es auf den niedrigsten darstellbaren Wert „überläuft“. Zum Beispiel kann ein `uint8` nur Werte bis zu 2^8-1=255 speichern. Arithmetische Operationen, die zu Werten führen, die höher als `255` sind, führen zu einem Überlauf und setzen `uint` auf `0` zurück, ähnlich wie der Kilometerzähler eines Autos auf 0 zurückgesetzt wird, sobald er den maximalen Kilometerstand (999999) erreicht. -Integer-Unterläufe treten aus ähnlichen Gründen auf: Die Ergebnisse einer arithmetischen Operation liegen unterhalb des zulässigen Bereichs. Angenommen, Sie versuchen, `0` in einem `uint8` zu dekrementieren, würde das Ergebnis einfach auf den maximal darstellbaren Wert (`255`) übergehen. +Ganzzahl-Unterläufe treten aus ähnlichen Gründen auf: die Ergebnisse einer arithmetischen Operation fallen unter den zulässigen Bereich. Angenommen, Sie versuchen, `0` in einem `uint8` zu dekrementieren, würde das Ergebnis einfach auf den maximal darstellbaren Wert (`255`) überlaufen. Sowohl Integer-Überläufe als auch -Unterläufe können zu unerwarteten Änderungen an den Zustandsvariablen eines Vertrags führen und eine ungeplante Ausführung zur Folge haben. Das folgende Beispiel zeigt, wie ein Angreifer einen arithmetischen Überlauf in einem Smart Contract ausnutzen kann, um eine ungültige Operation durchzuführen: ``` pragma solidity ^0.7.6; -// This contract is designed to act as a time vault. -// User can deposit into this contract but cannot withdraw for at least a week. -// User can also extend the wait time beyond the 1 week waiting period. +// Dieser Vertrag soll als Zeit-Tresor dienen. +// Nutzer können in diesen Vertrag einzahlen, aber für mindestens eine Woche nicht abheben. +// Nutzer können die Wartezeit auch über die einwöchige Wartezeit hinaus verlängern. /* -1. Deploy TimeLock -2. Deploy Attack with address of TimeLock -3. Call Attack.attack sending 1 ether. You will immediately be able to - withdraw your ether. - -What happened? -Attack caused the TimeLock.lockTime to overflow and was able to withdraw -before the 1 week waiting period. +1. TimeLock bereitstellen +2. Attack mit der Adresse von TimeLock bereitstellen +3. Attack.attack aufrufen und 1 Ether senden. Sie können Ihren Ether sofort abheben. + +Was ist passiert? +Attack hat einen Überlauf bei TimeLock.lockTime verursacht und konnte vor Ablauf der einwöchigen Wartezeit abheben. */ contract TimeLock { @@ -396,14 +394,14 @@ contract TimeLock { } function withdraw() public { - require(balances[msg.sender] > 0, "Insufficient funds"); - require(block.timestamp > lockTime[msg.sender], "Lock time not expired"); + require(balances[msg.sender] > 0, "Unzureichendes Guthaben"); + require(block.timestamp > lockTime[msg.sender], "Sperrzeit nicht abgelaufen"); uint amount = balances[msg.sender]; balances[msg.sender] = 0; (bool sent, ) = msg.sender.call{value: amount}(""); - require(sent, "Failed to send Ether"); + require(sent, "Senden von Ether fehlgeschlagen"); } } @@ -419,11 +417,11 @@ contract Attack { function attack() public payable { timeLock.deposit{value: msg.value}(); /* - if t = current lock time then we need to find x such that + wenn t = aktuelle Sperrzeit, dann müssen wir x so finden, dass x + t = 2**256 = 0 - so x = -t + also x = -t 2**256 = type(uint).max + 1 - so x = type(uint).max + 1 - t + also x = type(uint).max + 1 - t */ timeLock.increaseLockTime( type(uint).max + 1 - timeLock.lockTime(address(this)) @@ -435,15 +433,15 @@ contract Attack { ##### Wie man Integer-Unterläufe und -Überläufe verhindert -Ab Version 0.8.0 weist der Solidity-Compiler Code zurück, der zu Integer-Unterläufen und -Überläufen führt. Verträge, die mit einer niedrigeren Compiler-Version kompiliert wurden, sollten jedoch entweder Überprüfungen für Funktionen durchführen, die arithmetische Operationen beinhalten, oder eine Bibliothek (z. B. [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math)) verwenden, die auf Unterlauf/Überlauf prüft. +Ab Version 0.8.0 weist der Solidity-Compiler Code zurück, der zu Integer-Unterläufen und -Überläufen führt. Verträge, die mit einer niedrigeren Compiler-Version kompiliert wurden, sollten jedoch entweder Prüfungen für Funktionen durchführen, die arithmetische Operationen beinhalten, oder eine Bibliothek (z. B. [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math)) verwenden, die auf Unter-/Überlauf prüft. -#### Oracle-Manipulation {#oracle-manipulation} +#### Orakel-Manipulation {#oracle-manipulation} -[Oracles](/developers/docs/oracles/) beziehen Informationen aus der realen Welt (Off-Chain) und senden sie auf die Blockchain (On-Chain), damit Smart Contracts diese nutzen können. Mit Oracles können Sie Smart Contracts entwickeln, die mit Off-Chain-Systemen wie Kapitalmärkten zusammenarbeiten und dadurch ihre Anwendungsmöglichkeiten stark erweitern. +[Orakel](/developers/docs/oracles/) beziehen Off-Chain-Informationen und senden sie On-Chain, damit Smart Contracts sie verwenden können. Mit Oracles können Sie Smart Contracts entwickeln, die mit Off-Chain-Systemen wie Kapitalmärkten zusammenarbeiten und dadurch ihre Anwendungsmöglichkeiten stark erweitern. Aber wenn das Oracle manipuliert wird und falsche Daten auf die Blockchain sendet, werden Smart Contracts basierend auf falschen Eingaben ausgeführt, was Probleme verursachen kann. Dies ist die Grundlage des „Orakelproblems“, bei dem es darum geht sicherzustellen, dass die Informationen aus einem Blockchain-Orakel korrekt, aktuell und zeitnah sind. -Ein ähnliches Sicherheitsproblem ist die Nutzung eines On-Chain-Oracles, wie zum Beispiel einer dezentralen Börse, um den aktuellen Preis eines Assets zu ermitteln. Leihplattformen in der [dezentralen Finanzbranche (DeFi)](/defi/) tun dies oft, um den Wert der Beleihungsobjekte eines Nutzers zu ermitteln, anhand derer er bestimmen kann, wie viel er leihen kann. +Ein ähnliches Sicherheitsproblem ist die Nutzung eines On-Chain-Oracles, wie zum Beispiel einer dezentralen Börse, um den aktuellen Preis eines Assets zu ermitteln. Kreditplattformen in der Branche der [dezentralen Finanzen (DeFi)](/defi/) tun dies oft, um den Wert der Sicherheiten eines Nutzers zu bestimmen und festzulegen, wie viel er sich leihen kann. Die DEX-Preise sind häufig korrekt, was vor allem darauf zurückzuführen ist, dass Arbitrageure die Gleichheit auf den Märkten wiederherstellen. Die sind aber anfällig für Manipulationen, besonders wenn das On-Chain-Oracle die Assetpreise anhand von historischen Handelsmustern berechnet (was meistens der Fall ist). @@ -451,126 +449,126 @@ So könnte ein Angreifer beispielsweise den Spotpreis eines Assets künstlich in ##### So verhindert man Orakelmanipulation -Die Mindestanforderung, um [Oracle-Manipulation zu vermeiden](https://www.cyfrin.io/blog/price-oracle-manipultion-attacks-with-examples), besteht darin, ein dezentrales Oracle-Netzwerk zu verwenden, das Informationen aus mehreren Quellen abfragt, um einzelne Ausfallpunkte zu vermeiden. In den meisten Fällen verfügen dezentrale Orakel über eingebaute kryptoökonomische Anreize, die die Nodes des Orakels dazu bringen, korrekte Informationen zu melden, was sie sicherer macht als zentralisierte Orakel. +Die Mindestanforderung zur [Vermeidung von Orakel-Manipulation](https://www.cyfrin.io/blog/price-oracle-manipultion-attacks-with-examples) ist die Verwendung eines dezentralen Orakel-Netzwerks, das Informationen aus mehreren Quellen abfragt, um Single Points of Failure zu vermeiden. In den meisten Fällen verfügen dezentrale Orakel über eingebaute kryptoökonomische Anreize, die die Nodes des Orakels dazu bringen, korrekte Informationen zu melden, was sie sicherer macht als zentralisierte Orakel. -Wenn Sie vorhaben, ein On-Chain-Oracle nach Assetpreisen zu befragen, sollten Sie eines in Erwägung ziehen, das einen zeitgewichteten Durchschnittspreis (TWAP) verwendet. Ein [TWAP-Orakel](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) fragt den Preis eines Assets zu zwei verschiedenen Zeitpunkten ab (die Sie ändern können) und berechnet den Spotpreis auf der Grundlage des erhaltenen Durchschnitts. Die Wahl längerer Zeiträume schützt Ihr Protokoll vor Preismanipulationen, da große Aufträge, die erst kürzlich ausgeführt wurden, keinen Einfluss auf die Preise der Assets haben können. +Wenn Sie vorhaben, ein On-Chain-Oracle nach Assetpreisen zu befragen, sollten Sie eines in Erwägung ziehen, das einen zeitgewichteten Durchschnittspreis (TWAP) verwendet. Ein [TWAP-Orakel](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) fragt den Preis eines Vermögenswerts zu zwei verschiedenen Zeitpunkten ab (die Sie ändern können) und berechnet den Kassakurs auf der Grundlage des erhaltenen Durchschnitts. Die Wahl längerer Zeiträume schützt Ihr Protokoll vor Preismanipulationen, da große Aufträge, die erst kürzlich ausgeführt wurden, keinen Einfluss auf die Preise der Assets haben können. -## Ressourcen zur Sicherheit von Smart Contracts für Entwickler {#smart-contract-security-resources-for-developers} +## Ressourcen zur Smart-Contract-Sicherheit für Entwickler {#smart-contract-security-resources-for-developers} -### Tools für die Analyse von Smart Contracts und die Überprüfung der Korrektheit des Codes {#code-analysis-tools} +### Tools zur Analyse von Smart Contracts und zur Überprüfung der Code-Korrektheit {#code-analysis-tools} -- **[Testing-Tools und -Bibliotheken](/developers/docs/smart-contracts/testing/#testing-tools-and-libraries)** - _Sammlung von branchenüblichen Tools und Bibliotheken zur Durchführung von Unit-Tests, statischer Analyse und dynamischer Analyse von Smart Contracts._ +- **[Test-Tools und -Bibliotheken](/developers/docs/smart-contracts/testing/#testing-tools-and-libraries)** – _Sammlung von branchenüblichen Tools und Bibliotheken zur Durchführung von Unit-Tests, statischer Analyse und dynamischer Analyse von Smart Contracts._ -- **[Formale Verifizierungstools](/developers/docs/smart-contracts/formal-verification/#formal-verification-tools)** - _Tools zur Verifizierung der funktionalen Korrektheit in Smart Contracts und zur Überprüfung von Invarianten._ +- **[Tools zur formalen Verifizierung](/developers/docs/smart-contracts/formal-verification/#formal-verification-tools)** – _Tools zur Überprüfung der funktionalen Korrektheit in Smart Contracts und zur Prüfung von Invarianten._ -- **[Smart Contract-Auditing-Dienste](/developers/docs/smart-contracts/testing/#smart-contract-auditing-services)** - _Liste von Organisationen, die Smart Contract-Auditing-Dienste für Ethereum-Entwicklungsprojekte anbieten._ +- **[Smart-Contract-Auditing-Dienste](/developers/docs/smart-contracts/testing/#smart-contract-auditing-services)** – _Liste von Organisationen, die Smart-Contract-Auditing-Dienste für Ethereum-Entwicklungsprojekte anbieten._ -- **[Plattformen zum Aufdecken von Fehlern](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)** - _Plattformen zur Koordinierung des Aufdeckens von Fehlern und zur Belohnung der verantwortungsvollen Offenlegung kritischer Schwachstellen in Smart Contracts._ +- **[Bug-Bounty-Plattformen](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)** – _Plattformen zur Koordinierung von Bug-Bounties und zur Belohnung der verantwortungsvollen Offenlegung kritischer Schwachstellen in Smart Contracts._ -- **[Fork Checker](https://forkchecker.hashex.org/)** - _Ein kostenloses Tool zur Überprüfung aller verfügbaren Informationen bezüglich Fork-Verträgen._ +- **[Fork Checker](https://forkchecker.hashex.org/)** – _Ein kostenloses Online-Tool zur Überprüfung aller verfügbaren Informationen zu einem geforkten Vertrag._ -- **[ABI Encoder](https://abi.hashex.org/)** - _Ein frei nutzbarer Online-Service zum Kodieren Ihrer Solidity-Vertragsfunktionen und Konstruktor-Argumente._ +- **[ABI Encoder](https://abi.hashex.org/)** – _Ein kostenloser Online-Dienst zur Kodierung Ihrer Solidity-Vertragsfunktionen und Konstruktorargumente._ -- **[Aderyn](https://github.com/Cyfrin/aderyn)** – _Solidity-Statikanalyse-Tool, das die abstrakten Syntaxbäume (AST) durchläuft, um vermutete Schwachstellen zu identifizieren und Probleme in einem leicht konsumierbaren Markdown-Format auszugeben._ +- **[Aderyn](https://github.com/Cyfrin/aderyn)** – _Statischer Analysator für Solidity, der die abstrakten Syntaxbäume (AST) durchläuft, um vermutete Schwachstellen zu identifizieren und Probleme in einem leicht verständlichen Markdown-Format auszugeben._ -### Tools für die Überwachung von Smart Contracts {#smart-contract-monitoring-tools} +### Tools zur Überwachung von Smart Contracts {#smart-contract-monitoring-tools} -- **[Tenderly Real-Time Alerting](https://tenderly.co/alerting/)** - _Ein Tool, um Echtzeit-Benachrichtigungen zu erhalten, wenn ungewöhnliche oder unerwartete Ereignisse auf Ihren Smart Contracts oder Wallets auftreten._ +- **[Tenderly Real-Time Alerting](https://tenderly.co/monitoring)** – _Ein Tool, um Echtzeit-Benachrichtigungen zu erhalten, wenn ungewöhnliche oder unerwartete Ereignisse auf Ihren Smart Contracts oder Wallets auftreten._ ### Tools für die sichere Verwaltung von Smart Contracts {#smart-contract-administration-tools} -- **[Safe](https://safe.global/)** - _Smart Contract-Wallet auf Ethereum, die eine Mindestanzahl von Personen benötigt, um eine Transaktion zu genehmigen, bevor sie stattfinden kann (M-of-N)._ +- **[Safe](https://safe.global/)** – _Eine auf Ethereum laufende Smart-Contract-Wallet, die eine Mindestanzahl von Personen zur Genehmigung einer Transaktion erfordert, bevor sie stattfinden kann (M-aus-N)._ -- **[OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/)** - _Vertragsbibliotheken für die Implementierung von Verwaltungsfunktionen, einschließlich Vertragseigentum, Upgrades, Zugriffskontrollen, Governance, Pausierbarkeit und mehr._ +- **[OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/)** – _Vertragsbibliotheken zur Implementierung von Verwaltungsfunktionen, einschließlich Vertragseigentum, Upgrades, Zugriffskontrollen, Governance, Anhaltbarkeit und mehr._ -### Dienstleistungen zur Prüfung von Smart Contracts {#smart-contract-auditing-services} +### Smart-Contract-Auditing-Dienste {#smart-contract-auditing-services} -- **[ConsenSys Diligence](https://consensys.net/diligence/)** - _Audit-Dienst für Smart Contracts, der Projekten im gesamten Blockchain-Ökosystem dabei hilft sicherzustellen, dass ihre Protokolle zur Veröffentlichung bereit sind und dem Schutz der Nutzer dienen._ +- **[ConsenSys Diligence](https://diligence.consensys.io/)** – _Ein Smart-Contract-Auditing-Dienst, der Projekte im gesamten Blockchain-Ökosystem dabei unterstützt sicherzustellen, dass ihre Protokolle startklar und zum Schutz der Nutzer ausgelegt sind._ -- **[CertiK](https://www.certik.com/)** - _Blockchain-Sicherheitsunternehmen, das Pionierarbeit beim Einsatz modernster formaler Verifizierungstechnologie für Smart Contracts und Blockchain-Netzwerke leistet._ +- **[CertiK](https://www.certik.com/)** – _Ein Blockchain-Sicherheitsunternehmen, das Pionierarbeit bei der Anwendung modernster formaler Verifizierungstechnologie auf Smart Contracts und Blockchain-Netzwerke leistet._ -- **[Trail of Bits](https://www.trailofbits.com/)** - _Cybersicherheitsunternehmen, das Sicherheitsforschung mit der Mentalität von Angreifern kombiniert, um Risiken zu verringern und Code zu stärken._ +- **[Trail of Bits](https://www.trailofbits.com/)** – _Ein Cybersicherheitsunternehmen, das Sicherheitsforschung mit einer Angreifermentalität kombiniert, um Risiken zu reduzieren und Code zu stärken._ -- **[PeckShield](https://peckshield.com/)** - _Blockchain-Sicherheitsunternehmen, das Produkte und Dienstleistungen für die Sicherheit, den Datenschutz und die Nutzbarkeit des gesamten Blockchain-Ökosystems bietet._ +- **[PeckShield](https://peckshield.com/)** – _Ein Blockchain-Sicherheitsunternehmen, das Produkte und Dienstleistungen für die Sicherheit, den Datenschutz und die Benutzerfreundlichkeit des gesamten Blockchain-Ökosystems anbietet._ -- **[QuantStamp](https://quantstamp.com/)** - _Audit-Dienst, der die allgemeine Einführung der Blockchain-Technologie durch Sicherheits- und Risikobewertungsdienste erleichtert._ +- **[QuantStamp](https://quantstamp.com/)** – _Ein Auditing-Dienst, der die allgemeine Einführung der Blockchain-Technologie durch Sicherheits- und Risikobewertungsdienste erleichtert._ -- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)** - _Sicherheitsunternehmen für Smart Contracts, das Sicherheitsprüfungen für verteilte Systeme durchführt._ +- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)** – _Ein auf Smart-Contract-Sicherheit spezialisiertes Unternehmen, das Sicherheitsaudits für verteilte Systeme anbietet._ -- **[Runtime Verification](https://runtimeverification.com/)** - _Sicherheitsunternehmen, spezialisiert auf die formale Modellierung und Verifizierung von Smart Contracts._ +- **[Runtime Verification](https://runtimeverification.com/)** – _Ein Sicherheitsunternehmen, das sich auf die formale Modellierung und Verifizierung von Smart Contracts spezialisiert hat._ -- **[Hacken](https://hacken.io)** - _Web3 Cybersicherheitsauditor mit 360-Grad-Ansatz für die Sicherheit der Blockchain._ +- **[Hacken](https://hacken.io)** – _Ein Web3-Cybersicherheits-Auditor, der einen 360-Grad-Ansatz für die Blockchain-Sicherheit verfolgt._ -- **[](https://nethermind.io/smart-contracts-audits)** - _Solidity und Cairo Audit-Dienste sorgen für Datenintegrität der Smart Contracts und Sicherheit der Nutzer im Ethereum- und Starknet-Ökosystem._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** – _Solidity- und Cairo-Auditing-Dienste, die die Integrität von Smart Contracts und die Sicherheit der Nutzer auf Ethereum und Starknet gewährleisten._ -- **[HashEx](https://hashex.org/)** - _HashEx konzentriert sich auf die Prüfung von Blockchain und Smart Contracts, um die Sicherheit von Kryptowährungen zu gewährleisten, und bietet Dienstleistungen wie die Entwicklung von Smart Contracts, Penetrationstests und Blockchain-Beratung._ +- **[HashEx](https://hashex.org/)** – _HashEx konzentriert sich auf die Prüfung von Blockchains und Smart Contracts, um die Sicherheit von Kryptowährungen zu gewährleisten, und bietet Dienstleistungen wie die Entwicklung von Smart Contracts, Penetrationstests und Blockchain-Beratung an._ -- **[Code4rena](https://code4rena.com/)** - _Eine wettbewerbsorientierte Plattform, die Anreize für Sicherheitsexperten zum Aufspüren von Schwachstellen bietet, um das Web3 sicherer zu machen._ +- **[Code4rena](https://code4rena.com/)** – _Eine wettbewerbsorientierte Audit-Plattform, die Anreize für Experten im Bereich Smart-Contract-Sicherheit schafft, Schwachstellen zu finden und dabei zu helfen, Web3 sicherer zu machen._ -- **[CodeHawks](https://codehawks.com/)** – _Plattform für Wettbewerbs-Audits, die Wettbewerbe zum Auditing von Smart Contracts für Sicherheitsforscher veranstaltet._ +- **[CodeHawks](https://codehawks.com/)** – _Eine Plattform für wettbewerbsorientierte Audits, die Wettbewerbe zum Auditing von Smart Contracts für Sicherheitsforscher veranstaltet._ -- **[Cyfrin](https://cyfrin.io)** – _Web3-Sicherheits-Kraftwerk, das Krypto-Sicherheit durch Produkte und Smart-Contract-Audit-Dienste fördert._ +- **[Cyfrin](https://cyfrin.io)** – _Ein Kraftpaket für Web3-Sicherheit, das Krypto-Sicherheit durch Produkte und Smart-Contract-Auditing-Dienste fördert._ -- **[ImmuneBytes](https://www.immunebytes.com//smart-contract-audit/)** – _Web3-Sicherheitsunternehmen, das Sicherheits-Audits für Blockchain-Systeme durch ein Team erfahrener Prüfer und erstklassige Tools anbietet._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** – _Ein Web3-Sicherheitsunternehmen, das Sicherheitsaudits für Blockchain-Systeme durch ein Team erfahrener Prüfer und erstklassiger Tools anbietet._ -- **[Oxorio](https://oxor.io/)** – _Smart-Contract-Audits und Blockchain-Sicherheitsdienste mit Expertise in EVM, Solidity, ZK und Cross-Chain-Technologien für Krypto-Unternehmen und DeFi-Projekte._ +- **[Oxorio](https://oxor.io/)** – _Smart-Contract-Audits und Blockchain-Sicherheitsdienste mit Expertise in EVM, Solidity, ZK, Cross-Chain-Technologie für Krypto-Unternehmen und DeFi-Projekte._ - **[Inference](https://inference.ag/)** – _Sicherheits-Audit-Unternehmen, spezialisiert auf Smart-Contract-Audits für EVM-basierte Blockchains. Dank der fachkundigen Prüfer werden potenzielle Probleme identifiziert und umsetzbare Lösungen vorgeschlagen, um diese Probleme vor der Bereitstellung zu beheben._ -### Plattformen zum Aufdecken von Fehlern {#bug-bounty-platforms} +### Bug-Bounty-Plattformen {#bug-bounty-platforms} -- **[Immunefi](https://immunefi.com/)** - _Bug-Bounty-Plattform für Smart Contracts und DeFi-Projekte, auf der Sicherheitsforscher Code überprüfen, Schwachstellen aufdecken, bezahlt werden und Krypto sicherer machen._ +- **[Immunefi](https://immunefi.com/)** – _Eine Bug-Bounty-Plattform für Smart Contracts und DeFi-Projekte, auf der Sicherheitsforscher Code überprüfen, Schwachstellen aufdecken, bezahlt werden und Krypto sicherer machen._ -- **[HackerOne](https://www.hackerone.com/)** - _Schwachstellen-Koordinations- und Bug-Bounty-Plattform, die Unternehmen mit Penetrationstestern und Cybersecurity-Forschern zusammenbringt._ +- **[HackerOne](https://www.hackerone.com/)** – _Eine Plattform zur Koordination von Schwachstellen und Bug-Bounties, die Unternehmen mit Penetrationstestern und Cybersicherheitsforschern verbindet._ -- **[HackenProof](https://hackenproof.com/)** - _Experten-Bug-Bounty-Plattform für Krypto-Projekte (DeFi, Smart Contracts, Wallets, CEX und mehr), auf der Sicherheitsexperten Triage-Dienste anbieten und Forscher für relevante, verifizierte Fehlerberichte bezahlt werden._ +- **[HackenProof](https://hackenproof.com/)** – _Eine Experten-Bug-Bounty-Plattform für Krypto-Projekte (DeFi, Smart Contracts, Wallets, CEX und mehr), auf der Sicherheitsprofis Triage-Dienste anbieten und Forscher für relevante, verifizierte Fehlerberichte bezahlt werden._ -- **[Sherlock](https://www.sherlock.xyz/)** – _Underwriter in Web3 für die Sicherheit von Smart Contracts, mit Auszahlungen für Prüfer, die über Smart Contracts verwaltet werden, um sicherzustellen, dass relevante Bugs fair bezahlt werden._ +- **[Sherlock](https://www.sherlock.xyz/)** – _Ein Underwriter in Web3 für die Sicherheit von Smart Contracts, bei dem Auszahlungen an Auditoren über Smart Contracts verwaltet werden, um sicherzustellen, dass relevante Fehler fair bezahlt werden._ -- **[CodeHawks](https://www.codehawks.com/)** – _Bug-Bounty-Plattform für Wettbewerb, auf der Prüfer an Sicherheitswettbewerben und -herausforderungen sowie (bald) an ihren eigenen privaten Audits teilnehmen können._ +- **[CodeHawks](https://www.codehawks.com/)** – _Eine wettbewerbsorientierte Bug-Bounty-Plattform, auf der Auditoren an Sicherheitswettbewerben und -herausforderungen sowie (bald) an ihren eigenen privaten Audits teilnehmen._ ### Veröffentlichungen bekannter Schwachstellen und Exploits von Smart Contracts {#common-smart-contract-vulnerabilities-and-exploits} -- **[ConsenSys: Smart Contract Known Attacks](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/)** - _Einsteigerfreundliche Erklärung der wichtigsten Vertragsschwachstellen, mit Beispielcode für die meisten Fälle._ +- **[ConsenSys: Bekannte Angriffe auf Smart Contracts](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/)** – _Eine anfängerfreundliche Erklärung der wichtigsten Vertragsschwachstellen, mit Beispielcode für die meisten Fälle._ -- **[SWC Registry](https://swcregistry.io/)** - _Ausgewählte Liste von Common Weakness Enumeration (CWE) Elementen, die auf Ethereum Smart Contracts zutreffen._ +- **[SWC Registry](https://swcregistry.io/)** – _Eine kuratierte Liste von Common Weakness Enumeration (CWE)-Einträgen, die für Ethereum Smart Contracts gelten._ -- **[Rekt](https://rekt.news/)** - _Regelmäßig aktualisierte Veröffentlichung von hochkarätigen Krypto-Hacks und Exploits, zusammen mit detaillierten Post-Mortem-Berichten._ +- **[Rekt](https://rekt.news/)** – _Eine regelmäßig aktualisierte Veröffentlichung von hochkarätigen Krypto-Hacks und -Exploits, zusammen mit detaillierten Post-Mortem-Berichten._ -### Herausforderungen beim Erlernen der Sicherheit von Smart Contracts {#challenges-for-learning-smart-contract-security} +### Herausforderungen zum Erlernen der Smart-Contract-Sicherheit {#challenges-for-learning-smart-contract-security} -- **[Awesome BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** - _Ausgewählte Liste von Blockchain Security War Games, Challenges und [Capture The Flag](https://www.webopedia.com/definitions/ctf-event/amp/) Wettbewerben und Lösungsbeschreibungen._ +- **[Awesome BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** – _Eine kuratierte Liste von Blockchain-Sicherheits-Wargames, Herausforderungen und [Capture-The-Flag](https://www.webopedia.com/definitions/ctf-event/amp/)-Wettbewerben sowie Lösungsbeschreibungen._ -- **[Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)** - _War Game zum Erlernen der offensiven Sicherheit von DeFi Smart Contracts und zum Aufbau von Fähigkeiten in der Fehlersuche und Sicherheitsprüfung._ +- **[Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)** – _Ein Wargame, um die offensive Sicherheit von DeFi-Smart-Contracts zu erlernen und Fähigkeiten in der Fehlersuche und im Sicherheitsaudit aufzubauen._ -- **[Ethernaut](https://ethernaut.openzeppelin.com/)** - _Web3/Solidity-basiertes War Game, bei dem jedes Level ein Smart Contract ist, der „gehackt“ werden muss._ +- **[Ethernaut](https://ethernaut.openzeppelin.com/)** – _Ein Web3-/Solidity-basiertes Wargame, bei dem jedes Level ein Smart Contract ist, der „gehackt“ werden muss._ -- **[HackenProof x HackTheBox](https://app.hackthebox.com/tracks/HackenProof-Track)** – _Smart-Contract-Hacking-Herausforderung in einem Fantasy-Abenteuer. Der erfolgreiche Abschluss der Herausforderung bietet außerdem Zugang zu einem privaten Bug-Bounty-Programm._ +- **[HackenProof x HackTheBox](https://app.hackthebox.com/tracks/HackenProof-Track)** – _Eine Smart-Contract-Hacking-Herausforderung in einem Fantasy-Abenteuer. Der erfolgreiche Abschluss der Herausforderung bietet außerdem Zugang zu einem privaten Bug-Bounty-Programm._ -### Bewährte Praktiken für die Sicherung von Smart Contracts {#smart-contract-security-best-practices} +### Bewährte Praktiken zur Sicherung von Smart Contracts {#smart-contract-security-best-practices} -- **[ConsenSys: Ethereum Smart Contract Security Best Practices](https://consensys.github.io/smart-contract-best-practices/)** - _Umfassende Liste von Richtlinien zur Sicherung von Ethereum Smart Contracts._ +- **[ConsenSys: Bewährte Praktiken für die Sicherheit von Ethereum Smart Contracts](https://consensys.github.io/smart-contract-best-practices/)** – _Eine umfassende Liste von Richtlinien zur Sicherung von Ethereum Smart Contracts._ -- **[Nascent: Simple Security Toolkit](https://github.com/nascentxyz/simple-security-toolkit)** - _Sammlung praktischer, sicherheitsorientierter Anleitungen und Checklisten für die Entwicklung von Smart Contracts._ +- **[Nascent: Simple Security Toolkit](https://github.com/nascentxyz/simple-security-toolkit)** – _Eine Sammlung praktischer, sicherheitsorientierter Anleitungen und Checklisten für die Entwicklung von Smart Contracts._ -- **[Solidity Patterns](https://fravoll.github.io/solidity-patterns/)** - _Nützliche Zusammenstellung von sicheren Modellen und Best Practices für die Smart Contract-Programmiersprache Solidity._ +- **[Solidity Patterns](https://fravoll.github.io/solidity-patterns/)** – _Eine nützliche Zusammenstellung von sicheren Mustern und bewährten Praktiken für die Smart-Contract-Programmiersprache Solidity._ -- **[Solidity Docs: Security Considerations](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** - _Richtlinien zum Schreiben sicherer Smart Contracts mit Solidity._ +- **[Solidity-Dokumentation: Sicherheitsüberlegungen](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** – _Richtlinien zum Schreiben sicherer Smart Contracts mit Solidity._ -- **[Smart Contract Security Verification Standard](https://github.com/securing/SCSVS)** - _Vierzehnteilige Checkliste zur Standardisierung der Sicherheit von Smart Contracts für Entwickler, Architekten, Sicherheitsüberprüfer und Anbieter._ +- **[Smart Contract Security Verification Standard](https://github.com/securing/SCSVS)** – _Eine vierzehnteilige Checkliste, die erstellt wurde, um die Sicherheit von Smart Contracts für Entwickler, Architekten, Sicherheitsprüfer und Anbieter zu standardisieren._ -- **[Smart Contract Security und Auditing lernen](https://updraft.cyfrin.io/courses/security)** - _Ultimativer Kurs zu Smart Contract Security und Auditing, entwickelt für Smart-Contract-Entwickler, die ihre Security-Best-Practices verbessern und Security-Forscher werden möchten._ +- **[Smart-Contract-Sicherheit und Auditing lernen](https://updraft.cyfrin.io/courses/security)** – _Der ultimative Kurs zu Smart-Contract-Sicherheit und Auditing, entwickelt für Smart-Contract-Entwickler, die ihre Security-Best-Practices verbessern und Sicherheitsforscher werden möchten._ ### Tutorials zur Sicherheit von Smart Contracts {#tutorials-on-smart-contract-security} -- [So schreibt man sichere Smart Contracts](/developers/tutorials/secure-development-workflow/) +- [Wie man sichere Smart Contracts schreibt](/developers/tutorials/secure-development-workflow/) -- [So verwenden Sie Slither, um Bugs in Smart Contracts zu finden](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) +- [Wie man Slither verwendet, um Smart-Contract-Fehler zu finden](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) -- [So finden Sie mit Manticore Fehler in Smart Contract](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) +- [Wie man Manticore verwendet, um Smart-Contract-Fehler zu finden](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) -- [Smart-Contract-Sicherheitsrichtlinien](/developers/tutorials/smart-contract-security-guidelines/) +- [Richtlinien zur Sicherheit von Smart Contracts](/developers/tutorials/smart-contract-security-guidelines/) -- [Wie Sie Ihren Token-Vertrag sicher in beliebige Token integrieren](/developers/tutorials/token-integration-checklist/) +- [Wie Sie Ihren Token-Vertrag sicher mit beliebigen Token integrieren](/developers/tutorials/token-integration-checklist/) -- [Cyfrin Updraft – vollständiger Kurs zu Smart-Contract-Sicherheit und -Auditing](https://updraft.cyfrin.io/courses/security) +- [Cyfrin Updraft – vollständiger Kurs zu Sicherheit und Auditing von Smart Contracts](https://updraft.cyfrin.io/courses/security) diff --git a/public/content/translations/de/developers/docs/smart-contracts/testing/index.md b/public/content/translations/de/developers/docs/smart-contracts/testing/index.md index da40b80bd43..17ed2830337 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/testing/index.md @@ -4,37 +4,37 @@ description: Ein Überblick über Techniken und Überlegungen zum Testen von Eth lang: de --- -Öffentliche Blockchains wie Ethereum sind unveränderlich, was es schwierig macht, den Code von Smart Contracts nach der Veröffentlichung zu verändern. [Upgrade-Muster für Verträge](/developers/docs/smart-contracts/upgrading/) zur Durchführung von „virtuellen Upgrades“ existieren, aber deren Implementierung ist schwierig und erfordert sozialen Konsens. Zudem kann ein Upgrade einen Fehler nur beheben, _nachdem_ er entdeckt wurde. Wenn ein Angreifer die Schwachstelle zuerst entdeckt, besteht die Gefahr, dass Ihr Smart Contract ausgenutzt wird. +Öffentliche Blockchains wie Ethereum sind unveränderlich, was es schwierig macht, den Code von Smart Contracts nach der Veröffentlichung zu verändern. [Upgrade-Muster für Verträge](/developers/docs/smart-contracts/upgrading/) zur Durchführung von „virtuellen Upgrades“ existieren, aber deren Implementierung ist schwierig und erfordert sozialen Konsens. Zudem kann ein Upgrade einen Fehler nur beheben, _nachdem_ er entdeckt wurde – wenn ein Angreifer die Schwachstelle zuerst entdeckt, besteht für Ihren Smart Contract das Risiko eines Exploits. -Aus diesen Gründen ist das Testen von Smart Contracts vor ihrer [Veröffentlichung](/developers/docs/smart-contracts/deploying/) auf dem Mainnet eine [Sicherheits-](/developers/docs/smart-contracts/security/)Mindestanforderung. Es gibt viele Techniken zum Testen von Verträgen und zur Bewertung der Korrektheit des Codes. Für welche davon Sie sich entscheiden, hängt von Ihren Anforderungen ab. Nichtsdestotrotz ist eine Test-Suite, die sich aus verschiedenen Werkzeugen und Ansätzen zusammensetzt, ideal für das Aufspüren sowohl kleinerer als auch größerer Sicherheitslücken im Vertragscode. +Aus diesen Gründen ist das Testen von Smart Contracts vor dem [Bereitstellen](/developers/docs/smart-contracts/deploying/) auf dem Mainnet eine Mindestanforderung für die [Sicherheit](/developers/docs/smart-contracts/security/). Es gibt viele Techniken zum Testen von Verträgen und zur Bewertung der Korrektheit des Codes. Für welche davon Sie sich entscheiden, hängt von Ihren Anforderungen ab. Nichtsdestotrotz ist eine Test-Suite, die sich aus verschiedenen Werkzeugen und Ansätzen zusammensetzt, ideal für das Aufspüren sowohl kleinerer als auch größerer Sicherheitslücken im Vertragscode. ## Voraussetzungen {#prerequisites} -Auf dieser Seite wird erklärt, wie Smart Contracts vor ihrer Veröffentlichung im Ethereum-Netzwerk getestet werden können. Das setzt voraus, dass Sie mit [Smart Contracts](/developers/docs/smart-contracts/) vertraut sind. +Auf dieser Seite wird erklärt, wie Smart Contracts vor ihrer Veröffentlichung im Ethereum-Netzwerk getestet werden können. Dabei wird davon ausgegangen, dass Sie mit [Smart Contracts](/developers/docs/smart-contracts/) vertraut sind. ## Was sind Smart-Contract-Tests? {#what-is-smart-contract-testing} Beim Testen von Smart Contracts wird überprüft, ob der Code eines Smart Contracts wie erwartet funktioniert. Die Tests sind nützlich, um zu prüfen, ob ein bestimmter Smart Contract die Anforderungen an Zuverlässigkeit, Benutzerfreundlichkeit und Sicherheit erfüllt. -Es gibt verschiedene Vorgehensweisen. Für die meisten Testmethoden ist es jedoch erforderlich, einen Smart Contract mit einer kleinen Stichprobe der Daten, die er voraussichtlich verarbeiten soll, auszuführen. Wenn der Vertrag korrekte Ergebnisse für die Beispieldaten liefert, wird davon ausgegangen, dass er ordnungsgemäß funktioniert. Die meisten Testwerkzeuge bieten Ressourcen zum Schreiben und Ausführen von [Testfällen](https://en.m.wikipedia.org/wiki/Test_case). Mit ihnen lässt sich prüfen, ob die Ausführung eines Vertrags die erwarteten Ergebnisse hervorbringt. +Es gibt verschiedene Vorgehensweisen. Für die meisten Testmethoden ist es jedoch erforderlich, einen Smart Contract mit einer kleinen Stichprobe der Daten, die er voraussichtlich verarbeiten soll, auszuführen. Wenn der Vertrag korrekte Ergebnisse für die Beispieldaten liefert, wird davon ausgegangen, dass er ordnungsgemäß funktioniert. Die meisten Testwerkzeuge bieten Ressourcen zum Schreiben und Ausführen von [Testfällen](https://en.m.wikipedia.org/wiki/Test_case), um zu prüfen, ob die Ausführung eines Vertrags mit den erwarteten Ergebnissen übereinstimmt. ### Warum ist es wichtig, Smart Contracts zu testen? {#importance-of-testing-smart-contracts} -Da mithilfe von Smart Contracts häufig hochwertige finanzielle Vermögenswerte verwaltet werden, können kleine Programmierfehler zu [massiven Verlusten für die Benutzer](https://rekt.news/leaderboard/) führen, wozu es häufig auch kommt. Gründliches Testen kann jedoch dazu beitragen, Fehler und Probleme im Code eines Smart Contracts frühzeitig zu entdecken und zu beheben, bevor dieser im Mainnet veröffentlicht wird. +Da Smart Contracts oft hochwertige finanzielle Vermögenswerte verwalten, können bereits kleine Programmierfehler zu [massiven Verlusten für die Benutzer](https://rekt.news/leaderboard/) führen und tun dies auch häufig. Gründliches Testen kann jedoch dazu beitragen, Fehler und Probleme im Code eines Smart Contracts frühzeitig zu entdecken und zu beheben, bevor dieser im Mainnet veröffentlicht wird. -Es ist zwar möglich, einen Vertrag zu aktualisieren, wenn ein Fehler entdeckt wird. Upgrades sind allerdings komplex und können bei unsachgemäßer Handhabung [ u Fehlern führen](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Durch die Aktualisierung eines Vertrags wird der Grundsatz der Unveränderlichkeit weiter ausgehebelt. Außerdem ist sie für die Benutzer mit zusätzlichen Vertrauensvorbehalten verbunden. Umgekehrt mindert ein umfassender Plan zum Testen Ihres Vertrags die Sicherheitsrisiken von Smart Contracts und reduziert die Notwendigkeit, nach der Veröffentlichung komplexe Logik-Upgrades durchzuführen. +Es ist zwar möglich, einen Vertrag zu aktualisieren, wenn ein Bug entdeckt wird, aber Upgrades sind komplex und können bei unsachgemäßer Handhabung zu [Fehlern führen](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Durch die Aktualisierung eines Vertrags wird der Grundsatz der Unveränderlichkeit weiter ausgehebelt. Außerdem ist sie für die Benutzer mit zusätzlichen Vertrauensvorbehalten verbunden. Umgekehrt mindert ein umfassender Plan zum Testen Ihres Vertrags die Sicherheitsrisiken von Smart Contracts und reduziert die Notwendigkeit, nach der Veröffentlichung komplexe Logik-Upgrades durchzuführen. ## Methoden zum Testen von Smart Contracts {#methods-for-testing-smart-contracts} -Die Methoden zum Testen von Smart Contracts auf Ethereum lassen sich in zwei große Kategorien einteilen: **automatisiertes Testen** und **manuelles Testen**. Automatisierte Tests und manuelle Tests bieten einzigartige Vorteile, es müssen für sie aber auch Kompromisse eingegangen werden. Sie können beide Methoden kombinieren, um einen robusten Plan zur Analyse Ihrer Verträge zu entwerfen. +Methoden zum Testen von Ethereum-Smart-Contracts lassen sich in zwei große Kategorien einteilen: **automatisiertes Testen** und **manuelles Testen**. Automatisierte Tests und manuelle Tests bieten einzigartige Vorteile, es müssen für sie aber auch Kompromisse eingegangen werden. Sie können beide Methoden kombinieren, um einen robusten Plan zur Analyse Ihrer Verträge zu entwerfen. -### Automatisierte Tests {#automated-testing} +### Automatisiertes Testen {#automated-testing} -Beim automatisierten Testen werden Werkzeuge eingesetzt, die den Code eines Smart Contracts automatisch auf Fehler bei seiner Ausführung überprüfen. Der Vorteil automatisierter Tests ergibt sich aus der Verwendung von [Skripten](https://www.techtarget.com/whatis/definition/script?amp=1) zur Bewertung der Vertragsfunktionalitäten. Skriptgesteuerte Tests können so geplant werden, dass sie mit minimalen menschlichen Eingriffen wiederholt ausgeführt werden. Dies bedeutet, dass automatisierte Tests effizienter sind als manuelle Testverfahren. +Beim automatisierten Testen werden Werkzeuge eingesetzt, die den Code eines Smart Contracts automatisch auf Fehler bei seiner Ausführung überprüfen. Der Vorteil des automatisierten Testens liegt in der Verwendung von [Skripten](https://www.techtarget.com/whatis/definition/script?amp=1), um die Evaluierung der Vertragsfunktionalitäten zu steuern. Skriptgesteuerte Tests können so geplant werden, dass sie mit minimalen menschlichen Eingriffen wiederholt ausgeführt werden. Dies bedeutet, dass automatisierte Tests effizienter sind als manuelle Testverfahren. -Automatisierte Tests sind vor allem in den folgenden Fällen sinnvoll: bei sich wiederholenden und zeitaufwändigen Tests; wenn sie manuell nur schwer durchführbar sind; bei Anfälligkeit für menschliche Fehler; bei der Bewertung kritischer Vertragsfunktionen. Automatisierte Testwerkzeuge können jedoch auch Nachteile haben – bestimmte Bugs können übersehen werden und zu vielen [falsch-positiven Ergebnissen](https://www.contrastsecurity.com/glossary/false-positive) führen. Daher ist es ideal, automatisierte Tests mit manuellen Tests für Smart Contracts zu kombinieren. +Automatisierte Tests sind vor allem in den folgenden Fällen sinnvoll: bei sich wiederholenden und zeitaufwändigen Tests; wenn sie manuell nur schwer durchführbar sind; bei Anfälligkeit für menschliche Fehler; bei der Bewertung kritischer Vertragsfunktionen. Aber automatisierte Testwerkzeuge können auch Nachteile haben – sie können bestimmte Bugs übersehen und viele [falsch-positive Ergebnisse](https://www.contrastsecurity.com/glossary/false-positive) produzieren. Daher ist es ideal, automatisierte Tests mit manuellen Tests für Smart Contracts zu kombinieren. -### Manuelle Tests {#manual-testing} +### Manuelles Testen {#manual-testing} Manuelle Tests werden von Menschen durchgeführt, wobei jeder Testfall in Ihrer Test-Suite nacheinander ausgeführt wird, um die Korrektheit eines Smart Contracts zu analysieren. Dies steht im Gegensatz zu automatisierten Tests, bei denen Sie gleichzeitig mehrere isolierte Tests für einen Smart Contract durchführen können und einen Bericht mit allen fehlgeschlagenen und bestandenen Tests erhalten. @@ -42,7 +42,7 @@ Manuelle Tests können von einer einzelnen Person gemäß eines schriftlichen Te Effektive manuelle Tests erfordern erhebliche Ressourcen („Fähigkeiten“, „Zeit“, „Geld“ und „Aufwand“) und es kann – aufgrund menschlichen Irrtums – passieren, dass bestimmte Fehler bei der Ausführung von Tests übersehen werden. Aber auch manuelle Tests können von Vorteil sein – so kann ein menschlicher Tester (z. B. ein Auditor) mithilfe seiner Intuition Grenzfälle aufdecken, die ein automatisiertes Testwerkzeug übersehen würde. -## Automatisierte Tests für Smart Contracts {#automated-testing-for-smart-contracts} +## Automatisiertes Testen von Smart Contracts {#automated-testing-for-smart-contracts} ### Unit-Tests {#unit-testing-for-smart-contracts} @@ -54,9 +54,9 @@ Unit-Tests sind nützlich, um zu prüfen, ob Funktionen die erwarteten Werte zur ##### 1. Die Geschäftslogik und den Arbeitsablauf Ihrer Smart Contracts verstehen -Bevor Sie Unit-Tests schreiben, ist es hilfreich zu wissen, welche Funktionalitäten ein Smart Contract bietet und wie die Benutzer auf diese Funktionen zugreifen und sie nutzen. Dies ist besonders nützlich für die Durchführung von [Happy-Path-Tests](https://en.m.wikipedia.org/wiki/Happy_path), mit denen festgestellt wird, ob Funktionen in einem Vertrag die richtige Ausgabe für gültige Benutzereingaben liefern. Wir erklären dieses Konzept anhand dieses (verkürzten) Beispiels eines [Auktionsvertrags](https://docs.soliditylang.org/en/v0.8.17/solidity-by-example.html?highlight=Auction%20contract#simple-open-auction) +Bevor Sie Unit-Tests schreiben, ist es hilfreich zu wissen, welche Funktionalitäten ein Smart Contract bietet und wie die Benutzer auf diese Funktionen zugreifen und sie nutzen. Dies ist besonders nützlich für die Durchführung von [Happy-Path-Tests](https://en.m.wikipedia.org/wiki/Happy_path), mit denen festgestellt wird, ob Funktionen in einem Vertrag die richtige Ausgabe für gültige Benutzereingaben zurückgeben. Wir erklären dieses Konzept anhand dieses (gekürzten) Beispiels eines [Auktionsvertrags](https://docs.soliditylang.org/en/v0.8.17/solidity-by-example.html?highlight=Auction%20contract#simple-open-auction) -``` +```solidity constructor( uint biddingTime, address payable beneficiaryAddress @@ -108,11 +108,11 @@ function auctionEnd() external { } ``` -Hierbei handelt es sich um einen einfachen Auktionsvertrag, der für die Entgegennahme von Geboten während der Gebotsfrist entworfen wurde. Wenn das `highestBid` (Höchstgebot) steigt, erhält der vorherige Höchstbietende sein Geld zurück; sobald die Gebotsfrist vorbei ist, ruft der `Begünstigte` den Vertrag auf, um sein Geld zu erhalten. +Hierbei handelt es sich um einen einfachen Auktionsvertrag, der für die Entgegennahme von Geboten während der Gebotsfrist entworfen wurde. Wenn das `highestBid` steigt, erhält der vorherige Höchstbietende sein Geld zurück. Sobald die Gebotsfrist vorbei ist, ruft der `beneficiary` den Vertrag auf, um sein Geld zu erhalten. -Unit-Tests für einen Vertrag wie diesen würden verschiedene Funktionen abdecken, die ein Benutzer bei der Interaktion mit dem Vertrag aufrufen könnte. Here’s a possible translation into German: Ein Beispiel wäre ein Unit-Test, der überprüft, ob ein Benutzer ein Gebot abgeben kann, während die Auktion noch läuft (z. B. ob Aufrufe zum `bid()` erfolgreich sind), oder einer, der überprüft, ob ein Benutzer ein höheres Gebot als das aktuelle `highestBid` (Höchstgebot) abgeben kann. +Unit-Tests für einen Vertrag wie diesen würden verschiedene Funktionen abdecken, die ein Benutzer bei der Interaktion mit dem Vertrag aufrufen könnte. Ein Beispiel wäre ein Unit-Test, der prüft, ob ein Benutzer ein Gebot abgeben kann, während die Auktion läuft (d. h. Aufrufe von `bid()` sind erfolgreich), oder einer, der prüft, ob ein Benutzer ein höheres Gebot als das aktuelle `highestBid` abgeben kann. -Ein Verständnis des operativen Arbeitsablaufs von Verträgen hilft auch beim Schreiben von Unit-Tests, die prüfen, ob die Ausführung den Anforderungen entspricht. Der Auktionsvertrag legt zum Beispiel fest, dass Benutzer keine Gebote abgeben können, sobald die Auktion beendet ist (d. h., wenn `auctionEndTime` kleiner als `block.timestamp` ist). Ein Entwickler könnte also einen Unit-Test durchführen, der überprüft, ob Aufrufe der Funktion `bid()` erfolgreich sind oder fehlschlagen, wenn die Auktion vorbei ist (d. h. bei `auctionEndTime` > `block.timestamp`). +Ein Verständnis des operativen Arbeitsablaufs von Verträgen hilft auch beim Schreiben von Unit-Tests, die prüfen, ob die Ausführung den Anforderungen entspricht. Der Auktionsvertrag legt zum Beispiel fest, dass Benutzer keine Gebote abgeben können, sobald die Auktion beendet ist (d. h. wenn `auctionEndTime` niedriger ist als `block.timestamp`). Ein Entwickler könnte also einen Unit-Test durchführen, der prüft, ob Aufrufe der `bid()`-Funktion erfolgreich sind oder fehlschlagen, wenn die Auktion beendet ist (d. h. wenn `auctionEndTime` > `block.timestamp`). ##### 2. Alle Annahmen im Zusammenhang mit der Vertragsausführung bewerten @@ -126,11 +126,11 @@ Viele Unit-Test-Frameworks ermöglichen das Aufstellen von Behauptungen – einf - Benutzer, die den Zuschlag nicht erhalten, bekommen ihr Geld wieder gutgeschrieben. -**Hinweis**: Eine weitere Möglichkeit, Annahmen zu testen, besteht im Schreiben von Tests, die [Funktionsmodifikatoren](https://docs.soliditylang.org/en/v0.8.16/contracts.html#function-modifiers) in einem Vertrag auslösen, insbesondere die Anweisungen `require`, `assert` und `if...else`. +**Hinweis**: Eine weitere Möglichkeit, Annahmen zu testen, besteht darin, Tests zu schreiben, die [Funktionsmodifikatoren](https://docs.soliditylang.org/en/v0.8.16/contracts.html#function-modifiers) in einem Vertrag auslösen, insbesondere `require`-, `assert`- und `if…else`-Anweisungen. ##### 3. Codeabdeckung messen -Die [Code-Abdeckung](https://en.m.wikipedia.org/wiki/Code_coverage) ist eine Testmetrik, die die Anzahl der Verzweigungen, Zeilen und Aussagen in Ihrem Code verfolgt, die während der Tests ausgeführt werden. Tests sollten eine gute Code-Abdeckung haben, um das Risiko ungetesteter Schwachstellen zu minimieren. Ohne ausreichende Abdeckung könntest du fälschlicherweise annehmen, dass dein Vertrag sicher ist, weil alle Tests bestanden werden, während Schwachstellen in ungetesteten Code-Pfaden weiterhin bestehen. Der Nachweis einer hohen Code-Abdeckung gibt jedoch Gewissheit, dass alle Aussagen/Funktionen in einem Smart Contract ausreichend auf ihre Korrektheit getestet wurden. +[Codeabdeckung](https://en.m.wikipedia.org/wiki/Code_coverage) ist eine Testmetrik, die die Anzahl der Verzweigungen, Zeilen und Anweisungen in Ihrem Code verfolgt, die während der Tests ausgeführt werden. Tests sollten eine gute Code-Abdeckung haben, um das Risiko ungetesteter Schwachstellen zu minimieren. Ohne ausreichende Abdeckung könntest du fälschlicherweise annehmen, dass dein Vertrag sicher ist, weil alle Tests bestanden werden, während Schwachstellen in ungetesteten Code-Pfaden weiterhin bestehen. Der Nachweis einer hohen Code-Abdeckung gibt jedoch Gewissheit, dass alle Aussagen/Funktionen in einem Smart Contract ausreichend auf ihre Korrektheit getestet wurden. ##### 4. Gut entwickelte Test-Frameworks verwenden @@ -138,41 +138,41 @@ Die Qualität der Werkzeuge, die für die Durchführung von Unit-Tests für Ihre Unit-Test-Frameworks für Solidity Smart Contracts liegen in verschiedenen Sprachen vor (hauptsächlich in JavaScript, Python und Rust). In den folgenden Anleitungen finden Sie Informationen darüber, wie Sie Unit-Tests mit verschiedenen Test-Frameworks durchführen können: -- **[Durchführung von Unit-Tests mit Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** -- **[Durchführung von Unit-Tests mit Foundry](https://book.getfoundry.sh/forge/writing-tests)** -- **[Durchführung von Unit-Tests mit Waffle](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests)** -- **[Durchführung von Unit-Tests mit Remix](https://remix-ide.readthedocs.io/en/latest/unittesting.html#write-tests)** -- **[Durchführung von Unit-Tests mit Ape](https://docs.apeworx.io/ape/stable/userguides/testing.html)** -- **[Durchführung von Unit-Tests mit Hardhat](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** -- **[Durchführung von Unit-Tests mit Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** +- **[Ausführen von Unit-Tests mit Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** +- **[Ausführen von Unit-Tests mit Foundry](https://book.getfoundry.sh/forge/writing-tests)** +- **[Ausführen von Unit-Tests mit Waffle](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests)** +- **[Ausführen von Unit-Tests mit Remix](https://remix-ide.readthedocs.io/en/latest/unittesting.html#write-tests)** +- **[Ausführen von Unit-Tests mit Ape](https://docs.apeworx.io/ape/stable/userguides/testing.html)** +- **[Ausführen von Unit-Tests mit Hardhat](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** +- **[Ausführen von Unit-Tests mit Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** ### Integrationstests {#integration-testing-for-smart-contracts} -Bei Unit-Tests wird das Debugging für Vertragsfunktionen isoliert durchgeführt. Mithilfe von Integrationstests hingegen lassen sich die Komponenten eines Smart Contracts als Ganzes bewerten. Integrationstests können Probleme aufdecken, die sich aus vertragsübergreifenden Aufrufen oder Interaktionen zwischen verschiedenen Funktionen im selben Smart Contract ergeben. Integrationstests können beispielsweise dabei helfen, zu prüfen, ob Dinge wie [Inheritance](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance) und Dependency Injection ordnungsgemäß funktionieren. +Bei Unit-Tests wird das Debugging für Vertragsfunktionen isoliert durchgeführt. Mithilfe von Integrationstests hingegen lassen sich die Komponenten eines Smart Contracts als Ganzes bewerten. Integrationstests können Probleme aufdecken, die sich aus vertragsübergreifenden Aufrufen oder Interaktionen zwischen verschiedenen Funktionen im selben Smart Contract ergeben. Integrationstests können beispielsweise dabei helfen zu prüfen, ob Dinge wie [Vererbung](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance) und Dependency Injection ordnungsgemäß funktionieren. -Integrationstests sind sinnvoll, wenn Ihr Vertrag eine modulare Architektur oder während der Ausführung Schnittstellen mit anderen On-Chain-Verträgen aufweist. Eine Methode, Integrationstests durchzuführen, besteht darin, die Blockchain bei einer bestimmten Höhe zu [spalten](/glossary/#fork) (mithilfe eines Werkzeugs wie [Forge](https://book.getfoundry.sh/forge/fork-testing) oder [Hardhat](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks)) und Interaktionen zwischen Ihrem Vertrag und bereits veröffentlichten Verträgen zu simulieren. +Integrationstests sind nützlich, wenn dein Vertrag eine modulare Architektur verwendet oder während der Ausführung mit anderen Onchain-Verträgen interagiert. Eine Möglichkeit, Integrationstests durchzuführen, besteht darin, bei einer bestimmten Höhe einen [Fork der Blockchain zu erstellen](/glossary/#fork) (mit einem Tool wie [Forge](https://book.getfoundry.sh/forge/fork-testing) oder [Hardhat](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks)) und Interaktionen zwischen Ihrem Vertrag und den bereitgestellten Verträgen zu simulieren. Die abgespaltete Blockchain verhält sich ähnlich wie das Mainnet und verfügt über Konten mit zugehörigen Zuständen und Guthaben. Sie fungiert jedoch nur als lokale Entwicklungsumgebung in einer Sandbox, d. h. Sie benötigen weder echte ETH für Transaktionen noch werden sich Ihre Änderungen auf das tatsächliche Ethereum-Protokoll auswirken. -### Eigenschaftsbasierte Tests {#property-based-testing-for-smart-contracts} +### Eigenschaftsbasiertes Testen {#property-based-testing-for-smart-contracts} Beim eigenschaftsbasierten Testen wird geprüft, ob ein Smart Contract eine bestimmte Eigenschaft erfüllt. Eigenschaften geben Fakten über das Verhalten eines Vertrags an, von denen erwartet wird, dass sie in verschiedenen Szenarien wahr bleiben. Ein Beispiel für eine Smart-Contract-Eigenschaft könnte sein: „Bei arithmetischen Operationen im Vertrag darf es niemals zu einem Über- oder Unterlauf kommen.“ -**Statische Analysen** und **dynamische Analysen** sind zwei gängige Techniken zur Durchführung eigenschaftsbasierter Tests. Mit beiden lässt sich verifizieren, dass der Code eines Programms (in diesem Fall eines Smart Contracts) eine vordefinierte Eigenschaft erfüllt. Für einige eigenschaftsbasierte Testwerkzeuge sind vordefinierte Regeln für erwartete Vertragseigenschaften festgelegt. Der Code wird dann anhand dieser Regeln geprüft. Andere Werkzeuge ermöglichen es Ihnen, benutzerdefinierte Eigenschaften für einen Smart Contract zu bestimmen. +**Statische Analyse** und **dynamische Analyse** sind zwei gängige Techniken zur Durchführung von eigenschaftsbasierten Tests. Mit beiden lässt sich verifizieren, dass der Code für ein Programm (in diesem Fall ein Smart Contract) eine vordefinierte Eigenschaft erfüllt. Für einige eigenschaftsbasierte Testwerkzeuge sind vordefinierte Regeln für erwartete Vertragseigenschaften festgelegt. Der Code wird dann anhand dieser Regeln geprüft. Andere Werkzeuge ermöglichen es Ihnen, benutzerdefinierte Eigenschaften für einen Smart Contract zu bestimmen. #### Statische Analyse {#static-analysis} Beim statischen Analyseprozess wird der Quellcode eines Smart Contracts als Eingabe verwendet. Die ausgegebenen Ergebnisse erklären, ob ein Vertrag eine Eigenschaft erfüllt oder nicht. Im Gegensatz zur dynamischen Analyse wird bei der statischen Analyse ein Vertrag nicht ausgeführt, um ihn auf seine Korrektheit zu prüfen. Bei der statischen Analyse werden stattdessen alle möglichen Pfade ermittelt, die ein Smart Contract während der Ausführung einschlagen könnte (d. h. sie untersucht die Struktur des Quellcodes, um festzustellen, was diese für den Betrieb des Vertrags während der Laufzeit bedeuten könnte).Laufzeit -[Linting](https://www.perforce.com/blog/qac/what-lint-code-and-why-linting-important) und [statische Tests](https://www.techtarget.com/whatis/definition/static-analysis-static-code-analysis) sind gängige Methoden für die Durchführung statischer Analysen von Verträgen. Beide erfordern die Analyse von Low-Level-Repräsentationen der Vertragsausführung, wie zum Beispiel von [abstrakten Syntaxbäumen](https://en.m.wikipedia.org/wiki/Abstract_syntax_tree) und [Kontrollflussdiagrammen](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/amp/), die vom Compiler ausgegeben werden. +[Linting](https://www.perforce.com/blog/qac/what-is-linting) und [statisches Testen](https://www.techtarget.com/whatis/definition/static-analysis-static-code-analysis) sind gängige Methoden zur Durchführung statischer Analysen von Verträgen. Beide erfordern die Analyse von Low-Level-Darstellungen einer Vertragsausführung, wie z. B. [abstrakten Syntaxbäumen](https://en.m.wikipedia.org/wiki/Abstract_syntax_tree) und [Kontrollflussgraphen](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/amp/), die vom Compiler ausgegeben werden. In den meisten Fällen ist die statische Analyse nützlich, um Sicherheitsprobleme wie die Verwendung unsicherer Konstrukte, Syntaxfehler oder Verstöße gegen Codierungsstandards in einem Vertragscode zu erkennen. Es ist jedoch bekannt, dass statische Analysen im Allgemeinen nicht dazu geeignet sind, tiefer liegende Schwachstellen zu erkennen, und dass sie zu viele falsch-positive Ergebnisse liefern können. #### Dynamische Analyse {#dynamic-analysis} -Dynamische Analysen generieren symbolische Eingaben (z. B. bei der [symbolischen Ausführung](https://en.m.wikipedia.org/wiki/Symbolic_execution)) oder konkrete Eingaben (z. B. beim [Fuzzing](https://owasp.org/www-community/Fuzzing)) für die Funktionen eines Smart Contracts, um zu sehen, ob eine Ausführungsspur oder mehrere Ausführungsspuren bestimmte Eigenschaften verletzen. Diese Form des eigenschaftsbasierten Testens unterscheidet sich von Unit-Tests dadurch, dass die Testfälle mehrere Szenarien abdecken und ein Programm die Erstellung der Testfälle übernimmt. +Die dynamische Analyse generiert symbolische Eingaben (z. B. bei der [symbolischen Ausführung](https://en.m.wikipedia.org/wiki/Symbolic_execution)) oder konkrete Eingaben (z. B. beim [Fuzzing](https://owasp.org/www-community/Fuzzing)) für die Funktionen eines Smart Contracts, um zu sehen, ob eine oder mehrere Ausführungsspuren bestimmte Eigenschaften verletzen. Diese Form des eigenschaftsbasierten Testens unterscheidet sich von Unit-Tests dadurch, dass die Testfälle mehrere Szenarien abdecken und ein Programm die Erstellung der Testfälle übernimmt. -[Fuzzing](https://halborn.com/what-is-fuzz-testing-fuzzing/) ist ein Beispiel für eine dynamische Analysetechnik zur Verifizierung beliebiger Eigenschaften in Smart Contracts. Ein Fuzzer ruft Funktionen in einem Zielvertrag mit zufälligen oder missgebildeten Variationen eines definierten Eingabewerts auf. Wenn der Smart Contract in einen Fehlerzustand eintritt (z. B. wenn eine Behauptung fehlschlägt), wird das Problem gekennzeichnet, und die Eingaben, die die Ausführung in Richtung des anfälligen Pfads steuern, werden in einem Bericht aufgeführt. +[Fuzzing](https://www.halborn.com/blog/post/what-is-fuzz-testing-fuzzing) ist ein Beispiel für eine dynamische Analysetechnik zur Verifizierung beliebiger Eigenschaften in Smart Contracts. Ein Fuzzer ruft Funktionen in einem Zielvertrag mit zufälligen oder missgebildeten Variationen eines definierten Eingabewerts auf. Wenn der Smart Contract in einen Fehlerzustand eintritt (z. B. wenn eine Behauptung fehlschlägt), wird das Problem gekennzeichnet, und die Eingaben, die die Ausführung in Richtung des anfälligen Pfads steuern, werden in einem Bericht aufgeführt. Fuzzing ist nützlich, um den Mechanismus zur Eingabevalidierung von Smart Contracts zu bewerten, da eine unsachgemäße Handhabung unerwarteter Eingaben eine unbeabsichtigte Ausführung zur Folge und gefährliche Auswirkungen haben kann. Diese Form eigentumsbasierter Tests kann aus vielen Gründen ideal sein: @@ -180,24 +180,24 @@ Fuzzing ist nützlich, um den Mechanismus zur Eingabevalidierung von Smart Contr 2. **Ihre Test-Suite deckt möglicherweise nicht alle möglichen Pfade innerhalb des Programms ausreichend ab.** Selbst bei einer 100-prozentigen Abdeckung ist es möglich, Grenzfälle zu übersehen. -3. **Unit-Tests beweisen, dass ein Vertrag für Beispieldaten korrekt ausgeführt wird. Ob der Vertrag für Eingaben außerhalb des Beispielbereichs allerdings korrekt ausgeführt wird, bleibt unbekannt.** Eigenschaftstests führen einen Zielvertrag mit mehreren Variationen eines bestimmten Eingabewerts aus, um Ausführungsspuren zu finden, die Behauptungsfehler verursachen. Somit bietet ein Eigenschaftstest mehr Garantien, dass ein Vertrag für eine breite Klasse von Eingabedaten korrekt ausgeführt wird. +3. **Unit-Tests beweisen, dass ein Vertrag für Beispieldaten korrekt ausgeführt wird, aber ob der Vertrag auch für Eingaben außerhalb der Stichprobe korrekt ausgeführt wird, bleibt unbekannt.** Eigenschaftstests führen einen Zielvertrag mit mehreren Variationen eines bestimmten Eingabewerts aus, um Ausführungsspuren zu finden, die zu Assertionsfehlern führen. Somit bietet ein Eigenschaftstest mehr Garantien, dass ein Vertrag für eine breite Klasse von Eingabedaten korrekt ausgeführt wird. ### Richtlinien für die Durchführung von eigenschaftsbasierten Tests für Smart Contracts {#running-property-based-tests} -Das Durchführen von eigenschaftsbasierten Tests beginnt in der Regel mit der Festlegung einer Eigenschaft (z. B. Abwesenheit von [Ganzzahl-Überläufen](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow)) oder einer Sammlung von Eigenschaften, die Sie in einem Smart Contract verifizieren möchten. Möglicherweise müssen Sie beim Schreiben von Eigenschaftstests auch einen Wertebereich festlegen, innerhalb dessen das Programm Daten für Transaktionseingaben generieren kann. +Die Durchführung von eigenschaftsbasierten Tests beginnt in der Regel mit der Definition einer Eigenschaft (z. B. der Abwesenheit von [Ganzzahl-Überläufen](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow)) oder einer Sammlung von Eigenschaften, die Sie in einem Smart Contract überprüfen möchten. Möglicherweise müssen Sie beim Schreiben von Eigenschaftstests auch einen Wertebereich festlegen, innerhalb dessen das Programm Daten für Transaktionseingaben generieren kann. Sobald das Eigenschafts-Testwerkzeug richtig konfiguriert ist, führt es Ihre Smart-Contract-Funktionen mit zufällig generierten Eingaben aus. Wenn irgendwelche Verstöße gegen Behauptungen vorliegen, sollten Sie einen Bericht mit konkreten Eingabedaten erhalten, die gegen die zu bewertende Eigenschaft verstoßen. In den folgenden Anleitungen finden Sie Informationen für den Einstieg in die Durchführung von eigenschaftsbasierten Tests mit verschiedenen Werkzeugen: -- **[Statische Analyse von Smart Contracts mit Slither](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither#slither)** +- **[Statische Analyse von Smart Contracts mit Slither](https://github.com/crytic/slither)** - **[Statische Analyse von Smart Contracts mit Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** -- **[Eigenschaftsbasierte Tests mit Brownie](https://eth-brownie.readthedocs.io/en/stable/tests-hypothesis-property.html)** +- **[Eigenschaftsbasiertes Testen mit Brownie](https://eth-brownie.readthedocs.io/en/stable/tests-hypothesis-property.html)** - **[Fuzzing von Verträgen mit Foundry](https://book.getfoundry.sh/forge/fuzz-testing)** - **[Fuzzing von Verträgen mit Echidna](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna#echidna-tutorial)** - **[Fuzzing von Verträgen mit Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/fuzzing/)** - **[Symbolische Ausführung von Smart Contracts mit Manticore](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore#manticore-tutorial)** - **[Symbolische Ausführung von Smart Contracts mit Mythril](https://mythril-classic.readthedocs.io/en/master/tutorial.html)** -## Manuelle Tests für Smart Contracts {#manual-testing-for-smart-contracts} +## Manuelles Testen von Smart Contracts {#manual-testing-for-smart-contracts} Das manuelle Testen von Smart Contracts erfolgt oft erst später im Entwicklungszyklus, nachdem automatisierte Tests durchgeführt wurden. Bei dieser Form des Testens wird der Smart Contract als vollständig integriertes Produkt bewertet, um festzustellen, ob er die in den technischen Anforderungen festgelegten Leistungen erbringt. @@ -205,104 +205,106 @@ Das manuelle Testen von Smart Contracts erfolgt oft erst später im Entwicklungs Automatisierte Tests, die in einer lokalen Entwicklungsumgebung durchgeführt werden, können zwar nützliche Debugging-Informationen liefern. Für Sie ist es allerdings wichtig, zu wissen, wie sich Ihr Smart Contract in einer Produktionsumgebung verhält. Bei einer Veröffentlichung auf dem Ethereum-Mainnet fallen jedoch Gas-Gebühren an – ganz zu schweigen davon, dass Sie oder Ihre Benutzer echtes Geld verlieren können, wenn Ihr Smart Contract noch Fehler aufweist. -Das Testen Ihres Vertrags auf einer lokalen Blockchain (auch bekannt als ein [Entwicklungsnetzwerk](/developers/docs/development-networks/)) ist eine empfohlene Alternative zum Testen auf dem Mainnet. Eine lokale Blockchain ist eine Kopie der Ethereum-Blockchain, die lokal auf Ihrem Computer läuft und das Verhalten der Ausführungsebene von Ethereum simuliert. Dementsprechend können Sie Transaktionen so programmieren, dass sie mit einem Vertrag interagieren, ohne signifikante zusätzliche Kosten zu verursachen. +Das Testen Ihres Vertrags auf einer lokalen Blockchain (auch als [Entwicklungsnetzwerk](/developers/docs/development-networks/) bezeichnet) ist eine empfohlene Alternative zum Testen auf dem Mainnet. Eine lokale Blockchain ist eine Kopie der Ethereum-Blockchain, die lokal auf Ihrem Computer läuft und das Verhalten der Ausführungsebene von Ethereum simuliert. Dementsprechend können Sie Transaktionen so programmieren, dass sie mit einem Vertrag interagieren, ohne signifikante zusätzliche Kosten zu verursachen. -Die Ausführung von Verträgen auf einer lokalen Blockchain könnte als eine Form manueller Integrationstests nützlich sein. [Smart Contracts sind in hohem Maße zusammensetzbar](/developers/docs/smart-contracts/composability/), sodass sie in bestehende Protokolle integriert werden können. Dennoch müssen Sie sicherstellen, dass solche komplexen On-Chain-Interaktionen die richtigen Ergebnisse liefern. +Die Ausführung von Verträgen auf einer lokalen Blockchain könnte als eine Form manueller Integrationstests nützlich sein. [Smart Contracts sind hochgradig komponierbar](/developers/docs/smart-contracts/composability/), was es Ihnen ermöglicht, sie mit bestehenden Protokollen zu integrieren – Sie müssen jedoch trotzdem sicherstellen, dass solch komplexe Onchain-Interaktionen die korrekten Ergebnisse liefern. -[Mehr zu Entwicklungsnetzwerken.](/developers/docs/development-networks/) +[Mehr über Entwicklungsnetzwerke.](/developers/docs/development-networks/) -### Testen von Verträgen auf Testnetzen {#testing-contracts-on-testnets} +### Testen von Verträgen auf Testnets {#testing-contracts-on-testnets} -Ein Testnetzwerk oder Testnet funktioniert genau wie das Ethereum-Mainnet, außer dass es Ether (ETH) verwendet, das keinen realen Wert hat. Das Veröffentlichen Ihres Vertrags auf einem [Testnetz](/developers/docs/networks/#ethereum-testnets) bedeutet, dass jeder damit interagieren kann (z. B. über das Frontend der DApps), ohne Geldmittel zu riskieren. +Ein Testnetzwerk oder Testnet funktioniert genau wie das Ethereum-Mainnet, außer dass es Ether (ETH) verwendet, das keinen realen Wert hat. Das Bereitstellen Ihres Vertrags auf einem [Testnet](/developers/docs/networks/#ethereum-testnets) bedeutet, dass jeder damit interagieren kann (z. B. über das Frontend der Dapp), ohne Gelder zu riskieren. Diese Form manueller Tests ist nützlich, um den End-to-End-Flow Ihrer Anwendung aus der Sicht des Benutzers zu bewerten. Hier können Beta-Tester auch Testläufe durchführen und etwaige Probleme mit der Geschäftslogik und der Gesamtfunktionalität des Vertrags melden. Die Veröffentlichung in einem Testnetz nach dem Testen auf einer lokalen Blockchain ist ideal, da Ersteres eher dem Verhalten der Ethereum Virtual Machine entspricht. Daher ist es bei vielen Ethereum-nativen Projekten üblich, DApps in Testnetzen zu veröffentlichen, um so den Betrieb von Smart Contracts unter realen Bedingungen zu simulieren. -[Mehr über Ethereum-Testnetze.](/developers/docs/development-networks/#public-beacon-testchains) +[Mehr über Ethereum-Testnets.](/developers/docs/development-networks/#public-beacon-testchains) ## Testen vs. formale Verifizierung {#testing-vs-formal-verification} -Zwar helfen Tests bei der Bestätigung, dass ein Vertrag für einige Dateneingaben die erwarteten Ergebnisse liefert. Sie können jedoch nicht schlüssig beweisen, dass dies auch für Eingaben gilt, die während der Tests nicht verwendet wurden. Das Testen eines Smart Contracts kann daher keine „funktionale Korrektheit“ garantieren (d. h. es kann nicht zeigen, dass sich eine Anwendung für _alle_ Arten von Eingabewerten wie gewünscht verhält). +Zwar helfen Tests bei der Bestätigung, dass ein Vertrag für einige Dateneingaben die erwarteten Ergebnisse liefert. Sie können jedoch nicht schlüssig beweisen, dass dies auch für Eingaben gilt, die während der Tests nicht verwendet wurden. Das Testen eines Smart Contracts kann daher keine „funktionale Korrektheit“ garantieren (d. h. es kann nicht beweisen, dass sich ein Programm für _alle_ Sätze von Eingabewerten wie erforderlich verhält). Die formale Verifizierung ist ein Ansatz zur Bewertung der Korrektheit von Software, indem geprüft wird, ob ein formales Modell des Programms mit der formalen Spezifikation übereinstimmt. Ein formales Modell ist eine abstrakte mathematische Darstellung eines Programms, wohingegen eine formale Spezifikation die Eigenschaften eines Programms definiert (d. h. logische Behauptungen über die Ausführung des Programms). Da die Eigenschaften in mathematischen Begriffen geschrieben sind, ist es möglich, zu verifizieren, ob ein formales (mathematisches) Modell des Systems eine Spezifikation mithilfe logischer Inferenzregeln erfüllt. Daher liefern formale Verifizierungswerkzeuge angeblich einen „mathematischen Beweis“ für die Korrektheit eines Systems. -Im Gegensatz zu Tests kann mit der formalen Verifizierung überprüft werden, ob die Ausführung eines Smart Contracts eine formale Spezifikation für _alle_ Ausführungen erfüllt (d. h. keine Bugs aufweist), ohne dass sie mit Beispieldaten ausgeführt werden muss. Dies reduziert nicht nur den Zeitaufwand für die Durchführung von Dutzenden von Unit-Tests, sondern ist auch effektiver beim Aufspüren versteckter Schwachstellen. Abgesehen davon liegen die formalen Verifizierungstechniken auf einem Spektrum, das sich nach der erforderlichen Rechenleistung der Implementierung und ihrer Nützlichkeit richtet. +Im Gegensatz zum Testen kann die formale Verifizierung verwendet werden, um zu überprüfen, ob die Ausführung eines Smart Contracts eine formale Spezifikation für _alle_ Ausführungen erfüllt (d. h. keine Bugs aufweist), ohne sie mit Beispieldaten ausführen zu müssen. Dies reduziert nicht nur den Zeitaufwand für die Durchführung von Dutzenden von Unit-Tests, sondern ist auch effektiver beim Aufspüren versteckter Schwachstellen. Abgesehen davon liegen die formalen Verifizierungstechniken auf einem Spektrum, das sich nach der erforderlichen Rechenleistung der Implementierung und ihrer Nützlichkeit richtet. [Mehr zur formalen Verifizierung von Smart Contracts.](/developers/docs/smart-contracts/formal-verification) -## Testen vs. Audits und Bug-Kopfgeld {#testing-vs-audits-bug-bounties} +## Testen vs. Audits und Bug-Bounties {#testing-vs-audits-bug-bounties} Wie bereits erwähnt, können strenge Tests nur selten das Fehlen von Bugs in einem Vertrag garantieren. Formale Verifizierungsansätze können eine stärkere Garantie für die Korrektheit bieten, sind aber derzeit schwierig anzuwenden und mit erheblichen Kosten verbunden. -Dennoch können Sie die Wahrscheinlichkeit weiter erhöhen, dass Schwachstellen im Vertrag entdeckt werden, indem Sie eine unabhängige Code-Prüfung durchführen lassen. [Smart-Contract-Audits](https://www.immunebytes.com/blog/what-is-a-smart-contract-audit/) und [Bug-Kopfgeld](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7) sind zwei Möglichkeiten, um zu veranlassen, dass andere Ihre Verträge analysieren. +Dennoch können Sie die Wahrscheinlichkeit weiter erhöhen, dass Schwachstellen im Vertrag entdeckt werden, indem Sie eine unabhängige Code-Prüfung durchführen lassen. [Smart-Contract-Audits](https://www.immunebytes.com/blog/what-is-a-smart-contract-audit/) und [Bug-Bounties](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7) sind zwei Möglichkeiten, um Ihre Verträge von anderen analysieren zu lassen. Die Audits werden von Auditoren durchgeführt, die erfahren darin sind, Sicherheitslücken und schlechte Entwicklungspraktiken in Smart Contracts aufzudecken. Ein Audit umfasst in der Regel Tests (und möglicherweise eine formale Verifizierung) sowie eine manuelle Überprüfung der gesamten Codebasis. -Im Gegensatz dazu wird bei einem Bug-Kopfgeld-Programm üblicherweise eine finanzielle Belohnung an eine Person (allgemein als [Whitehat-Hacker](https://en.wikipedia.org/wiki/White_hat_(computer_security)) bezeichnet) gezahlt, die eine Schwachstelle in einem Smart Contract entdeckt und sie den Entwicklern meldet. Bug-Kopfgeld ähnelt insofern Audits, da seine Funktionsweise mit einschließt, dass andere gebeten werden, bei der Suche nach Fehlern in Smart Contracts zu helfen. +Umgekehrt beinhaltet ein Bug-Bounty-Programm in der Regel das Anbieten einer finanziellen Belohnung für eine Person (allgemein als [White-Hat-Hacker](https://en.wikipedia.org/wiki/White_hat_\(computer_security\)>) beschrieben), die eine Schwachstelle in einem Smart Contract entdeckt und sie den Entwicklern offenlegt. Bug-Kopfgeld ähnelt insofern Audits, da seine Funktionsweise mit einschließt, dass andere gebeten werden, bei der Suche nach Fehlern in Smart Contracts zu helfen. Der Hauptunterschied besteht darin, dass Bug-Kopfgeld-Programme der breiteren Entwickler-/Hacker-Community offenstehen und eine breite Klasse von ethischen Hackern und unabhängigen Sicherheitsexperten mit einzigartigen Fähigkeiten und einzigartiger Erfahrung ansprechen. Dies kann ein Vorteil gegenüber Audits von Smart Contracts sein, die sich hauptsächlich auf Teams stützen, die möglicherweise nur über begrenzte oder eingeschränkte Fachkenntnisse verfügen. -## Testwerkzeuge und Bibliotheken {#testing-tools-and-libraries} +## Testwerkzeuge und -bibliotheken {#testing-tools-and-libraries} -### Unit-Testing-Werkzeuge {#unit-testing-tools} +### Unit-Test-Werkzeuge {#unit-testing-tools} -- **[Solidity-Abdeckung](https://github.com/sc-forks/solidity-coverage)** – _Code-Abdeckungswerkzeug für in Solidity geschriebene Smart Contracts._ +- **[solidity-coverage](https://github.com/sc-forks/solidity-coverage)** – _Code-Abdeckungs-Tool für in Solidity geschriebene Smart Contracts._ -- **[Waffle](https://ethereum-waffle.readthedocs.io/en/latest/)** – _Framework für die Entwicklung und das Testen fortgeschrittener Smart Contracts (basierend auf ethers.js)_. +- **[Waffle](https://ethereum-waffle.readthedocs.io/en/latest/)** – _Framework für die fortgeschrittene Entwicklung und das Testen von Smart Contracts (basiert auf ethers.js)_. -- **[Remix Tests](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests)** – _Werkzeug zum Testen von Solidity-Smart-Contracts. Arbeitet unter dem Remix IDE „Solidity Unit Testing“-Plug-in, das zum Schreiben und Ausführen von Testfällen für einen Vertrag verwendet wird._ +- **[Remix Tests](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests)** – _Tool zum Testen von Solidity Smart Contracts._ Arbeitet unter dem Remix IDE „Solidity Unit Testing“-Plug-in, das zum Schreiben und Ausführen von Testfällen für einen Vertrag verwendet wird._ -- **[OpenZeppelin Test Helpers](https://github.com/OpenZeppelin/openzeppelin-test-helpers)** – _Behauptungsbibliothek für das Testen von Ethereum-Smart-Contracts. Stellen Sie sicher, dass sich Ihre Verträge wie erwartet verhalten!_ +- **[OpenZeppelin Test Helpers](https://github.com/OpenZeppelin/openzeppelin-test-helpers)** – _Assertionsbibliothek für das Testen von Ethereum Smart Contracts._ Stellen Sie sicher, dass sich Ihre Verträge wie erwartet verhalten!_ -- **[Brownie-Unit-Testing-Framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** – _Brownie nutzt Pytest, ein funktionsreiches Test-Framework, mit dem Sie kleine Tests mit minimalem Code schreiben können. Außerdem lässt es sich gut für große Projekte skalieren und ist in hohem Maße erweiterbar._ +- **[Brownie Unit-Testing-Framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie nutzt Pytest, ein funktionsreiches Testframework, mit dem Sie kleine Tests mit minimalem Code schreiben können, das gut für große Projekte skaliert und in hohem Maße erweiterbar ist._ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** – _Foundry bietet mit Forge ein schnelles und flexibles Ethereum-Testing-Framework an, das einfache Unit-Tests, Gas-Optimierungsprüfungen und Vertrags-Fuzzing durchführen kann._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** – _Foundry bietet mit Forge ein schnelles und flexibles Ethereum-Testframework an, das einfache Unit-Tests, Gas-Optimierungsprüfungen und Vertrags-Fuzzing durchführen kann._ -- **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** – _Framework zum Testen von Smart Contracts basierend auf ethers.js, Mocha und Chai._ +- **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** – _Framework zum Testen von Smart Contracts, basierend auf ethers.js, Mocha und Chai._ -- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** – _auf Python basiertes Entwicklungs- und Test-Framework für Smart Contracts für die Ethereum Virtual Machine._ +- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** – _Python-basiertes Entwicklungs- und Testframework für Smart Contracts, die auf die Ethereum Virtual Machine abzielen._ -- **[Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** – _Python-basiertes Framework für Unit-Testing und Fuzzing mit starken Debugging-Funktionen und Unterstützung für Cross-Chain-Tests, das Pytest und Anvil nutzt, um die beste Benutzererfahrung und Leistung zu bieten._ +- **[Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** – _Python-basiertes Framework für Unit-Tests und Fuzzing mit starken Debugging-Funktionen und Cross-Chain-Testunterstützung, das Pytest und Anvil für die beste Benutzererfahrung und Leistung nutzt._ ### Eigenschaftsbasierte Testwerkzeuge {#property-based-testing-tools} -#### Werkzeuge zur statischen Analyse {#static-analysis-tools} +#### Werkzeuge für die statische Analyse {#static-analysis-tools} -- **[Slither](https://github.com/crytic/slither)** – _Python-basiertes Solidity-Framework zur statischen Analyse, um Schwachstellen aufzudecken, das Codeverständnis zu verbessern und benutzerdefinierte Analysen für Smart Contracts zu schreiben._ +- **[Slither](https://github.com/crytic/slither)** – _Python-basiertes Framework für die statische Analyse von Solidity zum Finden von Schwachstellen, zur Verbesserung des Code-Verständnisses und zum Schreiben benutzerdefinierter Analysen für Smart Contracts._ -- **[Ethlint](https://cyfrin.io/tools/aderyn)** – _Kinder für die Durchsetzung von Best-Practices bezüglich Stil und Sicherheit für die Solidity-Programmiersprache für Smart Contracts._ +- **[Ethlint](https://ethlint.readthedocs.io/en/latest/)** – _Linter zur Durchsetzung von Stil- und Sicherheits-Best-Practices für die Smart-Contract-Programmiersprache Solidity._ - **[Cyfrin Aderyn](https://cyfrin.io/tools/aderyn)** – _Rust-basiertes statisches Analysetool, das speziell für die Sicherheit und Entwicklung von Web3-Smart-Contracts konzipiert wurde._ -- **[Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** – _Python-basiertes Framework für die statische Analyse mit Detektoren für Schwachstellen und Codequalität, Druckern zum Extrahieren nützlicher Informationen aus dem Code und Unterstützung für das Schreiben benutzerdefinierter Submodule._ +- **[Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** – _Python-basiertes Framework für statische Analyse mit Detektoren für Schwachstellen und Codequalität, Printern zum Extrahieren nützlicher Informationen aus dem Code und Unterstützung für das Schreiben benutzerdefinierter Submodule._ + +- **[Slippy](https://github.com/fvictorio/slippy)** – _Ein einfacher und leistungsstarker Linter für Solidity._ -#### Werkzeuge zur dynamischen Analyse {#dynamic-analysis-tools} +#### Werkzeuge für die dynamische Analyse {#dynamic-analysis-tools} - **[Echidna](https://github.com/crytic/echidna/)** – _Schneller Vertrags-Fuzzer zum Aufspüren von Schwachstellen in Smart Contracts mithilfe von eigenschaftsbasierten Tests._ - **[Diligence Fuzzing](https://consensys.net/diligence/fuzzing/)** – _Automatisiertes Fuzzing-Werkzeug zum Aufspüren von Eigenschaftsverstößen im Smart-Contract-Code._ -- **[Manticore](https://manticore.readthedocs.io/en/latest/index.html)** – _Dynamisches symbolisches Ausführungs-Framework für die Analyse von EVM-Bytecode._ +- **[Manticore](https://manticore.readthedocs.io/en/latest/index.html)** – _Dynamisches symbolisches Ausführungs-Framework zur Analyse von EVM-Bytecode._ -- **[Mythril](https://consensys.net/diligence/scribble/)** – _EVM-Bytecode-Bewertungswerkzeug zum Aufspüren von Vertragsschwachstellen mithilfe von Feind-Analysen, Concolic-Analysen und Kontrollflussprüfungen._ +- **[Mythril](https://github.com/ConsenSys/mythril-classic)** – _EVM-Bytecode-Analysewerkzeug zum Aufspüren von Vertragsschwachstellen mithilfe von Taint-Analysen, concolischer Analyse und Kontrollflussprüfungen._ -- **[Diligence Scribble](https://consensys.net/diligence/scribble/)** – _Scribble ist eine Spezifizierungssprache und ein Laufzeit-Verifizierungswerkzeug, mithilfe dessen Sie Smart Contracts mit Eigenschaften kennzeichnen können, sodass sich Verträge automatisch mit Werkzeugen wie Diligence Fuzzing oder MythX testen lassen._ +- **[Diligence Scribble](https://consensys.net/diligence/scribble/)** – _Scribble ist eine Spezifikationssprache und ein Laufzeit-Verifizierungstool, mit dem Sie Smart Contracts mit Eigenschaften versehen können, die es Ihnen ermöglichen, die Verträge automatisch mit Tools wie Diligence Fuzzing oder MythX zu testen._ ## Verwandte Tutorials {#related-tutorials} - [Ein Überblick und Vergleich verschiedener Testprodukte](/developers/tutorials/guide-to-smart-contract-security-tools/) \_ -- [So verwenden Sie Echidna zum Testen von Smart Contracts](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) -- [So verwenden Sie Manticore zum Aufspüren von Bugs in Smart Contracts](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) -- [So verwenden Sie Slither, um Bugs in Smart Contracts zu finden](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) -- [So simulieren Sie Solidity-Verträge zu Testzwecken](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) -- [So führen Sie mit Foundry Unit-Tests in Solidity durch](https://www.rareskills.io/post/foundry-testing-solidity) - -## Weiterführende Informationen {#further-reading} - -- [Eine detaillierte Anleitung zum Testen von Ethereum-Smart-Contracts](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297) -- [So testen Sie Ethereum-Smart-Contracts](https://betterprogramming.pub/how-to-test-ethereum-smart-contracts-35abc8fa199d) -- [Die Unit-Test-Anleitung für Entwickler von MolochDAO](https://github.com/MolochVentures/moloch/tree/4e786db8a4aa3158287e0935dcbc7b1e43416e38/test#moloch-testing-guide) -- [So testen Sie Smart Contracts wie ein Rockstar](https://forum.openzeppelin.com/t/test-smart-contracts-like-a-rockstar/1001) +- [Wie man Echidna zum Testen von Smart Contracts verwendet](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) +- [Wie man Manticore verwendet, um Smart-Contract-Fehler zu finden](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) +- [Wie man Slither verwendet, um Smart-Contract-Fehler zu finden](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) +- [Wie man Solidity-Verträge für Tests mockt](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) +- [Wie man Unit-Tests in Solidity mit Foundry durchführt](https://www.rareskills.io/post/foundry-testing-solidity) + +## Weiterführende Lektüre {#further-reading} + +- [Ein ausführlicher Leitfaden zum Testen von Ethereum Smart Contracts](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297) +- [Wie man Ethereum Smart Contracts testet](https://betterprogramming.pub/how-to-test-ethereum-smart-contracts-35abc8fa199d) +- [MolochDAOs Leitfaden für Unit-Tests für Entwickler](https://github.com/MolochVentures/moloch/tree/4e786db8a4aa3158287e0935dcbc7b1e43416e38/test#moloch-testing-guide) +- [Wie man Smart Contracts wie ein Rockstar testet](https://forum.openzeppelin.com/t/test-smart-contracts-like-a-rockstar/1001) diff --git a/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md b/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md index c9f90c397bb..d2911dcc466 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md @@ -12,9 +12,9 @@ Die zunehmende Forschung zur Verbesserung von Smart Contracts hat jedoch zur Ein ## Voraussetzungen {#prerequisites} -Sie sollten ein gutes Verständnis für [Smart Contracts](/developers/docs/smart-contracts/), [die Smart-Contract-Anatomie](/developers/docs/smart-contracts/anatomy/) und die [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) haben. In diesem Leitfaden wird außerdem davon ausgegangen, dass die Leser über Kenntnisse in der Programmierung von Smart Contracts verfügen. +Sie sollten ein gutes Verständnis von [Smart Contracts](/developers/docs/smart-contracts/), der [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) und der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) haben. In diesem Leitfaden wird außerdem davon ausgegangen, dass die Leser über Kenntnisse in der Programmierung von Smart Contracts verfügen. -## Was ist ein Smart-Contract-Upgrade? {#what-is-a-smart-contract-upgrade} +## Was ist ein Smart-Contract-Upgrade? Was ist ein Smart-Contract-Upgrade? {#what-is-a-smart-contract-upgrade} Bei einem Smart-Contract-Upgrade wird die Geschäftslogik eines Smart Contracts geändert, wobei der Zustand des Vertrags erhalten bleibt. Es ist wichtig, klarzustellen, dass Aktualisierbarkeit und Veränderbarkeit nicht dasselbe sind, insbesondere im Zusammenhang mit Smart Contracts. @@ -42,7 +42,7 @@ Der letzte Schritt der Vertragsmigration besteht darin, die Benutzer davon zu ü Die Migration von Verträgen ist eine relativ einfache und sichere Maßnahme, um Smart Contracts zu aktualisieren, ohne die Interaktionen der Nutzer zu unterbrechen. Die manuelle Migration von Speicher und Guthaben der Benutzer auf den neuen Vertrag ist jedoch zeitaufwändig und kann hohe Gaskosten verursachen. -[Mehr über die Migration von Verträgen.](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) +[Mehr über Vertragsmigration.](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) ### Upgrade-Mechanismus #2: Datentrennung {#data-separation} @@ -66,17 +66,17 @@ Das Folgende geschieht bei einem Proxy-Muster: 1. Die Benutzer interagieren mit dem Proxy-Vertrag, der Daten speichert, aber nicht die Geschäftslogik enthält. -2. Der Proxy-Vertrag speichert die Adresse des Logikvertrags und delegiert alle Funktionsaufrufe an den Logikvertrag (der die Geschäftslogik enthält) unter Verwendung der Funktion `Delegatecall`. +2. Der Proxy-Vertrag speichert die Adresse des Logik-Vertrags und delegiert alle Funktionsaufrufe an den Logik-Vertrag (der die Geschäftslogik enthält), indem er die `delegatecall`-Funktion verwendet. 3. Nachdem der Aufruf an den Logikvertrag weitergeleitet wurde, werden die vom Logikvertrag weitergegebenen Daten abgerufen und an den Benutzer zurückgegeben. -Um Proxy-Muster zu verwenden, ist ein Verständnis der Funktion **Delegatecall** erforderlich. `Delegatecall` ist im Wesentlichen ein Operationscode, der es einem Vertrag ermöglicht, einen anderen Vertrag aufzurufen, wobei die eigentliche Codeausführung im Kontext des aufrufenden Vertrags erfolgt. Die Verwendung von `Delegatecall` in Proxy-Mustern impliziert, dass der Proxy-Vertrag in seinem Speicher liest, dort auch schreibt und die im Logikvertrag gespeicherte Logik ausführt, als ob er eine interne Funktion aufrufen würde. +Die Verwendung der Proxy-Muster erfordert ein Verständnis der **delegatecall**-Funktion. Im Grunde ist `delegatecall` ein Opcode, der es einem Vertrag ermöglicht, einen anderen Vertrag aufzurufen, während die eigentliche Codeausführung im Kontext des aufrufenden Vertrags stattfindet. Eine Folge der Verwendung von `delegatecall` in Proxy-Mustern ist, dass der Proxy-Vertrag seinen Speicher liest und beschreibt und die im Logik-Vertrag gespeicherte Logik so ausführt, als würde er eine interne Funktion aufrufen. Aus der [Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#delegatecall-callcode-and-libraries): -> _Es gibt eine spezielle Variante eines Nachrichtenaufrufs mit dem Namen **Delegatecall**. Sie ist mit einem Nachrichtenaufruf identisch, abgesehen davon, dass der Code an der Zieladresse im Kontext (d. h. an der Adresse) des aufrufenden Vertrags ausgeführt wird und `msg.sender` und `msg.value` ihre Werte nicht ändern._ _Das bedeutet, dass ein Vertrag während der Laufzeit Code von einer anderen Adresse dynamisch laden kann. Speicher, aktuelle Adresse und Guthaben beziehen sich weiterhin auf den aufrufenden Vertrag, nur der Code wird von der aufgerufenen Adresse übernommen._ +> _Es gibt eine spezielle Variante eines Nachrichtenaufrufs namens **delegatecall**, die mit einem Nachrichtenaufruf identisch ist, abgesehen davon, dass der Code an der Zieladresse im Kontext (d.h. an der Adresse) des aufrufenden Vertrags ausgeführt wird und `msg.sender` und `msg.value` ihre Werte nicht ändern._ _Dies bedeutet, dass ein Vertrag zur Laufzeit dynamisch Code von einer anderen Adresse laden kann._ Speicher, aktuelle Adresse und Guthaben beziehen sich weiterhin auf den aufrufenden Vertrag, nur der Code wird von der aufgerufenen Adresse übernommen._ -Der Proxy-Vertrag weiß, dass `Delegatecall` aufgerufen werden muss, wenn ein Benutzer eine Funktion aufruft, weil er über eine eingebaute `Fallback`-Funktion verfügt. Bei der Solidity-Programmierung wird die [Fallback-Funktion](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function) ausgeführt, wenn ein Funktionsaufruf nicht mit den in einem Vertrag angegebenen Funktionen übereinstimmt. +Der Proxy-Vertrag weiß, dass er `delegatecall` aufrufen muss, wenn ein Benutzer eine Funktion aufruft, da er über eine eingebaute `fallback`-Funktion verfügt. In der Solidity-Programmierung wird die [Fallback-Funktion](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function) ausgeführt, wenn ein Funktionsaufruf nicht mit den in einem Vertrag angegebenen Funktionen übereinstimmt. Damit das Proxy-Muster funktioniert, muss eine benutzerdefinierte Fallback-Funktion verfasst werden, in der beschrieben wird, wie der Proxy-Vertrag mit Funktionsaufrufen umgehen soll, die er nicht unterstützt. In diesem Fall ist die Fallback-Funktion des Proxys so programmiert, dass sie einen Delegatecall initiiert und die Anfrage des Benutzers an die aktuelle Implementierung des Logikvertrags weiterleitet. @@ -84,17 +84,17 @@ Der Proxy-Vertrag ist standardmäßig unveränderlich, aber Logikverträge mit a Nachdem der Proxy-Vertrag auf einen neuen Logikvertrag verwiesen wurde, ändert sich der Code, der ausgeführt wird, wenn Benutzer die Funktion des Proxy-Vertrags aufrufen. Auf diese Weise können wir die Logik eines Vertrags aktualisieren, ohne die Benutzer aufzufordern, mit einem neuen Vertrag zu interagieren. -Proxy-Muster sind eine beliebte Methode für das Aktualisieren von Smart Contracts, da sie die mit der Vertragsmigration verbundenen Schwierigkeiten beseitigen. Die Verwendung von Proxy-Mustern ist jedoch komplizierter und kann bei unsachgemäßer Verwendung zu kritischen Fehlern führen, wie z. B. [Kollisionen von Funktions-Selektoren](https://medium.com/nomic-foundation-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357). +Proxy-Muster sind eine beliebte Methode für das Aktualisieren von Smart Contracts, da sie die mit der Vertragsmigration verbundenen Schwierigkeiten beseitigen. Proxy-Muster sind jedoch komplizierter in der Anwendung und können bei unsachgemäßer Verwendung kritische Fehler wie [Konflikte bei Funktionsselektoren](https://medium.com/nomic-foundation-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357) verursachen. [Mehr über Proxy-Muster](https://blog.openzeppelin.com/proxy-patterns/). ### Upgrade-Mechanismus #4: Strategiemuster {#strategy-pattern} -Diese Technik wird beeinflusst durch [Strategiemuster](https://en.wikipedia.org/wiki/Strategy_pattern). Sie fördern die Erstellung von Softwareprogrammen, die über Schnittstellen zur Implementierung bestimmter Funktionen mit anderen Programmen verbunden sind. Die Anwendung von Strategiemustern auf die Ethereum-Entwicklung würde bedeuten, dass ein Smart Contract erstellt wird, der Funktionen aus anderen Verträgen abruft. +Diese Technik ist vom [Strategiemuster](https://en.wikipedia.org/wiki/Strategy_pattern) beeinflusst. Es fördert die Erstellung von Softwareprogrammen, die sich mit anderen Programmen verbinden, um bestimmte Funktionen zu implementieren. Die Anwendung von Strategiemustern auf die Ethereum-Entwicklung würde bedeuten, dass ein Smart Contract erstellt wird, der Funktionen aus anderen Verträgen abruft. Der Hauptvertrag enthält in diesem Fall die zentrale Geschäftslogik, verfügt aber über Schnittstellen zu anderen Smart Contracts („Satellitenverträgen“), um bestimmte Funktionen auszuführen. Dieser Hauptvertrag speichert ebenfalls die Adresse für jeden Satellitenvertrag und kann zwischen verschiedenen Implementierungen des Satellitenvertrags wechseln. -Sie können einen neuen Satellitenvertrag erstellen und den Hauptvertrag mit der neuen Adresse konfigurieren. Dadurch können Sie _Strategien_ für Smart Contracts ändern (z. B. eine neue Logik implementieren). +Sie können einen neuen Satellitenvertrag erstellen und den Hauptvertrag mit der neuen Adresse konfigurieren. Dies ermöglicht es Ihnen, _Strategien_ (d. h. eine neue Logik implementieren) für einen Smart Contract zu ändern. Obwohl das Strategiemuster dem zuvor besprochenen Proxy-Muster ähnelt, unterscheidet es sich von diesem, weil der Hauptvertrag, mit dem die Benutzer interagieren, die Geschäftslogik enthält. Die Verwendung dieses Musters bietet Ihnen die Möglichkeit, begrenzte Änderungen an einem Smart Contract vorzunehmen, ohne die Kerninfrastruktur zu beeinträchtigen. @@ -104,9 +104,9 @@ Der größte Nachteil ist, dass sich dieses Muster hauptsächlich für die Einf Das Diamond-Muster kann als eine Verbesserung des Proxy-Musters angesehen werden. Diamond-Muster unterscheiden sich von Proxy-Mustern, da der Diamond-Proxy-Vertrag Funktionsaufrufe an mehr als einen Logikvertrag delegieren kann. -Die Logikverträge im Diamond-Muster sind bekannt als _Facets_. Damit das Diamond-Muster funktioniert, müssen Sie im Proxy-Vertrag eine Zuordnung erstellen, die [Funktionsselektoren](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector) verschiedenen Facet-Adressen zuordnet. +Die Logik-Verträge im Diamond-Muster werden als _Facets_ bezeichnet. Damit das Diamond-Muster funktioniert, müssen Sie im Proxy-Vertrag ein Mapping erstellen, das [Funktionsselektoren](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector) verschiedenen Facet-Adressen zuordnet. -Wenn ein Benutzer eine Funktion aufruft, prüft der Proxy-Vertrag die Zuordnung, um die Facet zu finden, die für die Ausführung dieser Funktion zuständig ist. Dann ruft sie `delegatecall` auf (mithilfe der Fallback-Funktion) und leitet den Aufruf an den entsprechenden Logikvertrag weiter. +Wenn ein Benutzer eine Funktion aufruft, prüft der Proxy-Vertrag die Zuordnung, um die Facet zu finden, die für die Ausführung dieser Funktion zuständig ist. Dann ruft es `delegatecall` (mithilfe der Fallback-Funktion) auf und leitet den Aufruf an den entsprechenden Logik-Vertrag weiter. Das Diamond-Upgrade-Muster hat einige Vorteile gegenüber konventionellen Proxy-Upgrade-Mustern: @@ -114,52 +114,52 @@ Das Diamond-Upgrade-Muster hat einige Vorteile gegenüber konventionellen Proxy- 2. Alle Smart Contracts (einschließlich Logikverträge, die im Proxy-Muster verwendet werden) unterliegen einer Größenbeschränkung von 24 KB, was vor allem bei komplexen Verträgen, für die mehr Funktionen erforderlich sind, eine Einschränkung darstellen kann. Mit dem Diamond-Muster lässt sich dieses Problem leicht lösen, indem Funktionen auf mehrere Logikverträge aufgeteilt werden. -3. Proxy-Muster verfolgen bei der Zugangskontrolle einen allumfassenden Ansatz. Eine Entität mit Zugriff auf Upgrade-Funktionen kann den _gesamten_ Vertrag verändern. Das Diamond-Muster ermöglicht jedoch einen modularen Berechtigungsansatz, bei dem Sie Entitäten darauf beschränken können, bestimmte Funktionen innerhalb eines Smart Contracts zu aktualisieren. +3. Proxy-Muster verfolgen bei der Zugangskontrolle einen allumfassenden Ansatz. Eine Entität mit Zugriff auf Upgrade-Funktionen kann den _gesamten_ Vertrag ändern. Das Diamond-Muster ermöglicht jedoch einen modularen Berechtigungsansatz, bei dem Sie Entitäten darauf beschränken können, bestimmte Funktionen innerhalb eines Smart Contracts zu aktualisieren. -[Mehr zum Thema Diamond-Muster](https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard?s=w). +[Mehr über das Diamond-Muster](https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard?s=w). ## Vor- und Nachteile der Aktualisierung von Smart Contracts {#pros-and-cons-of-upgrading-smart-contracts} -| Vorteile | Nachteile | -| -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Pro | Nachteile | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Ein Smart-Contract-Upgrade kann die Behebung von Schwachstellen erleichtern, die in der Phase nach der Veröffentlichung entdeckt werden. | Das Aktualisieren von Smart Contracts negiert die Idee der Unveränderlichkeit des Codes, was Auswirkungen auf die Dezentralisierung und Sicherheit hat. | | Entwickler können mit Logik-Upgrades neue Funktionen zu dezentralen Anwendungen hinzufügen. | Die Benutzer müssen darauf vertrauen, dass die Entwickler Smart Contracts nicht willkürlich verändern. | | Upgrades für Smart Contracts können die Sicherheit für die Endbenutzer erhöhen, da sich Bugs damit schnell beheben lassen. | Die Programmierung von Upgrade-Funktionalitäten in Smart Contracts fügt eine weitere Komplexitätsebene hinzu und erhöht die Möglichkeit kritischer Fehler. | | Vertrags-Upgrades geben Entwicklern mehr Raum, um mit verschiedenen Funktionen zu experimentieren und DApps im Laufe der Zeit zu verbessern. | Die Möglichkeit, Smart Contracts zu aktualisieren, könnte Entwickler dazu verleiten, Projekte schneller zu starten, ohne in der Entwicklungsphase eine Due-Diligence-Prüfung durchzuführen. | -| | Eine unsichere Zugriffskontrolle oder Zentralisierung in Smart Contracts kann es böswilligen Akteuren erleichtern, nicht autorisierte Upgrades durchzuführen. | +| | Eine unsichere Zugriffskontrolle oder Zentralisierung in Smart Contracts kann es böswilligen Akteuren erleichtern, nicht autorisierte Upgrades durchzuführen. | -## Überlegungen zu Upgrades von Smart Contracts {#considerations-for-upgrading-smart-contracts} +## Überlegungen zur Aktualisierung von Smart Contracts {#considerations-for-upgrading-smart-contracts} 1. Benutzen Sie sichere Zugriffskontroll-/Autorisierungsmechanismen, um unbefugte Smart-Contract-Upgrades zu verhindern, insbesondere bei Verwendung von Proxy-Mustern, Strategiemustern oder Datentrennung. Ein Beispiel ist die Einschränkung des Zugriffs auf die Upgrade-Funktion, sodass nur der Eigentümer des Vertrags sie aufrufen kann. 2. Die Aktualisierung von Smart Contracts ist ein komplexer Vorgang und erfordert ein hohes Maß an Sorgfalt, um die Einführung von Schwachstellen zu verhindern. -3. Verringern Sie Vertrauensannahmen, indem Sie den Prozess der Implementierung von Upgrades dezentralisieren. Mögliche Strategien sind die Verwendung eines [Multi-Sig-Wallet-Vertrags](/developers/docs/smart-contracts/#multisig), um Upgrades zu kontrollieren, oder die Verpflichtung von [Mitgliedern eines DAOs](/dao/) dazu, über die Genehmigung des Upgrades abzustimmen. +3. Verringern Sie Vertrauensannahmen, indem Sie den Prozess der Implementierung von Upgrades dezentralisieren. Mögliche Strategien sind die Verwendung eines [Multi-Sig-Wallet-Vertrags](/developers/docs/smart-contracts/#multisig) zur Steuerung von Upgrades oder die Aufforderung an [Mitglieder einer DAO](/dao/), über die Genehmigung des Upgrades abzustimmen. 4. Seien Sie sich der Kosten bewusst, die mit der Aktualisierung von Verträgen verbunden sind. So kann beispielsweise das Kopieren von Zuständen (z. B. Benutzerguthaben) von einem alten auf einen neuen Vertrag während der Vertragsmigration mehr als eine Transaktion erfordern, was zu höheren Gasgebühren führt. -5. Erwägen Sie die Implementierung von **Timelocks**, um die Benutzer zu schützen. Ein Timelock bezieht sich auf eine Verzögerung, die bei Änderungen an einem System erzwungen wird. Timelocks können mit einem Multi-Sig-Verwaltungssystem kombiniert werden, um die Upgrades zu kontrollieren: Erreicht eine vorgeschlagene Aktion den erforderlichen Schwellenwert für die Genehmigung, wird sie erst nach Ablauf der vordefinierten Verzögerungszeit ausgeführt. +5. Erwägen Sie die Implementierung von **Timelocks**, um Benutzer zu schützen. Ein Timelock bezieht sich auf eine Verzögerung, die bei Änderungen an einem System erzwungen wird. Timelocks können mit einem Multi-Sig-Verwaltungssystem kombiniert werden, um die Upgrades zu kontrollieren: Erreicht eine vorgeschlagene Aktion den erforderlichen Schwellenwert für die Genehmigung, wird sie erst nach Ablauf der vordefinierten Verzögerungszeit ausgeführt. Timelocks geben den Benutzern eine gewisse Zeitspanne, um das System zu verlassen, wenn sie mit einer vorgeschlagenen Änderung nicht einverstanden sind (z. B. mit einem Logik-Upgrade oder neuen Gebührenregelungen). Ohne Timelocks müssen die Benutzer darauf vertrauen, dass die Entwickler keine willkürlichen Änderungen an einem Smart Contract ohne vorherige Ankündigung vornehmen. Der Nachteil dabei ist, dass die Möglichkeit, Schwachstellen schnell zu beheben, durch die Timelocks eingeschränkt wird. ## Ressourcen {#resources} -**OpenZeppelin Upgrades Plugins – _Eine Suite von Werkzeugen für die Veröffentlichung und die Sicherung von aktualisierbaren Smart Contracts._** +**OpenZeppelin Upgrades Plugins - _Eine Suite von Tools für die Bereitstellung und Absicherung von aktualisierbaren Smart Contracts._** - [GitHub](https://github.com/OpenZeppelin/openzeppelin-upgrades) - [Dokumentation](https://docs.openzeppelin.com/upgrades) ## Tutorials {#tutorials} -- [Aktualisierung Ihrer Smart Contracts | YouTube-Tutorial](https://www.youtube.com/watch?v=bdXJmWajZRY) von Patrick Collins (auf Englisch) -- [Migrationstutorial für Smart Contracts auf Ethereum](https://medium.com/coinmonks/ethereum-smart-contract-migration-13f6f12539bd) von Austin Griffith (auf Englisch) -- [Aktualisierung von Smart Contracts mithilfe des UUPS-Proxy-Musters](https://blog.logrocket.com/author/praneshas/) von Pranesh A.S (auf Englisch) -- [Web3-Tutorial: Schreiben Sie aktualisierbare Smart Contracts (Proxy) mithilfe von OpenZeppelin](https://dev.to/yakult/tutorial-write-upgradeable-smart-contract-proxy-contract-with-openzeppelin-1916) von fangjun.eth (auf Englisch) +- [Upgrading your Smart Contracts | YouTube-Tutorial](https://www.youtube.com/watch?v=bdXJmWajZRY) von Patrick Collins +- [Ethereum Smart Contract Migration Tutorial](https://medium.com/coinmonks/ethereum-smart-contract-migration-13f6f12539bd) von Austin Griffith +- [Using the UUPS proxy pattern to upgrade smart contracts](https://blog.logrocket.com/author/praneshas/) von Pranesh A.S +- [Web3 Tutorial: Write upgradeable smart contract (proxy) using OpenZeppelin](https://dev.to/yakult/tutorial-write-upgradeable-smart-contract-proxy-contract-with-openzeppelin-1916) von fangjun.eth -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Der aktuelle Stand bei Smart-Contract-Upgrades](https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades/) von Santiago Palladino (auf Englisch) -- [Verschiedene Möglichkeiten zur Aktualisierung eines Solidity-Smart-Contracts](https://cryptomarketpool.com/multiple-ways-to-upgrade-a-solidity-smart-contract/) – Crypto Market Pool Blog (auf Englisch) -- [Schulung: Aktualisierung von Smart Contracts](https://docs.openzeppelin.com/learn/upgrading-smart-contracts) – OpenZeppelin Docs (auf Englisch) -- [Proxy-Muster für die Aktualisierbarkeit von Solidity-Verträgen: Transparente vs. UUPS-Proxies](https://mirror.xyz/0xB38709B8198d147cc9Ff9C133838a044d78B064B/M7oTptQkBGXxox-tk9VJjL66E1V8BUF0GF79MMK4YG0) von Naveen Sahu (auf Englisch) -- [Wie Diamond-Upgrades funktionieren](https://dev.to/mudgen/how-diamond-upgrades-work-417j) von Nick Mudge (auf Englisch) +- [The State of Smart Contract Upgrades](https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades/) von Santiago Palladino +- [Multiple ways to upgrade a Solidity smart contract](https://cryptomarketpool.com/multiple-ways-to-upgrade-a-solidity-smart-contract/) – Crypto Market Pool Blog +- [Learn: Upgrading Smart Contracts](https://docs.openzeppelin.com/learn/upgrading-smart-contracts) – OpenZeppelin Docs +- [Proxy Patterns For Upgradeability Of Solidity Contracts: Transparent vs UUPS Proxies](https://mirror.xyz/0xB38709B8198d147cc9Ff9C133838a044d78B064B/M7oTptQkBGXxox-tk9VJjL66E1V8BUF0GF79MMK4YG0) von Naveen Sahu +- [How Diamond Upgrades Work](https://dev.to/mudgen/how-diamond-upgrades-work-417j) von Nick Mudge diff --git a/public/content/translations/de/developers/docs/smart-contracts/verifying/index.md b/public/content/translations/de/developers/docs/smart-contracts/verifying/index.md index 4297dada391..7ea6dd371a3 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/verifying/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/verifying/index.md @@ -4,33 +4,33 @@ description: Eine Übersicht über die Quellcodeverifizierung für Ethereum-Smar lang: de --- -[Smart Contracts](/developers/docs/smart-contracts/) werden so entworfen, dass sie „vertrauenslos“ sind. Das bedeutet, die Benutzer sollten keinen dritten Parteien (z. B. Entwicklern oder Unternehmen) vertrauen müssen, bevor sie mit dem Vertrag interagieren. Die Voraussetzung für Vertrauenslosigkeit ist, dass die Benutzer und andere Entwickler in der Lage sein müssen, den Quellcode eines Smart Contracts zu verifizieren. Nach der Quellcodeverifizierung können Benutzer und Entwicklern sicher sein, dass der veröffentlichte Vertragscode derselbe Code ist, der unter dieser Vertragsaddresse auf der Ethereum-Blockchain läuft. +[Smart Contracts](/developers/docs/smart-contracts/) sind so konzipiert, dass sie „vertrauenslos“ sind. Das bedeutet, Benutzer müssen Dritten (z. B. Entwicklern und Unternehmen) nicht vertrauen, bevor sie mit einem Vertrag interagieren. Die Voraussetzung für Vertrauenslosigkeit ist, dass die Benutzer und andere Entwickler in der Lage sein müssen, den Quellcode eines Smart Contracts zu verifizieren. Nach der Quellcodeverifizierung können Benutzer und Entwicklern sicher sein, dass der veröffentlichte Vertragscode derselbe Code ist, der unter dieser Vertragsaddresse auf der Ethereum-Blockchain läuft. -Entscheidend ist dabei der Unterschied zwischen „Quellcodeverifizierung“ und „[formaler Verifizierung](/developers/docs/smart-contracts/formal-verification/)“. Die Quellcodeverifizierung, die unten detailliert erklärt wird, bezieht sich auf die Verifizierung, dass ein beliebiger Quellcode eines Smart Contracts in einer High-Level-Sprache (etwa Solidity) zu demselben Bytecode kompiliert, der unter der Vertragsadresse ausgeführt wird. Die formale Verifizierung bezieht sich hingegen darauf, die Korrektheit eines Smart Contracts zu verifizieren und sagen zu können, dass der Contract sich wie erwartet verhält. Obwohl die Vertragsverifizierung kontextbezogen ist, bezieht sie sich meistens auf die Quellcodeverifizierung. +Es ist wichtig, zwischen „Quellcode-Verifizierung“ und „[formaler Verifizierung](/developers/docs/smart-contracts/formal-verification/)“ zu unterscheiden. Quellcode-Verifizierung, die im Folgenden näher erläutert wird, bedeutet die Überprüfung, ob der angegebene Quellcode eines Smart Contracts in einer Hochsprache (z. B. Solidity) zu demselben Bytecode kompiliert wird, der an der Vertragsadresse ausgeführt werden soll. Die formale Verifizierung bezieht sich hingegen darauf, die Korrektheit eines Smart Contracts zu verifizieren und sagen zu können, dass der Contract sich wie erwartet verhält. Obwohl die Vertragsverifizierung kontextbezogen ist, bezieht sie sich meistens auf die Quellcodeverifizierung. ## Was ist Quellcodeverifizierung? {#what-is-source-code-verification} -Bevor ein Smart Contract auf der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) veröffentlicht wird, [kompilieren](/developers/docs/smart-contracts/compiling/) die Entwickler den Quellcode des Vertrags – also Anweisungen, die in [Solidity](/developers/docs/smart-contracts/languages/) oder einer anderen High-Level-Sprache geschrieben wurden – nach Bytecode. Die Kompilierung von Quellcode in Bytecode (z. B. Low-Level, Maschinenanweisungen) ist notwendig, um die Vertragslogik in der EVM auszuführen, da die EVM keine High-Level-Anweisungen interpretieren kann. +Bevor ein Smart Contract in der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) bereitgestellt wird, [kompilieren](/developers/docs/smart-contracts/compiling/) Entwickler den Quellcode des Vertrags – Anweisungen, die [in Solidity geschrieben](/developers/docs/smart-contracts/languages/) oder in einer anderen High-Level-Programmiersprache verfasst sind – zu Bytecode. Die Kompilierung von Quellcode in Bytecode (z. B. Low-Level, Maschinenanweisungen) ist notwendig, um die Vertragslogik in der EVM auszuführen, da die EVM keine High-Level-Anweisungen interpretieren kann. Die Quellcodeverifizierung besteht nun darin, den Quellcode eines Smart Contracts mit dem während der Vertragserstellung genutzten, kompilierten Bytecode zu vergleichen, um Unterschiede festzustellen. Die Verifizierung von Smart Contracts ist wichtig, da sich der angegebene Vertragscode von dem Code, der auf der Blockchain läuft, unterscheiden könnte. Die Verifizierung von Smart Contracts macht es möglich, mithilfe der High-Level-Sprache, in der ein Vertrag verfasst wurde, zu untersuchen, was dieser wirklich tut, ohne den dazugehörigen Maschinencode lesen zu müssen. Funktionen, Werte und in der Regel die Variablennamen und Kommentare bleiben beim kompilierten und veröffentlichten originalen Quellcode identisch. Dies erleichtert es deutlich, den Code zu lesen. Die Quellcodeverifizierung leitet außerdem die Codedokumentation in die Wege, mit der die Endbenutzer prüfen können, was der Zweck eines bestimmten Smart Contracts ist. -### Was ist eine vollständige Verifizierung? {#full-verification} +### Was ist eine vollständige Verifizierung? Vollständige Verifizierung {#full-verification} Einige Teil des Quellcodes, wie Kommentare oder Variablennamen, haben keinen Einfluss auf den kompilierten Bytecode. Daraus folgt, dass zwei Quellcodes mit unterschiedlichen Variablennamen und unterschiedlichen Kommentaren dennoch in der Lage wären, denselben Vertrag zu verifizieren. Auf diese Weise könnten Personen mit bösartigen Absichten täuschende Kommentare schreiben oder irreführende Variablennamen im Quellcode angeben und dafür sorgen, dass der Vertrag mit einem anderen Quellcode als im Originalvertrag verifiziert wird. -Es ist möglich, dies durch an den Bytecode angehängte zusätzliche Daten zu vermeiden, die als _kryptografische Garantie_ für die Exaktheit des Quellcodes und als _Fingerabdruck_ der zu kompilierenden Informationen dienen. Die dazu notwendigen Informationen finden Sie in den [Vertragsmetadaten von Solidity](https://docs.soliditylang.org/en/v0.8.15/metadata.html) und der Hash dieser Datei wird an den Bytecode eines Vertrags angehängt. Live können Sie dies im [Metadata Playground](https://playground.sourcify.dev) nachverfolgen. +Dies lässt sich vermeiden, indem man zusätzliche Daten an den Bytecode anhängt, die als _kryptografische Garantie_ für die Genauigkeit des Quellcodes und als _Fingerabdruck_ der Kompilierungsinformationen dienen. Die notwendigen Informationen finden sich in den [Vertragsmetadaten von Solidity](https://docs.soliditylang.org/en/v0.8.15/metadata.html), und der Hash dieser Datei wird an den Bytecode eines Vertrags angehängt. Sie können es in der [Metadaten-Playground](https://playground.sourcify.dev) in Aktion sehen. Die Metadatendatei enthält Informationen über die Kompilierung des Vertrags, einschließlich der Quelldateien und ihrer Hashes. Das bedeutet, dass sich die Metadatendatei ändert, wenn sich eine der Kompilierungseinstellungen oder auch nur ein einzelnes Byte in einer der Quelldateien ändert. Folglich ändert sich auch der Hash der Metadatendatei, der an den Bytecode angehängt ist. Das bedeutet: Wenn der Bytecode eines Vertrags plus der angehängte Metadaten-Hash mit dem angegebenen Quellcode und den Kompilierungseinstellungen übereinstimmt, können wir sicher sein, dass es sich um genau denselben Quellcode handelt, der schon bei der ursprünglichen Kompilierung verwendet wurde – kein einziges Byte unterscheidet sich. -Diese Art der Verifizierung, die den Metadaten-Hash nutzt, wird als **„[vollständige Verifizierung](https://docs.sourcify.dev/docs/full-vs-partial-match/)“** (auch „perfekte Verifizierung“) bezeichnet. Wenn die Metadaten-Hashes nicht übereinstimmen oder bei der Verifizierung nicht berücksichtigt werden, würde es sich um eine „partielle Übereinstimmung“ handeln, was die derzeit gebräuchlichere Methode zur Verifizierung von Verträgen ist. Es ist möglich, [bösartigen Code einzuschleusen](https://samczsun.com/hiding-in-plain-sight/), der in dem verifizierten Quellcode ohne vollständige Verifizierung nicht sichtbar wäre. Die meisten Entwickler sind sich nicht bewusst, dass die vollständige Verifizierung existiert und bewahren die Metadatendatei ihrer Kompilierung nicht auf. Aus diesem Grund ist bisher die partielle Verifizierung die gängige Methode zur Vertragsverifizierung. +Diese Art der Verifizierung, die den Metadaten-Hash nutzt, wird als **„[vollständige Verifizierung](https://docs.sourcify.dev/docs/full-vs-partial-match/)“** (auch „perfekte Verifizierung“) bezeichnet. Wenn die Metadaten-Hashes nicht übereinstimmen oder bei der Verifizierung nicht berücksichtigt werden, würde es sich um eine „partielle Übereinstimmung“ handeln, was die derzeit gebräuchlichere Methode zur Verifizierung von Verträgen ist. Es ist möglich, [bösartigen Code einzuschleusen](https://samczsun.com/hiding-in-plain-sight/), der ohne eine vollständige Verifizierung nicht im verifizierten Quellcode widergespiegelt würde. Die meisten Entwickler sind sich nicht bewusst, dass die vollständige Verifizierung existiert und bewahren die Metadatendatei ihrer Kompilierung nicht auf. Aus diesem Grund ist bisher die partielle Verifizierung die gängige Methode zur Vertragsverifizierung. -## Warum ist die Quellcodeverifizierung wichtig? {#importance-of-source-code-verification} +## Warum ist die Quellcodeverifizierung wichtig? Wichtigkeit der Quellcode-Verifizierung {#importance-of-source-code-verification} ### Vertrauenslosigkeit {#trustlessness} -Die Vertrauenslosigkeit ist zweifellos eine der wichtigsten Voraussetzungen für Smart Contracts und [dezentrale Anwendungen (DApps)](/developers/docs/dapps/). Smart Contracts sind „unveränderlich“ und können nicht modifiziert werden; ein Vertrag führt nur die Geschäftslogik aus, die zum Zeitpunkt der Veröffentlichung im Code festgelegt wurde. Das bedeutet, dass Entwickler und Unternehmen den Code eines Vertrags nach dessen Veröffentlichung auf Ethereum nicht manipulieren können. +Vertrauenslosigkeit ist wohl die wichtigste Voraussetzung für Smart Contracts und [dezentralisierte Anwendungen (Dapps)](/developers/docs/dapps/). Smart Contracts sind „unveränderlich“ und können nicht modifiziert werden; ein Vertrag führt nur die Geschäftslogik aus, die zum Zeitpunkt der Veröffentlichung im Code festgelegt wurde. Das bedeutet, dass Entwickler und Unternehmen den Code eines Vertrags nach dessen Veröffentlichung auf Ethereum nicht manipulieren können. Damit ein Smart Contract vertrauenslos ist, sollte der Vertragscode für eine unabhängige Verifizierung verfügbar sein. Der kompilierte Bytecode ist zwar für jeden Smart Contract öffentlich auf der Blockchain verfügbar, die Low-Level-Sprache ist allerdings schwer verständlich – sowohl für Entwickler als auch für Benutzer. @@ -40,15 +40,15 @@ Quellcode-Verifizierungswerkzeuge bieten Garantien dafür, dass die Quellcodedat ### Benutzersicherheit {#user-safety} -Bei Smart Contracts steht oft eine Menge Geld auf dem Spiel. Das macht höhere Sicherheitsgarantien und eine Verifizierung der Logik eines Smart Contracts, bevor er verwendet wird, erforderlich. Das Problem ist, dass skrupellose Entwickler Benutzer täuschen können, indem sie bösartigen Code in einen Smart Contract einfügen. Ohne Verifizierung können bösartige Smart Contracts [Hintertüren](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts), umstrittene Zugriffskontrollmechanismen, ausnutzbare Schwachstellen und andere Sicherheitsrisiken enthalten, die unentdeckt bleiben würden. +Bei Smart Contracts steht oft eine Menge Geld auf dem Spiel. Das macht höhere Sicherheitsgarantien und eine Verifizierung der Logik eines Smart Contracts, bevor er verwendet wird, erforderlich. Das Problem ist, dass skrupellose Entwickler Benutzer täuschen können, indem sie bösartigen Code in einen Smart Contract einfügen. Ohne Verifizierung können bösartige Smart Contracts [Hintertüren](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts), umstrittene Zugriffskontrollmechanismen, ausnutzbare Schwachstellen und andere Dinge enthalten, die die Benutzersicherheit gefährden und unentdeckt bleiben würden. Die Veröffentlichung der Quellcodedateien eines Smart Contracts erleichtert es Interessierten, wie zum Beispiel Auditoren, den Vertrag hinsichtlich potenzieller Angriffsvektoren zu bewerten. Wenn mehrere Parteien unabhängig voneinander einen Smart Contract verifizieren, bietet dies Benutzern stärkere Sicherheitsgarantien. -## So funktioniert die Quellcodeverifizierung für Ethereum-Smart-Contracts {#source-code-verification-for-ethereum-smart-contracts} +## Wie man den Quellcode für Ethereum-Smart-Contracts verifiziert {#source-code-verification-for-ethereum-smart-contracts} -Damit [ein Smart Contract auf Ethereum veröffentlicht](/developers/docs/smart-contracts/deploying/) werden kann, ist es erforderlich, eine Transaktion mit einem Datenpayload (kompilierten Bytecode) an eine spezielle Adresse zu senden. Der Datenpayload wird durch das Kompilieren des Quellcodes erstellt, wobei die [Konstruktorargumente](https://docs.soliditylang.org/en/v0.8.14/contracts.html#constructor) des Vertragsfalls an den Datenpayload in der Transaktion angehängt werden. Die Kompilierung ist deterministisch, was bedeutet, dass immer dasselbe Ergebnis (z. B. Vertrags-Bytecode) herauskommt, wenn dieselben Quelldateien und Kompilierungseinstellungen (z. B. Compiler-Version, Optimizer) verwendet werden. +Das [Bereitstellen eines Smart Contracts auf Ethereum](/developers/docs/smart-contracts/deploying/) erfordert das Senden einer Transaktion mit einer Datennutzlast (kompilierter Bytecode) an eine spezielle Adresse. Die Datennutzlast wird durch das Kompilieren des Quellcodes generiert, zuzüglich der [Konstruktor-Argumente](https://docs.soliditylang.org/en/v0.8.14/contracts.html#constructor) der Vertragsinstanz, die an die Datennutzlast in der Transaktion angehängt werden. Die Kompilierung ist deterministisch, d. h. sie erzeugt immer die gleiche Ausgabe (d. h. den Bytecode des Vertrags), wenn die gleichen Quelldateien und Kompilierungseinstellungen (z. B. Compiler-Version, Optimizer) verwendet werden. -![Ein Diagramm, das die Verifizierung des Quellcodes von Smart Contracts zeigt](./source-code-verification.png) +![Ein Diagramm, das die Quellcode-Verifizierung von Smart Contracts zeigt](./source-code-verification.png) Die Verifizierung eines Smart Contracts umfasst im Wesentlichen die folgenden Schritte: @@ -62,46 +62,52 @@ Die Verifizierung eines Smart Contracts umfasst im Wesentlichen die folgenden Sc 5. Wenn außerdem die Metadaten-Hashes am Ende des Bytecodes übereinstimmen, liegt eine vollständige Übereinstimmung vor. -Beachten Sie, dass dies eine vereinfachte Beschreibung der Verifizierung ist und es viele Ausnahmen gibt, bei denen dies nicht funktionieren würde, wie zum Beispiel bei [unveränderlichen Variablen](https://docs.sourcify.dev/docs/immutables/). +Beachten Sie, dass dies eine vereinfachte Beschreibung der Verifizierung ist und es viele Ausnahmen gibt, die damit nicht funktionieren würden, wie z. B. [unveränderliche Variablen](https://docs.sourcify.dev/docs/immutables/). -## Werkzeuge zur Quellcodeverifizierung {#source-code-verification-tools} +## Tools zur Quellcode-Verifizierung {#source-code-verification-tools} Der traditionelle Prozess zur Verifizierung von Verträgen kann komplex sein. Deshalb gibt es Werkzeuge zur Verifizierung des Quellcodes für auf Ethereum veröffentlichte Smart Contracts. Diese Werkzeuge automatisieren große Teile der Quellcodeverifizierung und kuratieren außerdem verifizierte Verträge zum Nutzen der Benutzer. ### Etherscan {#etherscan} -Obwohl Etherscan hauptsächlich als [Ethereum-Blockchain-Explorer](/developers/docs/data-and-analytics/block-explorers/) bekannt ist, bietet es auch einen [Dienst zur Quellcodeverifizierung](https://etherscan.io/verifyContract) für Entwickler und Benutzer von Smart Contracts an. +Obwohl Etherscan hauptsächlich als [Ethereum-Blockchain-Explorer](/developers/docs/data-and-analytics/block-explorers/) bekannt ist, bietet es auch einen [Dienst zur Quellcode-Verifizierung](https://etherscan.io/verifyContract) für Entwickler und Benutzer von Smart Contracts an. -Etherscan macht es möglich, den Vertrags-Bytecode aus dem ursprünglichen Daten-Payload (Quellcode, Bibliotheksadresse, Kompilierungseinstellungen, Vertragsadresse usw.) neu zu kompilieren Wenn der neu kompilierte Bytecode mit dem Bytecode (und den Konstruktorparametern) des On-Chain-Vertrags in Verbindung gebracht wird, [ist der Vertrag verifiziert](https://info.etherscan.com/types-of-contract-verification/). +Etherscan macht es möglich, den Vertrags-Bytecode aus dem ursprünglichen Daten-Payload (Quellcode, Bibliotheksadresse, Kompilierungseinstellungen, Vertragsadresse usw.) neu zu kompilieren Wenn der neu kompilierte Bytecode mit dem Bytecode (und den Konstruktor-Parametern) des On-Chain-Vertrags verknüpft ist, dann ist [der Vertrag verifiziert](https://info.etherscan.com/types-of-contract-verification/). -Sobald der Vertrag verifiziert ist, erhält der Quellcode des Vertrags ein „Verified“-Label und wird auf Etherscan veröffentlicht, damit andere ihn prüfen können. Er wird auch in den Abschnitt [Verifizierte Verträge](https://etherscan.io/contractsVerified/) aufgenommen – einem Repository von Smart Contracts mit verifiziertem Quellcode. +Sobald der Vertrag verifiziert ist, erhält der Quellcode des Vertrags ein „Verified“-Label und wird auf Etherscan veröffentlicht, damit andere ihn prüfen können. Es wird auch dem Abschnitt [Verifizierte Verträge](https://etherscan.io/contractsVerified/) hinzugefügt – einem Repository von Smart Contracts mit verifizierten Quellcodes. -Etherscan ist das am häufigsten verwendete Werkzeug zur Verifizierung von Verträgen. Allerdings hat die Vertragsverifizierung von Etherscan einen Nachteil: Sie vergleicht den **Metadaten-Hash** des On-Chain-Bytecodes nicht mit dem erneut kompilierten Bytecode. Daher sind die Übereinstimmungen bei Etherscan nur teilweise Übereinstimmungen. +Etherscan ist das am häufigsten verwendete Werkzeug zur Verifizierung von Verträgen. Die Vertragsverifizierung von Etherscan hat jedoch einen Nachteil: Der **Metadaten-Hash** des On-Chain-Bytecodes wird nicht mit dem des neu kompilierten Bytecodes verglichen. Daher sind die Übereinstimmungen bei Etherscan nur teilweise Übereinstimmungen. -[Mehr zur Verifizierung von Verträgen auf Etherscan](https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327). +[Mehr über die Verifizierung von Verträgen auf Etherscan](https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327). + +### Blockscout {#blockscout} + +[Blockscout](https://blockscout.com/) ist ein Open-Source-Blockchain-Explorer, der auch einen [Dienst zur Vertragsverifizierung](https://eth.blockscout.com/contract-verification) für Entwickler und Benutzer von Smart Contracts anbietet. Als Open-Source-Alternative bietet Blockscout Transparenz bei der Durchführung der Verifizierung und ermöglicht Community-Beiträge zur Verbesserung des Verifizierungsprozesses. + +Ähnlich wie andere Verifizierungsdienste ermöglicht Blockscout die Verifizierung des Quellcodes Ihres Vertrags, indem der Bytecode neu kompiliert und mit dem bereitgestellten Vertrag verglichen wird. Sobald Ihr Vertrag verifiziert ist, erhält er einen Verifizierungsstatus und der Quellcode wird für Audits und Interaktionen öffentlich zugänglich. Verifizierte Verträge werden auch im [Repository für verifizierte Verträge](https://eth.blockscout.com/verified-contracts) von Blockscout aufgelistet, um das Durchsuchen und Auffinden zu erleichtern. ### Sourcify {#sourcify} -[Sourcify](https://sourcify.dev/#/verifier) ist ein weiteres Werkzeug zur Verifizierung von Verträgen, das auf Open-Source-Software basiert und dezentralisiert ist. Es ist kein Block Explorer und verifiziert Verträge nur auf [verschiedenen EVM-basierten Netzwerken](https://docs.sourcify.dev/docs/chains). Sourcify fungiert als öffentliche Infrastruktur, auf der andere Tools aufbauen können, und verfolgt das Ziel, menschenfreundlichere Vertragsinteraktionen zu ermöglichen. Zu diesem Zweck greift es auf die Kommentare [ABI](/developers/docs/smart-contracts/compiling/#web-applications)- und [NatSpec](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html) aus der Metadatendatei zurück. +[Sourcify](https://sourcify.dev/#/verifier) ist ein weiteres Tool zur Verifizierung von Verträgen, das Open-Source und dezentralisiert ist. Es ist kein Block-Explorer und verifiziert Verträge nur in [verschiedenen EVM-basierten Netzwerken](https://docs.sourcify.dev/docs/chains). Es fungiert als öffentliche Infrastruktur, auf der andere Tools aufbauen können, und zielt darauf ab, benutzerfreundlichere Vertragsinteraktionen unter Verwendung der [ABI](/developers/docs/smart-contracts/compiling/#web-applications)- und [NatSpec](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html)-Kommentare in der Metadatendatei zu ermöglichen. -Im Gegensatz zu Etherscan unterstützt Sourcify vollständige Übereinstimmungen mit dem Metadaten-Hash. Die verifizierten Verträge werden in seinem [öffentlichen Repository](https://docs.sourcify.dev/docs/repository/) auf HTTP und [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs) bereitgestellt, wobei IPFS ein dezentrales, [inhaltsadressiertes](https://web3.storage/docs/concepts/content-addressing/) Speichersystem ist. Dies ermöglicht das Abrufen der Metadatendatei eines Vertrags über IPFS, da der angehängte Metadaten-Hash ein IPFS-Hash ist. +Im Gegensatz zu Etherscan unterstützt Sourcify vollständige Übereinstimmungen mit dem Metadaten-Hash. Die verifizierten Verträge werden in seinem [öffentlichen Repository](https://docs.sourcify.dev/docs/repository/) über HTTP und [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs), einem dezentralen, [inhaltsadressierten](https://docs.storacha.network/concepts/content-addressing/) Speicher, bereitgestellt. Dies ermöglicht das Abrufen der Metadatendatei eines Vertrags über IPFS, da der angehängte Metadaten-Hash ein IPFS-Hash ist. -Darüber hinaus kann auch auf die Quellcodedateien über IPFS zugegriffen werden, da IPFS-Hashes dieser Dateien ebenfalls in den Metadaten enthalten sind. Ein Vertrag kann verifiziert werden, indem die Metadatendatei und die Quelldateien über die API, die [UI](https://sourcify.dev/#/verifier) oder die Plug-ins bereitgestellt werden. Das Sourcify-Überwachungstool achtet auch auf Vertragserstellungen in neuen Blöcken und versucht, die Verträge zu verifizieren, wenn deren Metadaten und Quelldateien auf IPFS veröffentlicht wurden. +Darüber hinaus kann auch auf die Quellcodedateien über IPFS zugegriffen werden, da IPFS-Hashes dieser Dateien ebenfalls in den Metadaten enthalten sind. Ein Vertrag kann durch die Bereitstellung der Metadatendatei und der Quelldateien über seine API, die [UI](https://sourcify.dev/#/verifier) oder durch die Verwendung der Plugins verifiziert werden. Das Sourcify-Überwachungstool achtet auch auf Vertragserstellungen in neuen Blöcken und versucht, die Verträge zu verifizieren, wenn deren Metadaten und Quelldateien auf IPFS veröffentlicht wurden. -[Mehr über die Verifizierung von Verträgen auf Sourcify](https://blog.soliditylang.org/2020/06/25/sourcify-faq/). +[Mehr über die Verifizierung von Verträgen auf Sourcify](https://soliditylang.org/blog/2020/06/25/sourcify-faq/). ### Tenderly {#tenderly} -Die [Tenderly-Plattform](https://tenderly.co/) ermöglicht es Web3-Entwicklern, Smart Contracts zu erstellen, zu testen, zu überwachen und zu betreiben. Tenderly kombiniert Debugging-Werkzeuge mit Beobachtungs- und Infrastrukturbausteinen und hilft Entwicklern so dabei, die Entwicklung von Smart Contracts zu beschleunigen. Um die Funktionen von Tenderly vollständig nutzen zu können, müssen Entwickler mithilfe mehrerer Methoden [den Quellcode verifizieren](https://docs.tenderly.co/monitoring/contract-verification). +Die [Tenderly-Plattform](https://tenderly.co/) ermöglicht es Web3-Entwicklern, Smart Contracts zu erstellen, zu testen, zu überwachen und zu betreiben. Tenderly kombiniert Debugging-Werkzeuge mit Beobachtungs- und Infrastrukturbausteinen und hilft Entwicklern so dabei, die Entwicklung von Smart Contracts zu beschleunigen. Um die Tenderly-Funktionen vollständig zu aktivieren, müssen Entwickler eine [Quellcode-Verifizierung](https://docs.tenderly.co/monitoring/contract-verification) mit verschiedenen Methoden durchführen. Es ist möglich, einen Vertrag privat oder öffentlich zu verifizieren. Wenn der Vertrag privat verifiziert wird, ist er nur für Sie (und andere Mitglieder Ihres Projekts) sichtbar. Eine öffentliche Verifizierung hat zur Folge, dass der Vertrag für alle Benutzer der Tenderly-Plattform sichtbar ist. -Sie können Ihre Verträge über das [Dashboard](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-a-smart-contract), [das Tenderly-Hardhat-Plug-in](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-the-tenderly-hardhat-plugin) oder die [CLI](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-cli) verifizieren. +Sie können Ihre Verträge über das [Dashboard](https://docs.tenderly.co/contract-verification), das [Tenderly Hardhat-Plugin](https://docs.tenderly.co/contract-verification/hardhat) oder die [CLI](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-cli) verifizieren. Bei der Verifizierung von Verträgen über das Dashboard müssen Sie die Quelldatei oder die vom Solidity-Compiler erzeugte Metadatendatei, die Adresse/das Netzwerk und die Compiler-Einstellungen importieren. Die Verwendung des Tenderly-Hardhat-Plug-ins ermöglicht eine bessere Kontrolle über den Verifizierungsprozess bei gleichzeitig weniger Aufwand. Sie können mit dem Plug-in zwischen automatischer (kein Code erforderlich) und manueller (Code-basierter) Verifizierung wählen. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [Verifizierung des Quellcodes von Verträgen](https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/) diff --git a/public/content/translations/de/developers/docs/standards/index.md b/public/content/translations/de/developers/docs/standards/index.md index 97e94db4bfd..dd2bfbdf8cd 100644 --- a/public/content/translations/de/developers/docs/standards/index.md +++ b/public/content/translations/de/developers/docs/standards/index.md @@ -1,40 +1,59 @@ --- title: Ethereum-Entwicklungsstandards -description: +description: Informieren Sie sich über Ethereum Standards, einschließlich EIPs, Token Standards wie ERC-20 und ERC-721 sowie Entwicklungskonventionen. lang: de incomplete: true --- -## Standards-Übersicht {#standards-overview} +## Standardübersicht {#standards-overview} -Die Ethereum-Community hat viele Standards angenommen, die dazu beitragen, Projekte (wie [Ethereum-Clients](/Developers/Docs/Nodes-and-Clients/) und Wallets) über alle Implementierungen hinweg interoperabel zu halten. Sie sorgen dafür, dass Smart Contracts und dApps kompatibel bleiben. +Die Ethereum-Community hat viele Standards angenommen, die dazu beitragen, Projekte (wie [Ethereum-Clients](/developers/docs/nodes-and-clients/) und Wallets) über Implementierungen hinweg interoperabel zu halten und sicherzustellen, dass Smart Contracts und Dapps kombinierbar bleiben. -Normalerweise werden diese als [Ethereum Improvement Proposals](/eips/) (EIPs) eingeführt, die von Community-Mitgliedern über einen [Standardprozess](https://eips.ethereum.org/EIPS/eip-1) diskutiert werden. +Normalerweise werden Standards als [Ethereum-Verbesserungsvorschläge](/eips/) (EIPs) eingeführt, die von Community-Mitgliedern in einem [Standardverfahren](https://eips.ethereum.org/EIPS/eip-1) diskutiert werden. - [Einführung in EIPs](/eips/) - [Liste der EIPs](https://eips.ethereum.org/) -- [EIP GitHub-Repository](https://github.com/ethereum/EIPs) +- [EIP-GitHub-Repo](https://github.com/ethereum/EIPs) - [EIP-Diskussionsforum](https://ethereum-magicians.org/c/eips) -- [Einführung die Ethereum Governance](/governance/) -- [Ethereum Governance Overview](https://web.archive.org/web/20201107234050/https://blog.bmannconsulting.com/Ethereum-Governance/) _31. März 2019 - Boris Mann_ -- [Ethereum Protokoll Entwicklungs- und Netzwerk-Upgrade-Koordination](https://hudsonjameson.com/posts/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) _23. März 2020 - Hudson Jameson_ -- [Playlist aller Ethereum Core Dev Meetings](https://www.youtube.com/@EthereumProtocol) _(YouTube Playlist)_ +- [Einführung in die Ethereum-Governance](/governance/) +- [Überblick über die Ethereum-Governance](https://web.archive.org/web/20201107234050/https://blog.bmannconsulting.com/ethereum-governance/) _31. März 2019 – Boris Mann_ +- [Governance der Ethereum-Protokollentwicklung und Koordination von Netzwerk-Upgrades](https://hudsonjameson.com/posts/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) _23. März 2020 – Hudson Jameson_ +- [Playlist aller Ethereum-Core-Dev-Meetings](https://www.youtube.com/@EthereumProtocol) _(YouTube-Playlist)_ ## Arten von Standards {#types-of-standards} -Bestimmte EIPs beziehen sich auf Anwendungs-Level-Standards (z. B. ein Standard Smart Contract-Format), die als [Ethereum Requests for Comment (ERC)](https://eips.ethereum.org/erc) eingeführt werden. Viele ERCs sind essenzielle Standards, die im Ethereum-Ökosystem weit verbreitet sind. +Es gibt 3 Arten von EIPs: -- [Liste der EIPs](https://eips.ethereum.org/erc) +- Standards Track: beschreibt jede Änderung, die die meisten oder alle Ethereum-Implementierungen betrifft +- [Meta Track](https://eips.ethereum.org/meta): beschreibt einen Prozess rund um Ethereum oder schlägt eine Änderung an einem Prozess vor +- [Informational Track](https://eips.ethereum.org/informational): beschreibt ein Ethereum-Designproblem oder stellt der Ethereum-Community allgemeine Richtlinien oder Informationen zur Verfügung + +Darüber hinaus ist der Standard Track in 4 Kategorien unterteilt: + +- [Core](https://eips.ethereum.org/core): Verbesserungen, die einen Konsens-Fork erfordern +- [Networking](https://eips.ethereum.org/networking): Verbesserungen rund um devp2p und das Light Ethereum Subprotocol sowie vorgeschlagene Verbesserungen der Netzwerkprotokollspezifikationen von Whisper und Swarm. +- [Interface](https://eips.ethereum.org/interface): Verbesserungen rund um Client-API/RPC-Spezifikationen und -Standards sowie bestimmte sprachliche Standards wie Methodennamen und Vertrags-ABIs. +- [ERC](https://eips.ethereum.org/erc): Standards und Konventionen auf Anwendungsebene + +Ausführlichere Informationen zu diesen verschiedenen Typen und Kategorien finden Sie in [EIP-1](https://eips.ethereum.org/EIPS/eip-1#eip-types) ### Token-Standards {#token-standards} -- [ERC-20](/developers/docs/standards/tokens/erc-20/) - Eine Standardschnittstelle für fungible (austauschbare) Token, wie Stimm-Token, Staking-Token oder virtuelle Währungen. -- [ERC-721](/Developers/Docs/Standards/Tokens/erc-721/) - Eine Standardschnittstelle für nicht-fungible Token, wie eine Urkunde für ein Kunstwerk oder ein Lied. -- [ERC-777](/Developers/Docs/Standards/Tokens/erc-777/) - Ein Token-Standard zur Verbesserung von ERC-20. -- [ERC-1155](/Developers/Docs/Standards/Tokens/erc-1155/) - Ein Token-Standard, der sowohl fungible als auch nicht-fungible Werte enthalten kann. +- [ERC-20](/developers/docs/standards/tokens/erc-20/) – Eine Standardschnittstelle für fungible (austauschbare) Tokens, wie Abstimmungstokens, Staking-Tokens oder virtuelle Währungen. + - [ERC-223](/developers/docs/standards/tokens/erc-223/) – Ein Standard für fungible Tokens, durch den sich Tokens identisch zu Ether verhalten und der die Handhabung von Token-Übertragungen auf der Empfängerseite unterstützt. + - [ERC-1363](/developers/docs/standards/tokens/erc-1363/) – Eine Erweiterungsschnittstelle für ERC-20-Tokens, die die Ausführung von Callbacks auf Empfängerverträgen in einer einzigen Transaktion unterstützt. +- [ERC-721](/developers/docs/standards/tokens/erc-721/) – Eine Standardschnittstelle für nicht-fungible Tokens, wie eine Urkunde für ein Kunstwerk oder ein Lied. + - [ERC-2309](https://eips.ethereum.org/EIPS/eip-2309) – Ein standardisiertes Ereignis, das beim Erstellen/Übertragen eines oder mehrerer nicht-fungibler Tokens unter Verwendung aufeinanderfolgender Token-Kennungen ausgelöst wird. + - [ERC-4400](https://eips.ethereum.org/EIPS/eip-4400) – Schnittstellenerweiterung für die EIP-721-Verbraucherrolle. + - [ERC-4907](https://eips.ethereum.org/EIPS/eip-4907) – Hinzufügen einer zeitlich begrenzten Rolle mit eingeschränkten Berechtigungen zu ERC-721-Tokens. +- [ERC-777](/developers/docs/standards/tokens/erc-777/) – **(NICHT EMPFOHLEN)** Ein Token-Standard, der eine Verbesserung gegenüber ERC-20 darstellt. +- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) – Ein Token-Standard, der sowohl fungible als auch nicht-fungible Vermögenswerte enthalten kann. +- [ERC-4626](/developers/docs/standards/tokens/erc-4626/) – Ein tokenisierter Vault-Standard, der entwickelt wurde, um die technischen Parameter von renditetragenden Vaults zu optimieren und zu vereinheitlichen. + +Erfahren Sie mehr über [Token-Standards](/developers/docs/standards/tokens/). -Erfahre mehr über [Token-Standards](/Developers/Docs/Standards/Tokens/). +## Weiterführende Lektüre {#further-reading} -## Weiterführende Informationen {#further-reading} +- [Ethereum-Verbesserungsvorschläge (EIPs)](/eips/) -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-1155/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-1155/index.md index 22740a05f02..6d95d696d15 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/erc-1155/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-1155/index.md @@ -1,35 +1,35 @@ --- title: ERC-1155 Token-Standard -description: +description: Erfahren Sie mehr über ERC-1155, einen Multi-Token-Standard, der fungible und nicht-fungible Token in einem einzigen Vertrag kombiniert. lang: de --- ## Einführung {#introduction} -Eine Standardschnittstelle für Verträge, die mehrere Token-Typen verwalten. Ein einzelner bereitgestellter Vertrag kann eine beliebige Kombination aus fungiblen Token, nicht-fungiblen Token oder anderen Konfigurationen (z. B. halb-fungible Token) enthalten. +Eine Standardschnittstelle für Verträge, die mehrere Token-Typen verwalten. Ein einzelner bereitgestellter Vertrag kann eine beliebige Kombination von fungiblen Token, nicht-fungiblen Token oder anderen Konfigurationen (z. B. semi-fungible Token) enthalten. **Was versteht man unter Multi-Token-Standard?** -Die Idee ist einfach und zielt darauf ab, eine Smart-Contract-Schnittstelle zu schaffen, die eine beliebige Anzahl von fungiblen und nicht-fungiblen Token-Typen darstellen und kontrollieren kann. Auf diese Weise kann der ERC-1155-Token die gleichen Funktionen erfüllen wie ein [ERC-20](/developers/docs/standards/tokens/erc-20/)- und [ERC-721](/developers/docs/standards/tokens/erc-721/)-Token, und sogar beide gleichzeitig. Und das Beste ist, dass die Funktionalität beider Standards verbessert wurde und somit effizienter ist, sowie offensichtliche Implementierungsfehler bei den Standards ERC-20 und ERC-721 korrigiert werden. +Die Idee ist einfach und zielt darauf ab, eine Smart-Contract-Schnittstelle zu schaffen, die eine beliebige Anzahl von fungiblen und nicht-fungiblen Token-Typen darstellen und kontrollieren kann. Auf diese Weise kann der ERC-1155-Token dieselben Funktionen wie ein [ERC-20](/developers/docs/standards/tokens/erc-20/)- und [ERC-721](/developers/docs/standards/tokens/erc-721/)-Token ausführen, und sogar beide gleichzeitig. Er verbessert die Funktionalität sowohl des ERC-20- als auch des ERC-721-Standards, macht sie effizienter und korrigiert offensichtliche Implementierungsfehler. -Der ERC-1155-Token wird in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155) ausführlich beschrieben. +Der ERC-1155-Token wird vollständig in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155) beschrieben. ## Voraussetzungen {#prerequisites} -Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zuerst etwas über [Token-Standards](/developers/docs/standards/tokens/), [ERC-20](/developers/docs/standards/tokens/erc-20/) und [ERC-721](/developers/docs/standards/tokens/erc-721/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [Token-Standards](/developers/docs/standards/tokens/), [ERC-20](/developers/docs/standards/tokens/erc-20/) und [ERC-721](/developers/docs/standards/tokens/erc-721/) zu informieren. ## ERC-1155 Funktionen und Merkmale: {#body} -- [Batch-Transfer](#batch_transfers): Übertragen Sie mehrere Assets in einem einzigen Schritt. -- [Batch-Balance](#batch_balance): Abrufen der Salden mehrerer Anlagen in einem einzigen Schritt. -- [Batch-Genehmigung](#batch_approval): Genehmige alle Token für eine Adresse. -- [Haken](#receive_hook): Haken für den Empfang von Token. -- [NFT-Support](#nft_support): Wenn das Angebot nur 1 ist, wird es als NFT behandelt. +- [Batch-Übertragung](#batch_transfers): Übertragen Sie mehrere Assets in einem einzigen Aufruf. +- [Batch-Guthaben](#batch_balance): Rufen Sie die Guthaben mehrerer Assets in einem einzigen Aufruf ab. +- [Batch-Genehmigung](#batch_approval): Genehmigen Sie alle Token für eine Adresse. +- [Hooks](#receive_hook): Hook zum Empfangen von Token. +- [NFT-Unterstützung](#nft_support): Wenn die Menge nur 1 beträgt, wird es als NFT behandelt. - [Sichere Übertragungsregeln](#safe_transfer_rule): Regelwerk für die sichere Übertragung. ### Batch-Übertragungen {#batch-transfers} -Die Batch-Übertragung funktioniert sehr ähnlich wie die regulären ERC-20-Übertragungen. Schaue Sie sich die reguläre ERC-20 Übertragung-von-Funktion an: +Die Batch-Übertragung funktioniert sehr ähnlich wie die regulären ERC-20-Übertragungen. Schauen wir uns die reguläre ERC-20-Funktion `transferFrom` an: ```solidity // ERC-20 @@ -45,17 +45,17 @@ function safeBatchTransferFrom( ) external; ``` -Der einzige Unterschied bei ERC-1155 besteht darin, dass wir die Werte als Array übergeben und auch ein Array mit Id's übergeben. Wenn beispielsweise `ids=[3, 6, 13]` und `values=[100, 200, 5]` gegeben sind, werden die resultierenden Übertragungen wie folgt sein: +Der einzige Unterschied bei ERC-1155 besteht darin, dass wir die Werte als Array übergeben und auch ein Array von IDs übergeben. Wenn beispielsweise `ids=[3, 6, 13]` und `values=[100, 200, 5]` gegeben sind, lauten die resultierenden Übertragungen: -1. Übertragung von 100 Token mit Id 3 von `_from` nach `_to`. -2. Übertragung von 200 Token mit Id 6 von `_from` nach `_to`. -3. Übertragung von 5 Token mit Id 13 von `_from` nach `_to`. +1. Übertragung von 100 Token mit der ID 3 von `_from` an `_to`. +2. Übertragung von 200 Token mit der ID 6 von `_from` an `_to`. +3. Übertragung von 5 Token mit der ID 13 von `_from` an `_to`. -In ERC-1155 haben wir nur `Übertragung von`, keine `Übertragung`. Um sie wie eine normale `Übertragung` zu benutzen, setzen Sie einfach die Absenderadresse auf die Adresse, welche die Funktion aufruft. +In ERC-1155 gibt es nur `transferFrom`, kein `transfer`. Um es wie ein reguläres `transfer` zu verwenden, setzen Sie einfach die Absenderadresse auf die Adresse, die die Funktion aufruft. -### Batch-Balance {#batch-balance} +### Batch-Guthaben {#batch-balance} -Der entsprechende ERC-20 `Balance-von`-Schritt hat ebenfalls eine Partnerfunktion mit Batch-Unterstützung. Zur Erinnerung: Dies ist die ERC-20-Version: +Der entsprechende ERC-20-Aufruf `balanceOf` hat ebenfalls eine Partnerfunktion mit Batch-Unterstützung. Zur Erinnerung: Dies ist die ERC-20-Version: ```solidity // ERC-20 @@ -70,7 +70,7 @@ function balanceOfBatch( Bei der Abfrage des Saldos ist es sogar noch einfacher, denn wir können mehrere Salden in einem einzigen Schritt abrufen. Wir übergeben das Array der Besitzer, gefolgt von dem Array der Token-Ids. -Zum Beispiel wird bei `_ids=[3, 6, 13]` und `_owners=[0xbeef..., 0x1337..., 0x1111...]`, der Rückgabewert sein +Wenn beispielsweise `_ids=[3, 6, 13]` und `_owners=[0xbeef..., 0x1337..., 0x1111...]` gegeben sind, lautet der Rückgabewert: ```solidity [ @@ -95,13 +95,13 @@ function isApprovedForAll( ) external view returns (bool); ``` -Die Genehmigungen unterscheiden sich geringfügig von denen des ERC-20. Anstatt bestimmte Beträge zu genehmigen, setzen Sie einen Operator über `setApprovalForAll` auf genehmigt oder nicht genehmigt. +Die Genehmigungen unterscheiden sich geringfügig von denen des ERC-20. Anstatt bestimmte Beträge zu genehmigen, setzen Sie einen Operator über `setApprovalForAll` auf „genehmigt“ oder „nicht genehmigt“. -Der aktuelle Status kann über `isApprovedForAll` ausgelesen werden. Wie Sie sehen, geht es um alles oder nichts. Sie können nicht festlegen, wie viele Token genehmigt werden und auch nicht, welche Token-Klasse. +Der aktuelle Status kann über `isApprovedForAll` ausgelesen werden. Wie Sie sehen können, ist es eine Alles-oder-Nichts-Operation. Sie können nicht festlegen, wie viele Token genehmigt werden und auch nicht, welche Token-Klasse. Dies wurde absichtlich so einfach wie möglich gestaltet. Sie können alles nur für eine Adresse genehmigen. -### Haken erhalten {#receive-hook} +### Empfangs-Hook {#receive-hook} ```solidity function onERC1155BatchReceived( @@ -113,7 +113,7 @@ function onERC1155BatchReceived( ) external returns(bytes4); ``` -Angesichts der [EIP-165](https://eips.ethereum.org/EIPS/eip-165)-Unterstützung unterstützt ERC-1155 nur Haken erhalten für Smart Contracts. Die Haken-Funktion muss einen magischen vordefinierten Bytes4-Wert zurückgeben, der wie folgt angegeben wird: +Dank der [EIP-165](https://eips.ethereum.org/EIPS/eip-165)-Unterstützung unterstützt ERC-1155 Empfangs-Hooks nur für Smart Contracts. Die Haken-Funktion muss einen magischen vordefinierten Bytes4-Wert zurückgeben, der wie folgt angegeben wird: ```solidity bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")) @@ -125,22 +125,22 @@ Wenn der empfangende Vertrag diesen Wert zurückgibt, wird davon ausgegangen, da Wenn es nur eine Angebotsmenge gibt, ist der Token im Wesentlichen ein nicht-fungibler Token (NFT). Und wie bei ERC-721 üblich, können Sie eine Metadaten-URL definieren. Die URL kann von Clients gelesen und geändert werden, siehe [hier](https://eips.ethereum.org/EIPS/eip-1155#metadata). -### Regel zur sicheren Übertragung {#safe-transfer-rule} +### Regel für sichere Übertragungen {#safe-transfer-rule} In den vorangegangenen Erläuterungen haben wir bereits einige Regeln für die sichere Übertragung angesprochen. Aber schauen wir uns die wichtigsten Regeln an: -1. Dem Abfrager muss die Genehmigung erteilt werden, die Token für die `from`-Adresse auszugeben, oder der Abfrager muss gleich `from` sein. +1. Der Aufrufer muss berechtigt sein, die Token für die `_from`-Adresse auszugeben, oder der Aufrufer muss `_from` sein. 2. Der Übertragungsruf muss zurückgehen, wenn - 1. `_to` Adresse ist 0. - 2. die Länge von `_ids` entspricht nicht der Länge von `_Values`. - 3. irgendein Guthaben des/der Token-Inhaber(s) in `_ids` ist niedriger als die entsprechenden Beträge in `_Values`, die an den Empfänger gesendet werden. + 1. Die `_to`-Adresse ist 0. + 2. Die Länge von `_ids` entspricht nicht der Länge von `_values`. + 3. Das Guthaben eines Inhabers für einen Token in `_ids` ist geringer als der entsprechende Betrag in `_values`, der an den Empfänger gesendet wird. 4. Ein anderer Fehler tritt auf. -_Hinweis_: Alle Batch-Funktionen einschließlich des Hakens gibt es auch als Versionen ohne Batch. Dies geschieht aus Gründen der Gaseffizienz, da die Übertragung nur eines Vermögenswerts wahrscheinlich immer noch der am häufigsten genutzte Weg sein wird. Wir haben sie der Einfachheit halber in den Erläuterungen weggelassen, einschließlich der Regeln für die sichere Übertragung. Die Namen sind identisch, Sie müssen nur das „Batch" entfernen. +_Hinweis_: Alle Batch-Funktionen, einschließlich des Hooks, existieren auch als Versionen ohne Batch. Dies geschieht aus Gründen der Gaseffizienz, da die Übertragung nur eines Vermögenswerts wahrscheinlich immer noch der am häufigsten genutzte Weg sein wird. Wir haben sie der Einfachheit halber in den Erläuterungen weggelassen, einschließlich der Regeln für die sichere Übertragung. Die Namen sind identisch, Sie müssen nur das „Batch" entfernen. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} - [EIP-1155: Multi-Token-Standard](https://eips.ethereum.org/EIPS/eip-1155) -- [ERC-1155: Openzeppelin Docs](https://docs.openzeppelin.com/contracts/3.x/erc1155) -- [ERC-1155: GitHub Repo](https://github.com/enjin/erc-1155) -- [Alchemy NFT API](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) +- [ERC-1155: Openzeppelin Docs](https://docs.openzeppelin.com/contracts/5.x/erc1155) +- [ERC-1155: GitHub-Repo](https://github.com/enjin/erc-1155) +- [Alchemy NFT-API](https://www.alchemy.com/docs/reference/nft-api-quickstart) diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-1363/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-1363/index.md new file mode 100644 index 00000000000..2f10ca792ff --- /dev/null +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-1363/index.md @@ -0,0 +1,203 @@ +--- +title: ERC-1363 Zahlbarer Token-Standard +description: ERC-1363 ist eine Erweiterungsschnittstelle für ERC-20-Token, die die Ausführung einer benutzerdefinierten Logik auf einem Empfängervertrag nach Übertragungen oder auf einem Spendervertrag nach Genehmigungen innerhalb einer einzigen Transaktion unterstützt. +lang: de +--- + +## Einführung {#introduction} + +### Was ist ERC-1363? {#what-is-erc1363} + +ERC-1363 ist eine Erweiterungsschnittstelle für ERC-20-Token, die die Ausführung einer benutzerdefinierten Logik auf einem Empfängervertrag nach Übertragungen oder auf einem Spendervertrag nach Genehmigungen innerhalb einer einzigen Transaktion unterstützt. + +### Unterschiede zu ERC-20 {#erc20-differences} + +Standard-ERC-20-Operationen wie `transfer`, `transferFrom` und `approve` erlauben keine Codeausführung auf dem Empfänger- oder Spendervertrag ohne eine separate Transaktion. +Dies führt zu Komplexität in der UI-Entwicklung und zu Reibungsverlusten bei der Einführung, da Benutzer auf die Ausführung der ersten Transaktion warten und dann die zweite einreichen müssen. +Sie müssen auch zweimal GAS bezahlen. + +ERC-1363 ermöglicht es fungiblen Token, Aktionen einfacher durchzuführen und ohne die Verwendung eines Off-Chain-Listeners zu funktionieren. +Es ermöglicht, nach einer Übertragung oder einer Genehmigung in einer einzigen Transaktion einen Callback auf einem Empfänger- oder Spendervertrag durchzuführen. + +## Voraussetzungen {#prerequisites} + +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, zunächst Folgendes zu lesen: + +- [Token-Standards](/developers/docs/standards/tokens/) +- [ERC-20](/developers/docs/standards/tokens/erc-20/) + +## Hauptteil {#body} + +ERC-1363 führt eine Standard-API für ERC-20-Token ein, um nach `transfer`, `transferFrom` oder `approve` mit Smart Contracts zu interagieren. + +Dieser Standard bietet grundlegende Funktionen zum Übertragen von Token und ermöglicht die Genehmigung von Token, damit sie von einem anderen On-Chain-Drittanbieter ausgegeben werden können, um dann einen Callback auf dem Empfänger- oder Spendervertrag durchzuführen. + +Es gibt viele vorgeschlagene Anwendungsfälle für Smart Contracts, die ERC-20-Callbacks akzeptieren können. + +Beispiele könnten sein: + +- **Crowdsales**: Gesendete Token lösen eine sofortige Zuteilung der Belohnung aus. +- **Dienstleistungen**: Die Zahlung aktiviert den Dienstzugang in einem Schritt. +- **Rechnungen**: Token begleichen Rechnungen automatisch. +- **Abonnements**: Die Genehmigung des jährlichen Tarifs aktiviert das Abonnement mit der Zahlung des ersten Monats. + +Aus diesen Gründen wurde es ursprünglich **„Payable Token“** genannt. + +Das Callback-Verhalten erweitert den Nutzen zusätzlich und ermöglicht nahtlose Interaktionen wie: + +- **Staking**: Übertragene Token lösen eine automatische Sperrung in einem Staking-Vertrag aus. +- **Abstimmung**: Erhaltene Token registrieren Stimmen in einem Governance-System. +- **Swapping**: Token-Genehmigungen aktivieren die Swap-Logik in einem einzigen Schritt. + +ERC-1363-Token können für bestimmte Zwecke in allen Fällen verwendet werden, in denen nach einer erhaltenen Übertragung oder Genehmigung ein Callback ausgeführt werden muss. +ERC-1363 ist auch nützlich, um den Verlust oder die Sperrung von Token in Smart Contracts zu vermeiden, indem die Fähigkeit des Empfängers, die Token zu handhaben, überprüft wird. + +Im Gegensatz zu anderen ERC-20-Erweiterungsvorschlägen überschreibt ERC-1363 nicht die `transfer`- und `transferFrom`-Methoden von ERC-20 und definiert die zu implementierenden Schnittstellen-IDs, wodurch die Abwärtskompatibilität mit ERC-20 erhalten bleibt. + +Aus [EIP-1363](https://eips.ethereum.org/EIPS/eip-1363): + +### Methoden {#methods} + +Smart Contracts, die den ERC-1363-Standard implementieren, **MÜSSEN** alle Funktionen der `ERC1363`-Schnittstelle sowie die `ERC20`- und `ERC165`-Schnittstellen implementieren. + +```solidity +pragma solidity ^0.8.0; + +/** + * @title ERC1363 + * @dev Eine Erweiterungsschnittstelle für ERC-20-Token, die die Ausführung von Code in einem Empfängervertrag nach `transfer` oder `transferFrom` oder Code in einem Spendervertrag nach `approve` in einer einzigen Transaktion unterstützt. + */ +interface ERC1363 is ERC20, ERC165 { + /* + * HINWEIS: Die ERC-165-Kennung für diese Schnittstelle lautet 0xb0202a11. + * 0xb0202a11 === + * bytes4(keccak256('transferAndCall(address,uint256)')) ^ + * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ + * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ + * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ + * bytes4(keccak256('approveAndCall(address,uint256)')) ^ + * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) + */ + + /** + * @dev Verschiebt einen Token-Betrag von `value` vom Konto des Aufrufers nach `to` und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. + * @param to Die Adresse, an die die Token übertragen werden. + * @param value Der Betrag der zu übertragenden Token. + * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. + */ + function transferAndCall(address to, uint256 value) external returns (bool); + + /** + * @dev Verschiebt einen Token-Betrag von `value` vom Konto des Aufrufers nach `to` und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. + * @param to Die Adresse, an die die Token übertragen werden. + * @param value Der Betrag der zu übertragenden Token. + * @param data Zusätzliche Daten ohne bestimmtes Format, die beim Aufruf an `to` gesendet werden. + * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. + */ + function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); + + /** + * @dev Verschiebt einen Token-Betrag von `value` von `from` nach `to` unter Verwendung des Genehmigungsmechanismus und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. + * @param from Die Adresse, von der die Token gesendet werden. + * @param to Die Adresse, an die die Token übertragen werden. + * @param value Der Betrag der zu übertragenden Token. + * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. + */ + function transferFromAndCall(address from, address to, uint256 value) external returns (bool); + + /** + * @dev Verschiebt einen Token-Betrag von `value` von `from` nach `to` unter Verwendung des Genehmigungsmechanismus und ruft dann `ERC1363Receiver::onTransferReceived` auf `to` auf. + * @param from Die Adresse, von der die Token gesendet werden. + * @param to Die Adresse, an die die Token übertragen werden. + * @param value Der Betrag der zu übertragenden Token. + * @param data Zusätzliche Daten ohne bestimmtes Format, die beim Aufruf an `to` gesendet werden. + * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. + */ + function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); + + /** + * @dev Legt einen Token-Betrag von `value` als Genehmigung für `spender` über die Token des Aufrufers fest und ruft dann `ERC1363Spender::onApprovalReceived` auf `spender` auf. + * @param spender Die Adresse, die das Guthaben ausgeben wird. + * @param value Der Betrag der auszugebenden Token. + * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. + */ + function approveAndCall(address spender, uint256 value) external returns (bool); + + /** + * @dev Legt einen Token-Betrag von `value` als Genehmigung für `spender` über die Token des Aufrufers fest und ruft dann `ERC1363Spender::onApprovalReceived` auf `spender` auf. + * @param spender Die Adresse, die das Guthaben ausgeben wird. + * @param value Der Betrag der auszugebenden Token. + * @param data Zusätzliche Daten ohne bestimmtes Format, die beim Aufruf an `spender` gesendet werden. + * @return Ein boolescher Wert, der angibt, dass die Operation erfolgreich war, es sei denn, es wird ein Fehler ausgelöst. + */ + function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); +} + +interface ERC20 { + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + function transfer(address to, uint256 value) external returns (bool); + function transferFrom(address from, address to, uint256 value) external returns (bool); + function approve(address spender, uint256 value) external returns (bool); + function totalSupply() external view returns (uint256); + function balanceOf(address account) external view returns (uint256); + function allowance(address owner, address spender) external view returns (uint256); +} + +interface ERC165 { + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} +``` + +Ein Smart Contract, der ERC-1363-Token über `transferAndCall` oder `transferFromAndCall` annehmen möchte, **MUSS** die `ERC1363Receiver`-Schnittstelle implementieren: + +```solidity +/** + * @title ERC1363Receiver + * @dev Schnittstelle für jeden Vertrag, der `transferAndCall` oder `transferFromAndCall` von ERC-1363-Token-Verträgen unterstützen möchte. + */ +interface ERC1363Receiver { + /** + * @dev Immer wenn ERC-1363-Token über `ERC1363::transferAndCall` oder `ERC1363::transferFromAndCall` von `operator` von `from` an diesen Vertrag übertragen werden, wird diese Funktion aufgerufen. + * + * HINWEIS: Um die Übertragung zu akzeptieren, muss diese Funktion `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` zurückgeben + * (d. h. 0x88a7ca5c oder ihren eigenen Funktionsselektor). + * + * @param operator Die Adresse, die die Funktion `transferAndCall` oder `transferFromAndCall` aufgerufen hat. + * @param from Die Adresse, von der die Token übertragen werden. + * @param value Der Betrag der übertragenen Token. + * @param data Zusätzliche Daten ohne bestimmtes Format. + * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` wenn die Übertragung zulässig ist, es sei denn, es wird ein Fehler ausgelöst. + */ + function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4); +} +``` + +Ein Smart Contract, der ERC-1363-Token über `approveAndCall` annehmen möchte, **MUSS** die `ERC1363Spender`-Schnittstelle implementieren: + +```solidity +/** + * @title ERC1363Spender + * @dev Schnittstelle für jeden Vertrag, der `approveAndCall` von ERC-1363-Token-Verträgen unterstützen möchte. + */ +interface ERC1363Spender { + /** + * @dev Immer wenn ein ERC-1363-Token-`owner` diesen Vertrag über `ERC1363::approveAndCall` zur Ausgabe seiner Token autorisiert, + * wird diese Funktion aufgerufen. + * + * HINWEIS: Um die Genehmigung zu akzeptieren, muss diese Funktion `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` zurückgeben + * (d. h. 0x7b04a2d0 oder ihren eigenen Funktionsselektor). + * + * @param owner Die Adresse, die die Funktion `approveAndCall` aufgerufen hat und zuvor die Token besaß. + * @param value Der Betrag der auszugebenden Token. + * @param data Zusätzliche Daten ohne bestimmtes Format. + * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` wenn die Genehmigung zulässig ist, es sei denn, es wird ein Fehler ausgelöst. + */ + function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4); +} +``` + +## Weiterführende Lektüre {#further-reading} + +- [ERC-1363: Zahlbarer Token-Standard](https://eips.ethereum.org/EIPS/eip-1363) +- [ERC-1363: GitHub-Repo](https://github.com/vittominacori/erc1363-payable-token) diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-20/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-20/index.md index b93ba611571..90cce601b6a 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/erc-20/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-20/index.md @@ -1,6 +1,6 @@ --- title: ERC-20 Token-Standard -description: +description: Erfahren Sie mehr über ERC-20, den Standard für fungible Token auf Ethereum, der interoperable Token Anwendungen ermöglicht. lang: de --- @@ -12,17 +12,17 @@ Token können praktisch alles in Ethereum darstellen: - Reputationspunkte auf einer Online-Platform - Fähigkeiten eines Charakters in einem Spiel -- Lotteriescheine - Vermögenswerte wie Anteile an einer Firma - Eine Fiat-Währung wie der US-Dollar - Eine Goldunze -- und weitere... +- und mehr... -Diese mächtigen Eigenschaften von Ethereum sollten in einem stabilen Standard bereitgestellt werden, oder? Und genau das ist der Punkt, an dem ERC-20 ins Spiel kommt! Dieser Standard ermöglicht es Entwicklern, Token zu erstellen, die mit anderen Produkten und Services interagieren können. +Diese mächtigen Eigenschaften von Ethereum sollten in einem stabilen Standard bereitgestellt werden, oder? Und genau das ist der Punkt, an dem ERC-20 ins Spiel kommt! Dieser Standard ermöglicht es Entwicklern, Token zu erstellen, die mit anderen Produkten und Services interagieren können. Der ERC-20-Standard wird auch verwendet, um [Ether](/glossary/#ether) zusätzliche Funktionalität bereitzustellen. **Was ist ERC-20?** -Der ERC-20 führt einen Standard für Fungible Token ein. Mit anderen Worten, sie haben eine Eigenschaft, bei der jeder Token in Bezug auf Typ und Wert anderen Token entspricht. Zum Beispiel verhält sich ein ERC-20-Token genau wie der ETH. Das bedeutet, dass ein Token immer dem Wert aller anderen Token entspricht. +Der ERC-20 führt einen Standard für fungible Token ein, das heißt, sie haben eine Eigenschaft, die jeden Token genau gleich (in Art und Wert) wie einen anderen Token macht. Zum Beispiel verhält sich ein ERC-20-Token genau wie der ETH. Das bedeutet, dass ein Token +immer dem Wert aller anderen Token entspricht. ## Voraussetzungen {#prerequisites} @@ -32,7 +32,8 @@ Der ERC-20 führt einen Standard für Fungible Token ein. Mit anderen Worten, si ## Hauptteil {#body} -Der im November 2015 von Fabian Vogelsteller eingereichte ERC-20-Antrag (Ethereum Request for Comments 20) ist ein Token-Standard, der eine API für Tokens innerhalb von Smart Contracts implementiert. +Der im November 2015 von Fabian Vogelsteller eingereichte ERC-20-Antrag (Ethereum Request for Comments 20) ist ein Token-Standard, der +eine API für Tokens innerhalb von Smart Contracts implementiert. Beispielfunktionalitäten, die ERC-20 bietet: @@ -43,7 +44,7 @@ Beispielfunktionalitäten, die ERC-20 bietet: Wenn ein Smart Contract die folgenden Methoden und Ereignisse implementiert, kann er als ERC-20-Token-Vertrag bezeichnet werden und ist nach der Bereitstellung dafür verantwortlich, die erstellten Token auf Ethereum zu verfolgen. -Von [EIP-20](https://eips.ethereum.org/EIPS/eip-20): +Aus [EIP-20](https://eips.ethereum.org/EIPS/eip-20): ### Methoden {#methods} @@ -59,7 +60,7 @@ function approve(address _spender, uint256 _value) public returns (bool success) function allowance(address _owner, address _spender) public view returns (uint256 remaining) ``` -### Events {#events} +### Ereignisse {#events} ```solidity event Transfer(address indexed _from, address indexed _to, uint256 _value) @@ -68,11 +69,13 @@ event Approval(address indexed _owner, address indexed _spender, uint256 _value) ### Beispiele {#web3py-example} -Sehen wir uns an, wie wichtig ein Standard ist, um uns die Überprüfung jedes ERC-20-Token-Vertrags auf Ethereum zu erleichtern. Wir benötigen lediglich das Contract Application Binary Interface (ABI), um eine Schnittstelle zu einem beliebigen ERC-20-Token zu erstellen. Wie Sie unten sehen können, werden wir ein vereinfachtes ABI verwenden, um es zu einem Beispiel mit geringer Reibung zu machen. +Sehen wir uns an, wie wichtig ein Standard ist, um uns die Überprüfung jedes ERC-20-Token-Vertrags auf Ethereum zu erleichtern. +Wir benötigen lediglich das Contract Application Binary Interface (ABI), um eine Schnittstelle zu einem beliebigen ERC-20-Token zu erstellen. Wie Sie +unten sehen können, werden wir ein vereinfachtes ABI verwenden, um es zu einem Beispiel mit geringer Reibung zu machen. -#### Web3.py Beispiel {#web3py-example} +#### Web3.py-Beispiel {#web3py-example} -Stellen Sie zuerst sicher, dass Sie [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation) Python-Bibliothek installiert haben: +Stellen Sie zunächst sicher, dass Sie die Python-Bibliothek [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation) installiert haben: ``` pip install web3 @@ -85,11 +88,11 @@ from web3 import Web3 w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com")) dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI -weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH) +weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Gedeckter Ether (WETH) acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2 -# Dies ist ein vereinfachtes Contract Application Binary Interface (ABI) eines ERC-20 Token Contracts. +# Dies ist eine vereinfachte Contract Application Binary Interface (ABI) eines ERC-20-Token-Vertrags. # Es werden nur die Methoden verfügbar gemacht: balanceOf(address), decimals(), symbol() und totalSupply() simplified_abi = [ { @@ -118,7 +121,7 @@ simplified_abi = [ } ] -dai_contract = w3.eth.contract(address=w3.toChecksumAddress(dai_token_addr), abi=simplified_abi) +dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi) symbol = dai_contract.functions.symbol().call() decimals = dai_contract.functions.decimals().call() totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals @@ -129,7 +132,7 @@ print("===== %s =====" % symbol) print("Total Supply:", totalSupply) print("Addr Balance:", addr_balance) -weth_contract = w3.eth.contract(address=w3.toChecksumAddress(weth_token_addr), abi=simplified_abi) +weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi) symbol = weth_contract.functions.symbol().call() decimals = weth_contract.functions.decimals().call() totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals @@ -141,8 +144,46 @@ print("Total Supply:", totalSupply) print("Addr Balance:", addr_balance) ``` -## Weiterführende Informationen {#further-reading} +## Bekannte Probleme {#erc20-issues} -- [EIP-20: ERC-20 Token Standard](https://eips.ethereum.org/EIPS/eip-20) -- [OpenZeppelin - Token](https://docs.openzeppelin.com/contracts/3.x/tokens#ERC20) -- [OpenZeppelin - ERC-20 Implementierung](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) +### Problem beim Empfang von ERC-20-Token {#reception-issue} + +**Bis zum 20.06.2024 gingen aufgrund dieses Problems ERC-20-Token im Wert von mindestens 83.656.418 US-Dollar verloren. Beachten Sie, dass eine reine ERC-20-Implementierung anfällig für dieses Problem ist, es sei denn, Sie implementieren zusätzlich zu dem Standard eine Reihe weiterer Einschränkungen, wie unten aufgeführt.** + +Wenn ERC-20-Token an einen Smart Contract gesendet werden, der nicht für den Umgang mit ERC-20-Token ausgelegt ist, können diese Token dauerhaft verloren gehen. Das passiert, weil der empfangende Vertrag nicht die Funktionalität hat, die eingehenden Token zu erkennen oder darauf zu reagieren, und es gibt keinen Mechanismus im ERC-20-Standard, um den empfangenden Vertrag über die eingehenden Token zu benachrichtigen. Die Hauptursachen dieses Problems sind: + +1. Token-Übertragungsmechanismus + +- ERC-20-Token werden mit den Funktionen transfer oder transferFrom übertragen + - Wenn ein Benutzer Token an eine Vertragsadresse mit diesen Funktionen sendet, werden die Token unabhängig davon übertragen, ob der empfangende Vertrag dafür ausgelegt ist oder nicht + +2. Fehlende Benachrichtigung + - Der empfangende Vertrag erhält keine Benachrichtigung oder Rückmeldung, dass Token an ihn gesendet wurden + - Wenn der empfangende Vertrag keinen Mechanismus hat, um Token zu verarbeiten (z.B. eine Fallback-Funktion oder eine spezielle Funktion zur Verwaltung des Tokenempfangs), bleiben die Token effektiv in der Adresse des Vertrags hängen +3. Keine eingebaute Verarbeitung + - Der ERC-20-Standard enthält keine obligatorische Funktion, die empfangende Verträge implementieren müssen, was dazu führt, dass viele Verträge nicht in der Lage sind, eingehende Token richtig zu verwalten + +**Mögliche Lösungen** + +Es ist zwar nicht möglich, dieses Problem mit ERC-20 vollständig zu verhindern, aber es gibt Methoden, mit denen die Wahrscheinlichkeit eines Sickerverlusts für den Endnutzer erheblich verringert werden kann: + +- Das häufigste Problem tritt auf, wenn ein Benutzer Token an die Adresse des Token-Vertrags selbst sendet (z. B. USDT, die an die Adresse des USDT-Token-Vertrags eingezahlt werden). Es wird empfohlen, die transfer(..)-Funktion einzuschränken, um solche Übertragungsversuche rückgängig zu machen. Erwägen Sie, die Prüfung require(_to != address(this)); in die Implementierung der Funktion transfer(..) aufzunehmen. +- Die transfer(..)-Funktion ist im Allgemeinen nicht dafür ausgelegt, Token in Verträge einzuzahlen. `Genehmigung(..) & transferFrom(..)`-Muster wird stattdessen verwendet, um ERC-20-Token in Verträge einzuzahlen. Es ist möglich, die Transferfunktion so einzuschränken, dass keine Token in Verträge mit dieser Funktion eingezahlt werden können. Dies kann jedoch die Kompatibilität mit Verträgen beeinträchtigen, die davon ausgehen, dass Token mit der Funktion trasnfer(..) in Verträge eingezahlt werden können (z. B. Uniswap-Liquiditätspools). +- Gehen Sie immer davon aus, dass ERC-20-Token in Ihrem Vertrag landen können, auch wenn Ihr Vertrag eigentlich keine erhalten soll. Es gibt keine Möglichkeit, versehentliche Einzahlungen aufseiten des Empfängers zu verhindern oder abzulehnen. Es wird empfohlen, eine Funktion zu implementieren, mit der versehentlich hinterlegte ERC-20-Token extrahiert werden können. +- Erwägen Sie die Verwendung alternativer Token-Standards. + +Aus diesem Problem sind einige alternative Standards hervorgegangen, wie zum Beispiel [ERC-223](/developers/docs/standards/tokens/erc-223) oder [ERC-1363](/developers/docs/standards/tokens/erc-1363). + +## Weiterführende Lektüre {#further-reading} + +- [EIP-20: ERC-20-Token-Standard](https://eips.ethereum.org/EIPS/eip-20) +- [OpenZeppelin – Tokens](https://docs.openzeppelin.com/contracts/3.x/tokens#ERC20) +- [OpenZeppelin – ERC-20-Implementierung](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) +- [Alchemy – Leitfaden für Solidity-ERC20-Token](https://www.alchemy.com/overviews/erc20-solidity) + +## Andere fungible Token-Standards {#fungible-token-standards} + +- [ERC-223](/developers/docs/standards/tokens/erc-223) +- [ERC-1363](/developers/docs/standards/tokens/erc-1363) +- [ERC-777](/developers/docs/standards/tokens/erc-777) +- [ERC-4626 – Tokenisierte Vaults](/developers/docs/standards/tokens/erc-4626) diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-223/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-223/index.md new file mode 100644 index 00000000000..ae2f12755e8 --- /dev/null +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-223/index.md @@ -0,0 +1,197 @@ +--- +title: ERC-223 Token-Standard +description: Eine Übersicht über den ERC-223-Fungible-Token-Standard, wie er funktioniert und ein Vergleich mit ERC-20. +lang: de +--- + +## Einführung {#introduction} + +### Was ist ERC-223? {#what-is-erc223} + +ERC-223 ist ein Standard für Fungible Tokens, ähnlich dem ERC-20-Standard. Der Hauptunterschied besteht darin, dass ERC-223 nicht nur die Token-API definiert, sondern auch die Logik für die Übertragung von Token vom Absender zum Empfänger. Es führt ein Kommunikationsmodell ein, das ermöglicht, dass Token-Übertragungen auf der Empfängerseite verarbeitet werden können. + +### Unterschiede zu ERC-20 {#erc20-differences} + +ERC-223 behebt einige Einschränkungen von ERC-20 und führt eine neue Methode der Interaktion zwischen dem Token-Contract und einem Contract, der Token empfangen kann, ein. Es gibt einige Dinge, die mit ERC-223 möglich sind, nicht jedoch mit ERC-20: + +- Verarbeitung von Token-Übertragungen auf der Empfängerseite: Empfänger können erkennen, dass ein ERC-223-Token eingezahlt wird. +- Ablehnung falsch gesendeter Token: Wenn ein Nutzer ERC-223-Token an einen Contract sendet, der keine Token empfangen soll, kann der Contract die Transaktion ablehnen und so Token-Verluste verhindern. +- Metadaten in Übertragungen: ERC-223-Token können Metadaten enthalten, wodurch beliebige Informationen an Token-Transaktionen angehängt werden können. + +## Voraussetzungen {#prerequisites} + +- [Konten](/developers/docs/accounts) +- [Smart Contracts](/developers/docs/smart-contracts/) +- [Token-Standards](/developers/docs/standards/tokens/) +- [ERC-20](/developers/docs/standards/tokens/erc-20/) + +## Hauptteil {#body} + +ERC-223 ist ein Token-Standard, der eine Programmierschnittstelle (API) für Token innerhalb von Smart Contracts implementiert. Zudem legt er eine API für Contracts fest, die ERC-223-Tokens empfangen sollen. Contracts, die die ERC-223-Empfänger-API nicht unterstützen, können keine ERC-223-Token empfangen, wodurch Nutzerfehler vermieden werden. + +Ein Smart Contract kann als ERC-223-kompatibler Token-Contract bezeichnet werden, wenn er die folgenden Methoden und Ereignisse implementiert. Nach der Bereitstellung ist er dafür verantwortlich, die erstellten Token auf Ethereum zu verwalten. + +Der Contract ist nicht verpflichtet, ausschließlich diese Funktionen zu enthalten; Entwickler:innen können beliebige weitere Funktionen aus anderen Token-Standards hinzufügen. Beispielsweise gehören die Funktionen `approve` und `transferFrom` nicht zum ERC-223-Standard, können jedoch bei Bedarf implementiert werden. + +Von [EIP-223](https://eips.ethereum.org/EIPS/eip-223): + +### Methoden {#methods} + +ERC-223-Token müssen die folgenden Methoden implementieren: + +```solidity +function name() public view returns (string) +function symbol() public view returns (string) +function decimals() public view returns (uint8) +function totalSupply() public view returns (uint256) +function balanceOf(address _owner) public view returns (uint256 balance) +function transfer(address _to, uint256 _value) public returns (bool success) +function transfer(address _to, uint256 _value, bytes calldata _data) public returns (bool success) +``` + +Ein Contract, der ERC-223-Token empfangen soll, muss die folgende Methode implementieren: + +```solidity +function tokenReceived(address _from, uint _value, bytes calldata _data) +``` + +Wenn ERC-223-Token an einen Contract gesendet werden, der die Funktion `tokenReceived(..)` nicht implementiert, muss die Übertragung fehlschlagen und die Token dürfen nicht vom Guthaben des Absenders abgebucht werden. + +### Ereignisse {#events} + +```solidity +event Transfer(address indexed _from, address indexed _to, uint256 _value, bytes calldata _data) +``` + +### Beispiele {#examples} + +Die API des ERC-223-Tokens ist ähnlich der von ERC-20, sodass es aus Sicht der UI-Entwicklung keinen Unterschied gibt. Die einzige Ausnahme ist hier, dass ERC-223-Token möglicherweise keine `approve` + `transferFrom`-Funktionen haben, da diese für diesen Standard optional sind. + +#### Solidity-Beispiele {#solidity-example} + +Das folgende Beispiel veranschaulicht, wie ein einfacher ERC-223-Token-Contract funktioniert: + +```solidity +pragma solidity ^0.8.19; +abstract contract IERC223Recipient { + function tokenReceived(address _from, uint _value, bytes memory _data) public virtual; +} +contract VeryBasicERC223Token { + event Transfer(address indexed from, address indexed to, uint value, bytes data); + string private _name; + string private _symbol; + uint8 private _decimals; + uint256 private _totalSupply; + mapping(address => uint256) private balances; + function name() public view returns (string memory) { return _name; } + function symbol() public view returns (string memory) {return _symbol; } + function decimals() public view returns (uint8) { return _decimals; } + function totalSupply() public view returns (uint256) { return _totalSupply; } + function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; } + function isContract(address account) internal view returns (bool) { + uint256 size; + assembly { size := extcodesize(account) } + return size > 0; + } + function transfer(address _to, uint _value, bytes calldata _data) public returns (bool success){ + balances[msg.sender] = balances[msg.sender] - _value; + balances[_to] = balances[_to] + _value; + if(isContract(_to)) { + IERC223Recipient(_to).tokenReceived(msg.sender, _value, _data); + } + emit Transfer(msg.sender, _to, _value, _data); + return true; + } + function transfer(address _to, uint _value) public returns (bool success){ + bytes memory _empty = hex"00000000"; + balances[msg.sender] = balances[msg.sender] - _value; + balances[_to] = balances[_to] + _value; + if(isContract(_to)) { + IERC223Recipient(_to).tokenReceived(msg.sender, _value, _empty); + } + emit Transfer(msg.sender, _to, _value, _empty); + return true; + } +} +``` + +Nun soll ein anderer Contract Einzahlungen von `tokenA` annehmen, vorausgesetzt, tokenA ist ein ERC-223-Token. Der Contract darf nur tokenA annehmen und alle anderen Token ablehnen. Wenn der Contract tokenA empfängt, muss er ein `Deposit()`-Ereignis auslösen und den Wert der internen Variable `deposits` erhöhen. + +Hier ist der Code: + +```solidity +contract RecipientContract is IERC223Recipient { + event Deposit(address whoSentTheTokens); + uint256 deposits = 0; + address tokenA; // Der einzige Token, den wir akzeptieren wollen. + function tokenReceived(address _from, uint _value, bytes memory _data) public override + { + // Es ist wichtig zu verstehen, dass innerhalb dieser Funktion + // msg.sender die Adresse des Tokens ist, der empfangen wird, + // msg.value immer 0 ist, da der Token-Contract in den meisten Fällen keinen Ether besitzt oder sendet, + // _from der Absender der Token-Übertragung ist, + // _value die Menge der eingezahlten Token ist. + require(msg.sender == tokenA); + deposits += _value; + emit Deposit(_from); + } +} +``` + +## Häufig gestellte Fragen {#faq} + +### Was passiert, wenn wir tokenB an den Contract senden? {#sending-tokens} + +Die Transaktion wird fehlschlagen, und die Übertragung der Token wird nicht stattfinden. Die Token werden an die Adresse des Absenders zurückgegeben. + +### Wie können wir eine Einzahlung an diesen Contract tätigen? {#contract-deposits} + +Rufen Sie die Funktion `transfer(address,uint256)` oder `transfer(address,uint256,bytes)` des ERC-223-Tokens auf und geben Sie dabei die Adresse des `RecipientContract` an. + +### Was geschieht, wenn wir einen ERC-20-Token an diesen Contract überweisen? {#erc-20-transfers} + +Wenn ein ERC-20-Token an den `RecipientContract` gesendet wird, werden die Token zwar übertragen, die Übertragung wird jedoch nicht erkannt (es wird kein `Deposit()`-Event ausgelöst und der Einzahlungswert ändert sich nicht). Unerwünschte ERC-20-Einzahlungen können nicht gefiltert oder verhindert werden. + +### Was, wenn wir nach Abschluss der Token-Einzahlung eine bestimmte Funktion ausführen möchten? {#function-execution} + +Dafür gibt es mehrere Möglichkeiten. In diesem Beispiel folgen wir der Methode, die ERC-223-Übertragungen mit Ether-Übertragungen identisch macht: + +```solidity +contract RecipientContract is IERC223Recipient { + event Foo(); + event Bar(uint256 someNumber); + address tokenA; // Der einzige Token, den wir akzeptieren wollen. + function tokenReceived(address _from, uint _value, bytes memory _data) public override + { + require(msg.sender == tokenA); + address(this).call(_data); // Eingehende Transaktion verarbeiten und einen nachfolgenden Funktionsaufruf durchführen. + } + function foo() public + { + emit Foo(); + } + function bar(uint256 _someNumber) public + { + emit Bar(_someNumber); + } +} +``` + +Wenn der `RecipientContract` einen ERC-223-Token empfängt, führt der Contract eine Funktion aus, die als `_data`-Parameter der Token-Transaktion kodiert ist, genauso wie Ether-Transaktionen Funktionsaufrufe als Transaktions-`data` kodieren. Lesen Sie [das Datenfeld](/developers/docs/transactions/#the-data-field) für weitere Informationen. + +Im obigen Beispiel muss ein ERC-223-Token mit der Funktion `transfer(address,uin256,bytes calldata _data)` an die Adresse des `RecipientContract` gesendet werden. Wenn der data-Parameter den Wert `0xc2985578` (die Signatur der Funktion `foo()`) enthält, wird die Funktion `foo()` nach dem Empfang der Token-Einzahlung aufgerufen und das Ereignis `Foo()` ausgelöst. + +Parameter können ebenfalls im `data`-Feld der Token-Überweisung kodiert werden. Beispielsweise lässt sich die Funktion `bar()` mit dem Wert 12345 für den Parameter `_someNumber` aufrufen. In diesem Fall muss `data` den Wert `0x0423a13200000000000000000000000000000000000000000000000000000000000004d2` haben, wobei `0x0423a132` die Signatur der `bar(uint256)`-Funktion ist und `00000000000000000000000000000000000000000000000000000000000004d2` 12345 als uint256 darstellt. + +## Einschränkungen {#limitations} + +Obwohl ERC-223 mehrere Probleme des ERC-20-Standards behebt, hat er auch seine eigenen Einschränkungen: + +- Verbreitung und Kompatibilität: ERC-223 ist noch nicht weit verbreitet, was seine Kompatibilität mit bestehenden Tools und Plattformen einschränken kann. +- Abwärtskompatibilität: ERC-223 ist nicht abwärtskompatibel zu ERC-20, was bedeutet, dass bestehende ERC-20-Contracts und -Tools ohne Änderungen nicht mit ERC-223-Token funktionieren. +- Gaskosten: Die zusätzlichen Überprüfungen und Funktionalitäten bei ERC-223-Übertragungen können im Vergleich zu ERC-20-Transaktionen zu höheren Gaskosten führen. + +## Weiterführende Lektüre {#further-reading} + +- [EIP-223: ERC-223 Token-Standard](https://eips.ethereum.org/EIPS/eip-223) +- [Ursprünglicher ERC-223-Vorschlag](https://github.com/ethereum/eips/issues/223) diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-4626/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-4626/index.md new file mode 100644 index 00000000000..8c201f22f71 --- /dev/null +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-4626/index.md @@ -0,0 +1,227 @@ +--- +title: "ERC-4626 Tokenisierter Tresor Standard " +description: Standard für Ertragstragende Gewölbe. +lang: de +--- + +## Einführung {#introduction} + +ERC-4626 ist ein Standard zur Optimierung und Vereinheitlichung der technischen Parameter von Ertragstragende bringenden Tresoren. Es bietet eine Standard-API für tokenisierte, Ertragstragende Tresore, die Anteile eines einzelnen zugrunde liegenden ERC-20-Tokens darstellen. ERC-4626 beschreibt außerdem eine optionale Erweiterung für tokenisierte Tresore unter Verwendung von ERC-20, die grundlegende Funktionen zum Einzahlen, Abheben von Token und Lesen von Guthaben bietet. + +**Die Rolle von ERC-4626 in Ertragstragende Tresoren** + +Kreditmärkte, Aggregatoren und Token mit intrinsischem Zinssatz helfen Benutzern, durch die Umsetzung verschiedener Strategien die beste Rendite für ihre Krypto-Token zu erzielen. Diese Strategien werden mit geringfügigen Abweichungen umgesetzt, was fehleranfällig sein oder eine Verschwendung von Entwicklungsressourcen bedeuten kann. + +ERC-4626 in Ertragstragende Tresoren wird den Integrationsaufwand verringern und den Zugriff auf Erträge in verschiedenen Anwendungen mit geringem Spezialaufwand der Entwickler freigeben, indem konsistent und robustere Implementierungsmuster erstellt werden. + +Der ERC-4626-Token wird vollständig in [EIP-4626](https://eips.ethereum.org/EIPS/eip-4626) beschrieben. + +**Asynchrone Gewölbe Verlängerung (ERC-7540)** + +ERC-4626 ist für atomare Einzahlungen und Rücknahmen bis zu einem bestimmten Limit optimiert. Wenn das Limit erreicht ist, können keine neuen Einzahlungen oder Rücknahmen mehr vorgenommen werden. Diese Einschränkung funktioniert nicht gut für Smart-Contract-Systeme mit asynchronen Aktionen oder Verzögerungen als Voraussetzung für die Interaktion mit dem Vault (z. B. Protokolle für Real-World-Assets, Protokolle für unterbesicherte Kredite, kettenübergreifende Kreditprotokolle, liquide Staking-Token oder Versicherungssicherheitsmodule). + +ERC-7540 erweitert den Nutzen von ERC-4626 Gewölbe für asynchrone Anwendungsfälle. Die bestehende Vault-Schnittstelle (`deposit`/`withdraw`/`mint`/`redeem`) wird vollständig genutzt, um asynchrone Anfragen zu beanspruchen. + +Die ERC-7540-Erweiterung wird vollständig in [ERC-7540](https://eips.ethereum.org/EIPS/eip-7540) beschrieben. + +**Multi Asset Gewölbe Erweiterung (ERC-7575)** + +Ein fehlender Anwendungsfall, der von ERC-4626 nicht unterstützt wird, sind Tresore mit mehreren Vermögenswerten oder Einstiegspunkten wie Liquiditätsanbieter-Token (LP). Diese sind im Allgemeinen unhandlich oder nicht konform, da ERC-4626 selbst ein ERC-20 sein muss. + +ERC-7575 fügt Unterstützung für Gewölbe mit mehreren Assets hinzu, indem die ERC-20-Token-Implementierung aus der ERC-4626-Implementierung ausgelagert wird. + +Die ERC-7575-Erweiterung wird vollständig in [ERC-7575](https://eips.ethereum.org/EIPS/eip-7575) beschrieben. + +## Voraussetzungen {#prerequisites} + +Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [Token-Standards](/developers/docs/standards/tokens/) und [ERC-20](/developers/docs/standards/tokens/erc-20/) zu informieren. + +## ERC-4626 Funktionen und Merkmale: {#body} + +### Methoden {#methods} + +#### asset {#asset} + +```solidity +function asset() public view returns (address assetTokenAddress) +``` + +Diese Funktion gibt die Adresse des zugrunde liegenden Tokens zurück, der für den Tresor zum Buchen, Einzahlen und Abheben verwendet wird. + +#### totalAssets {#totalassets} + +```solidity +function totalAssets() public view returns (uint256) +``` + +Diese Funktion gibt den Gesamtbetrag der vom Tresor gehaltenen Basiswerte zurück. + +#### convertToShares {#convertoshares} + +```solidity +function convertToShares(uint256 assets) public view returns (uint256 shares) +``` + +Diese Funktion gibt die Anzahl der `shares` zurück, die vom Vault für die bereitgestellte Menge an `assets` ausgetauscht würden. + +#### convertToAssets {#convertoassets} + +```solidity +function convertToAssets(uint256 shares) public view returns (uint256 assets) +``` + +Diese Funktion gibt die Menge der `assets` zurück, die vom Vault für die bereitgestellte Anzahl an `shares` ausgetauscht würden. + +#### maxDeposit {#maxdeposit} + +```solidity +function maxDeposit(address receiver) public view returns (uint256 maxAssets) +``` + +Diese Funktion gibt die maximale Menge an zugrunde liegenden Assets zurück, die in einem einzigen [`deposit`](#deposit)-Aufruf eingezahlt werden kann, wobei die Anteile für den `receiver` geprägt werden. + +#### previewDeposit {#previewdeposit} + +```solidity +function previewDeposit(uint256 assets) public view returns (uint256 shares) +``` + +Mit dieser Funktion können Benutzer die Auswirkungen ihrer Einzahlung auf den aktuellen Block simulieren. + +#### deposit {#deposit} + +```solidity +function deposit(uint256 assets, address receiver) public returns (uint256 shares) +``` + +Diese Funktion hinterlegt `assets` von zugrunde liegenden Token im Vault und überträgt das Eigentum an `shares` an den `receiver`. + +#### maxMint {#maxmint} + +```solidity +function maxMint(address receiver) public view returns (uint256 maxShares) +``` + +Diese Funktion gibt die maximale Anzahl an `shares` zurück, die in einem einzigen [`mint`](#mint)-Aufruf geprägt werden können, wobei die Anteile für den `receiver` geprägt werden. + +#### previewMint {#previewmint} + +```solidity +function previewMint(uint256 shares) public view returns (uint256 assets) +``` + +Mit dieser Funktion können Benutzer die Auswirkungen ihrer Münze auf den aktuellen Block simulieren. + +#### mint {#mint} + +```solidity +function mint(uint256 shares, address receiver) public returns (uint256 assets) +``` + +Diese Funktion prägt genau `shares` Vault-Anteile für den `receiver`, indem `assets` von zugrunde liegenden Token hinterlegt werden. + +#### maxWithdraw {#maxwithdraw} + +```solidity +function maxWithdraw(address owner) public view returns (uint256 maxAssets) +``` + +Diese Funktion gibt die maximale Menge an zugrunde liegenden Assets zurück, die mit einem einzigen [`withdraw`](#withdraw)-Aufruf vom Guthaben des `owner` abgehoben werden kann. + +#### previewWithdraw {#previewwithdraw} + +```solidity +function previewWithdraw(uint256 assets) public view returns (uint256 shares) +``` + +Mit dieser Funktion können Benutzer die Auswirkungen ihrer Abhebung im aktuellen Block simulieren. + +#### withdraw {#withdraw} + +```solidity +function withdraw(uint256 assets, address receiver, address owner) public returns (uint256 shares) +``` + +Diese Funktion verbrennt `shares` vom `owner` und sendet genau `assets` Token vom Vault an den `receiver`. + +#### maxRedeem {#maxredeem} + +```solidity +function maxRedeem(address owner) public view returns (uint256 maxShares) +``` + +Diese Funktion gibt die maximale Anzahl an `shares` zurück, die durch einen [`redeem`](#redeem)-Aufruf vom Guthaben des `owner` eingelöst werden können. + +#### previewRedeem {#previewredeem} + +```solidity +function previewRedeem(uint256 shares) public view returns (uint256 assets) +``` + +Mit dieser Funktion können Benutzer die Auswirkungen ihrer Einlösung im aktuellen Block simulieren. + +#### redeem {#redeem} + +```solidity +function redeem(uint256 shares, address receiver, address owner) public returns (uint256 assets) +``` + +Diese Funktion löst eine bestimmte Anzahl von `shares` vom `owner` ein und sendet `assets` des zugrunde liegenden Tokens vom Vault an den `receiver`. + +#### totalSupply {#totalsupply} + +```solidity +function totalSupply() public view returns (uint256) +``` + +Gibt die Gesamtzahl der im Umlauf befindlichen, nicht eingelösten Aktie zurück. + +#### balanceOf {#balanceof} + +```solidity +function balanceOf(address owner) public view returns (uint256) +``` + +Gibt die Gesamtmenge der Vault-Anteile zurück, die der `owner` aktuell besitzt. + +### Übersicht der Schnittstelle {#mapOfTheInterface} + +![Übersicht der ERC-4626-Schnittstelle](./map-of-erc-4626.png) + +### Ereignisse {#events} + +#### Einzahlungsereignis + +**MUSS** ausgegeben werden, wenn Token über die Methoden [`mint`](#mint) und [`deposit`](#deposit) in den Vault eingezahlt werden. + +```solidity +event Deposit( + address indexed sender, + address indexed owner, + uint256 assets, + uint256 shares +) +``` + +Wobei `sender` der Benutzer ist, der `assets` gegen `shares` getauscht und diese `shares` an den `owner` übertragen hat. + +#### Ereignis zurückziehen + +**MUSS** ausgegeben werden, wenn Anteile von einem Einzahler über die Methoden [`redeem`](#redeem) oder [`withdraw`](#withdraw) aus dem Vault abgehoben werden. + +```solidity +event Withdraw( + address indexed sender, + address indexed receiver, + address indexed owner, + uint256 assets, + uint256 shares +) +``` + +Wobei `sender` der Benutzer ist, der die Abhebung ausgelöst und die dem `owner` gehörenden `shares` gegen `assets` getauscht hat. `receiver` ist der Benutzer, der die abgehobenen `assets` erhalten hat. + +## Weiterführende Lektüre {#further-reading} + +- [EIP-4626: Standard für tokenisierte Vaults](https://eips.ethereum.org/EIPS/eip-4626) +- [ERC-4626: GitHub-Repo](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-721/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-721/index.md index e2134698e1e..3c99b282389 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/erc-721/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-721/index.md @@ -1,6 +1,6 @@ --- title: ERC-721 Nicht-fungibler Token-Standard -description: +description: Erfahren Sie mehr über ERC-721, den Standard für nicht fungible Token (NFTs), die einzigartige digitale Assets auf Ethereum darstellen. lang: de --- @@ -8,13 +8,20 @@ lang: de **Was ist ein nicht-fungibler Token?** -Ein nicht-fungibler Token (NFT) wird verwendet, um etwas oder jemanden auf eine einzigartige Weise zu identifizieren. Diese Art von Token ist perfekt, um auf Plattformen verwendet zu werden, die Sammelartikel anbieten, Zugang zu Schlüsseln, Lotteriekarten, nummerierten Plätzen für Konzerte und Sportspiele, etc. Diese spezielle Art von Token hat erstaunliche Möglichkeiten, so dass er einen angemessenen Standard verdient. Der ERC-721 hat dies gelöst! +Ein nicht-fungibler Token (NFT) wird verwendet, um etwas oder jemanden auf eine einzigartige Weise zu identifizieren. Diese Art von Token ist perfekt, um +auf Plattformen verwendet zu werden, die Sammelartikel anbieten, Zugang zu Schlüsseln, Lotteriekarten, nummerierten Plätzen für Konzerte und +Sportspiele, etc. Diese spezielle Art von Token hat erstaunliche Möglichkeiten, so dass er einen angemessenen Standard verdient. Der ERC-721 +hat dies gelöst! **Was ist ERC-721?** -Der ERC-721 führt eine Norm für NFT ein, mit anderen Worten, diese Art von Token ist einzigartig und kann einen anderen Wert haben als ein anderer Token des gleichen Smart Contract, vielleicht wegen seines Alters, seiner Seltenheit oder auch so etwas wie sein visuelles Bild. Moment mal, visuell? +Der ERC-721 führt eine Norm für NFT ein, mit anderen Worten, diese Art von Token ist einzigartig und kann einen anderen Wert haben +als ein anderer Token des gleichen Smart Contract, vielleicht wegen seines Alters, seiner Seltenheit oder auch so etwas wie sein visuelles Bild. +Moment mal, visuell? -Ja! Alle NFTs haben eine `uint256` Variable namens `TokenId` und bei jedem ERC-721 Contract muss das Paar aus `Kontaktadresse uint256 TokenId` global eindeutig sein. Eine dApp kann einen „Konverter" haben, der die `TokenId` als Eingabe verwendet und ein Bild von etwas Coolem ausgibt, wie Zombies, Waffen, Fertigkeiten oder Krypto-Kitties! +Ja! Alle NFTs haben eine `uint256`-Variable namens `tokenId`. Daher muss für jeden ERC-721-Vertrag das Paar +`Vertragsadresse, uint256 tokenId` global einzigartig sein. Eine Dapp kann jedoch einen "Konverter" haben, der +die `tokenId` als Eingabe verwendet und ein Bild von etwas Coolem ausgibt, wie Zombies, Waffen, Fähigkeiten oder fantastischen Kätzchen! ## Voraussetzungen {#prerequisites} @@ -24,11 +31,15 @@ Ja! Alle NFTs haben eine `uint256` Variable namens `TokenId` und bei jedem ERC-7 ## Hauptteil {#body} -Der ERC-721 (Ethereum Request for Comments 721), im Januar 2018 von William Entriken, Dieter Shirley, Jacob Evans und Nastassia Sachs vorgeschlagen, ist ein nicht-fungibler Token-Standard, der eine API für Tokens innerhalb von Smart Contracts implementiert. +Der ERC-721 (Ethereum Request for Comments 721), im Januar 2018 von William Entriken, Dieter Shirley, Jacob Evans und +Nastassia Sachs vorgeschlagen, ist ein nicht-fungibler Token-Standard, der eine API für Tokens innerhalb von Smart Contracts implementiert. -Er bietet Funktionen wie die Übertragung von Token von einem Konto auf ein anderes, um den aktuellen Token-Saldo eines Kontos, den Eigentümer eines spezifischen Tokens sowie den Gesamtbestand der im Netzwerk verfügbaren Token abzurufen. Daneben gibt es auch einige andere Funktionalitäten wie zum Beispiel zu genehmigen, dass eine gewisse Menge an Token von einem Konto von einem Drittkonto verschoben werden kann. +Er bietet Funktionen wie die Übertragung von Token von einem Konto auf ein anderes, um den aktuellen Token-Saldo eines Kontos, den Eigentümer eines spezifischen Tokens sowie den Gesamtbestand der im Netzwerk verfügbaren Token abzurufen. +Daneben gibt es auch einige andere Funktionalitäten wie zum Beispiel zu genehmigen, dass eine gewisse Menge an Token von einem Konto +von einem Drittkonto verschoben werden kann. -Wenn ein Smart Contract folgende Methoden und Ereignisse implementiert, kann er als ERC-721 nicht-fungibler Token-Vertrag bezeichnet werden. Einmal implementiert, werden mit ihm die erstellten Token auf Ethereum verfolgt. +Wenn ein Smart Contract folgende Methoden und Ereignisse implementiert, kann er als ERC-721 nicht-fungibler Token-Vertrag +bezeichnet werden. Einmal implementiert, werden mit ihm die erstellten Token auf Ethereum verfolgt. Aus [EIP-721](https://eips.ethereum.org/EIPS/eip-721): @@ -46,7 +57,7 @@ Aus [EIP-721](https://eips.ethereum.org/EIPS/eip-721): function isApprovedForAll(address _owner, address _operator) external view returns (bool); ``` -### Events {#events} +### Ereignisse {#events} ```solidity event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); @@ -56,11 +67,13 @@ Aus [EIP-721](https://eips.ethereum.org/EIPS/eip-721): ### Beispiele {#web3py-example} -Lassen Sie uns sehen, wie wichtig ein Standard ist, um es uns einfach zu machen, jeden ERC-721 Token-Vertrag auf Ethereum zu inspizieren. Wir benötigen nur das Application Binary Interface (ABI) des Vertrags, um eine Schnittstelle zu jedem ERC-721 Token zu erstellen. Wie Sie unten sehen können, werden wir ein vereinfachtes ABI verwenden, um es zu einem Beispiel mit geringer Reibung zu machen. +Lassen Sie uns sehen, wie wichtig ein Standard ist, um es uns einfach zu machen, jeden ERC-721 Token-Vertrag auf Ethereum zu inspizieren. +Wir benötigen nur das Application Binary Interface (ABI) des Vertrags, um eine Schnittstelle zu jedem ERC-721 Token zu erstellen. Wie Sie +unten sehen können, werden wir ein vereinfachtes ABI verwenden, um es zu einem Beispiel mit geringer Reibung zu machen. -#### Web3.py Beispiel {#web3py-example} +#### Web3.py-Beispiel {#web3py-example} -Stellen Sie zuerst sicher, dass Sie [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation) Python-Bibliothek installiert haben: +Stellen Sie zunächst sicher, dass Sie die Python-Bibliothek [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation) installiert haben: ``` pip install web3 @@ -73,12 +86,12 @@ from web3._utils.events import get_event_data w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com")) -ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKitties Contract +ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKitties-Vertrag -acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties Sales Auction +acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties-Verkaufsauktion -# This is a simplified Contract Application Binary Interface (ABI) of an ERC-721 NFT Contract. -# Es werden nur folgende Methoden betrachtet: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply() +# Dies ist eine vereinfachte Contract Application Binary Interface (ABI) eines ERC-721-NFT-Vertrags. +# Es werden nur die folgenden Methoden offengelegt: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply() simplified_abi = [ { 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}], @@ -127,7 +140,7 @@ ck_extra_abi = [ } ] -ck_contract = w3.eth.contract(address=w3.toChecksumAddress(ck_token_addr), abi=simplified_abi+ck_extra_abi) +ck_contract = w3.eth.contract(address=w3.to_checksum_address(ck_token_addr), abi=simplified_abi+ck_extra_abi) name = ck_contract.functions.name().call() symbol = ck_contract.functions.symbol().call() kitties_auctions = ck_contract.functions.balanceOf(acc_address).call() @@ -136,7 +149,7 @@ print(f"{name} [{symbol}] NFTs in Auctions: {kitties_auctions}") pregnant_kitties = ck_contract.functions.pregnantKitties().call() print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}") -# Nutzung des Transfer Event ABI um Informationen über übertragene Kitties zu erhalten. +# Die Transfer-Event-ABI verwenden, um Informationen über übertragene Kitties zu erhalten. tx_event_abi = { 'anonymous': False, 'inputs': [ @@ -147,34 +160,34 @@ tx_event_abi = { 'type': 'event' } -# We need the event's signature to filter the logs -event_signature = w3.sha3(text="Transfer(address,address,uint256)").hex() +# Wir benötigen die Signatur des Ereignisses, um die Protokolle zu filtern +event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex() -logs = w3.eth.getLogs({ - "fromBlock": w3.eth.blockNumber - 120, - "address": w3.toChecksumAddress(ck_token_addr), +logs = w3.eth.get_logs({ + "fromBlock": w3.eth.block_number - 120, + "address": w3.to_checksum_address(ck_token_addr), "topics": [event_signature] }) -# Notes: -# - 120 blocks is the max range for CloudFlare Provider -# - If you didn't find any Transfer event you can also try to get a tokenId at: +# Hinweise: +# - Erhöhen Sie die Anzahl der Blöcke von 120, wenn kein Transfer-Ereignis zurückgegeben wird. +# - Wenn Sie kein Transfer-Ereignis gefunden haben, können Sie auch versuchen, eine tokenId unter folgendem Link zu erhalten: # https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events -# Click to expand the event's logs and copy its "tokenId" argument - +# Klicken Sie, um die Protokolle des Ereignisses zu erweitern, und kopieren Sie das Argument „tokenId“ recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs] -kitty_id = recent_tx[0]['tokenId'] # Paste the "tokenId" here from the link above -is_pregnant = ck_contract.functions.isPregnant(kitty_id).call() -print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}") +if recent_tx: + kitty_id = recent_tx[0]['tokenId'] # Fügen Sie die „tokenId“ von dem obigen Link hier ein + is_pregnant = ck_contract.functions.isPregnant(kitty_id).call() + print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}") ``` Der Krypto-Kitties-Vertrag hat neben den Standard-Events noch einige weitere interessante Events. -Lassen Sie uns zwei dieser Events genauer ansehen, `Schwanger` und `Geburt`. +Sehen wir uns zwei von ihnen an, `Pregnant` und `Birth`. ```python -# Verwendung des Pregnant und Birth Events ABI um Informationen über neue Kitties zu erhalten. +# Verwendung der ABIs der Ereignisse „Pregnant“ und „Birth“, um Informationen über neue Kitties zu erhalten. ck_extra_events_abi = [ { 'anonymous': False, @@ -198,27 +211,27 @@ ck_extra_events_abi = [ 'type': 'event' }] -# We need the event's signature to filter the logs +# Wir benötigen die Signatur des Ereignisses, um die Protokolle zu filtern ck_event_signatures = [ - w3.sha3(text="Pregnant(address,uint256,uint256,uint256)").hex(), - w3.sha3(text="Birth(address,uint256,uint256,uint256,uint256)").hex(), + w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(), + w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(), ] -# Here is a Pregnant Event: +# Hier ist ein „Pregnant“-Ereignis: # - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog -pregnant_logs = w3.eth.getLogs({ - "fromBlock": w3.eth.blockNumber - 120, - "address": w3.toChecksumAddress(ck_token_addr), +pregnant_logs = w3.eth.get_logs({ + "fromBlock": w3.eth.block_number - 120, + "address": w3.to_checksum_address(ck_token_addr), "topics": [ck_event_signatures[0]] }) recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs] -# Here is a Birth Event: +# Hier ist ein „Birth“-Ereignis: # - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a -birth_logs = w3.eth.getLogs({ - "fromBlock": w3.eth.blockNumber - 120, - "address": w3.toChecksumAddress(ck_token_addr), +birth_logs = w3.eth.get_logs({ + "fromBlock": w3.eth.block_number - 120, + "address": w3.to_checksum_address(ck_token_addr), "topics": [ck_event_signatures[1]] }) @@ -227,17 +240,24 @@ recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] f ## Beliebte NFTs {#popular-nfts} -- [Etherscan NFT Tracker](https://etherscan.io/tokens-nft) Liste der Top-NFT auf Ethereum, nach Transfervolumen sortiert. -- [Krypto-Kitties](https://www.cryptokitties.co/) ist ein Spiel mit Fokus auf das Züchten und Sammeln liebenswerter Kreaturen, die wir Krypto-Kitties nennen. -- [Sorare](https://sorare.com/) ist ein Fantasie-Fußballspiel, bei dem es darum geht, limitierte Karten zu sammeln, Ihre Teams zu verwalten und gegeneinander anzutreten, um Preise zu gewinnen. -- [Der Ethereum Namen-Service (ENS)](https://ens.domains/) bietet einen sicheren & dezentralen Weg, Informationen mit Hilfe von verständlichen Namen auf und neben der Blockchains zu adressieren. -- [Unstoppable Domains](https://unstoppabledomains.com/) ist ein Unternehmen aus San Francisco, welches Domains auf Blockchains baut. Blockchain-Domains ersetzen Krypto-Adressen mit verständlichen und lesbaren Namen, um zensurresistente Websites zu ermöglichen. -- [Gods Unchained Cards](https://godsunchained.com/) ist ein TCG auf der Ethereum-Blockchain, welches NFTs verwendet, um In-Game-Assets als Eigentum zu verleihen. -- [Bored Ape Yacht Club](https://boredapeyachtclub.com) ist eine Sammlung von 10.000 einzigartigen NFTs, die nicht nur ein nachweislich seltenes Kunstwerk sind, sondern auch als Mitgliedschaftsmarke für den Club fungieren und den Mitgliedern Vergünstigungen und Vorteile bieten, die sich im Laufe der Zeit aufgrund der Bemühungen der Gemeinschaft erhöhen. - -## Weiterführende Informationen {#further-reading} - -- [EIP-721: ERC-721 Nicht-Fungibler Token-Standard](https://eips.ethereum.org/EIPS/eip-721) -- [OpenZeppelin - ERC-721 Dokumentation](https://docs.openzeppelin.com/contracts/3.x/erc721) -- [OpenZeppelin - ERC-721 Implementierung](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) -- [Alchemy NFT API](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) +- Der [Etherscan NFT Tracker](https://etherscan.io/nft-top-contracts) listet die Top-NFTs auf Ethereum nach Übertragungsvolumen auf. +- [CryptoKitties](https://www.cryptokitties.co/) ist ein Spiel, das sich um züchtbare, sammelbare und überaus entzückende + Kreaturen dreht, die wir CryptoKitties nennen. +- [Sorare](https://sorare.com/) ist ein globales Fantasy-Football-Spiel, bei dem Sie Sammlerstücke in limitierter Auflage sammeln, + Ihre Teams verwalten und um Preise wetteifern können. +- [Der Ethereum Name Service (ENS)](https://ens.domains/) bietet eine sichere und dezentralisierte Möglichkeit, Ressourcen sowohl + on-chain als auch off-chain mithilfe einfacher, für Menschen lesbarer Namen zu adressieren. +- [POAP](https://poap.xyz) verteilt kostenlose NFTs an Personen, die an Veranstaltungen teilnehmen oder bestimmte Aktionen durchführen. POAPs können kostenlos erstellt und verteilt werden. +- [Unstoppable Domains](https://unstoppabledomains.com/) ist ein in San Francisco ansässiges Unternehmen, das Domains auf + Blockchains erstellt. Blockchain-Domains ersetzen Kryptowährungsadressen durch für Menschen lesbare Namen und können verwendet werden, um + zensurresistente Websites zu ermöglichen. +- [Gods Unchained Cards](https://godsunchained.com/) ist ein TCG auf der Ethereum-Blockchain, das NFTs verwendet, um echtes Eigentum + an In-Game-Assets zu ermöglichen. +- [Bored Ape Yacht Club](https://boredapeyachtclub.com) ist eine Sammlung von 10.000 einzigartigen NFTs. Diese sind nicht nur nachweislich seltene Kunstwerke, sondern fungieren auch als Mitgliedschafts-Token für den Club, der seinen Mitgliedern Vergünstigungen und Vorteile bietet, die im Laufe der Zeit durch die Bemühungen der Community zunehmen. + +## Weiterführende Lektüre {#further-reading} + +- [EIP-721: ERC-721-Standard für nicht-fungible Token](https://eips.ethereum.org/EIPS/eip-721) +- [OpenZeppelin – ERC-721-Dokumentation](https://docs.openzeppelin.com/contracts/3.x/erc721) +- [OpenZeppelin – ERC-721-Implementierung](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) +- [Alchemy NFT-API](https://www.alchemy.com/docs/reference/nft-api-quickstart) diff --git a/public/content/translations/de/developers/docs/standards/tokens/erc-777/index.md b/public/content/translations/de/developers/docs/standards/tokens/erc-777/index.md index 394e10a350f..f472596eeaf 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/erc-777/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/erc-777/index.md @@ -1,12 +1,16 @@ --- title: ERC-777 Token-Standard -description: +description: Erfahren Sie mehr über ERC-777, einen verbesserten fungiblen Token-Standard mit Hooks, obwohl aus Sicherheitsgründen ERC-20 empfohlen wird. lang: de --- -## Einführung? {#introduction} +## Warnung {#warning} -ERC-777 ist ein fungibler Token-Standard, der den vorhandenen [ERC-20](/developers/docs/standards/tokens/erc-20/) Standard verbessert. +**ERC-777 ist aufgrund seiner [Anfälligkeit für verschiedene Angriffsformen](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2620) nur schwer korrekt zu implementieren. Es wird empfohlen, stattdessen [ERC-20](/developers/docs/standards/tokens/erc-20/) zu verwenden.** Diese Seite bleibt als historisches Archiv erhalten. + +## Einführung? Einführung {#introduction} + +ERC-777 ist ein fungibler Token-Standard, der den bestehenden [ERC-20](/developers/docs/standards/tokens/erc-20/)-Standard verbessert. ## Voraussetzungen {#prerequisites} @@ -16,26 +20,26 @@ Um diese Seite besser zu verstehen, empfehlen wir Ihnen, sich zunächst über [E ERC-777 bietet die folgenden Verbesserungen gegenüber ERC-20. -### Haken {#hooks} +### Hooks {#hooks} Haken sind eine Funktion, die im Code eines Smart Contract beschrieben wird. Haken werden aufgerufen, wenn Token über den Vertrag gesendet oder empfangen werden. Dies ermöglicht einem Smart Contract, auf eingehende oder ausgehende Token zu reagieren. -Die Haken werden mit Hilfe des [ERC-1820](https://eips.ethereum.org/EIPS/eip-1820)-Standards registriert und entdeckt. +Die Hooks werden über den [ERC-1820](https://eips.ethereum.org/EIPS/eip-1820)-Standard registriert und erkannt. #### Warum sind Haken so großartig? {#why-are-hooks-great} -1. Hooks erlauben das Senden von Token zu einem Vertrag und die Benachrichtigung des Vertrags in einer einzigen Transaktion, im Gegensatz zu [ERC-20](https://eips.ethereum.org/EIPS/eip-20) erfordert dies einen Doppelaufruf, (`approve`/`transferFrom`) um dies zu erreichen. +1. Hooks ermöglichen es, Token an einen Vertrag zu senden und den Vertrag in einer einzigen Transaktion zu benachrichtigen, im Gegensatz zu [ERC-20](https://eips.ethereum.org/EIPS/eip-20), bei dem dafür ein doppelter Aufruf (`approve`/`transferFrom`) erforderlich ist. 2. Verträge, die keine Haken registriert haben, sind mit ERC-777 nicht kompatibel. Der sendende Vertrag bricht die Transaktion ab, wenn der empfangende Vertrag keinen Haken registriert hat. Dies verhindert versehentliche Übertragungen auf nicht-ERC-777 Smart Contracts. 3. Haken können Transaktionen ablehnen. ### Dezimalstellen {#decimals} -Der Standard löst auch die Verwirrung um `Dezimale`, die in ERC-20 verursacht wurde. Diese Klarheit verbessert die Erfahrung der Entwickler. +Der Standard löst auch die Verwirrung um `decimals`, die durch ERC-20 verursacht wurde. Diese Klarheit verbessert die Erfahrung der Entwickler. -### Rückwärtskompatibilität mit ERC-20 {#backwards-compatibility-with-erc-20} +### Abwärtskompatibilität mit ERC-20 {#backwards-compatibility-with-erc-20} ERC-777 Verträge können wie ERC-20 Verträge gehandhabt werden. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} [EIP-777: Token-Standard](https://eips.ethereum.org/EIPS/eip-777) diff --git a/public/content/translations/de/developers/docs/standards/tokens/index.md b/public/content/translations/de/developers/docs/standards/tokens/index.md index 86471f4aeb1..0415e4b8940 100644 --- a/public/content/translations/de/developers/docs/standards/tokens/index.md +++ b/public/content/translations/de/developers/docs/standards/tokens/index.md @@ -1,13 +1,15 @@ --- title: Token-Standards -description: +description: Erkunden Sie Ethereum Token Standards, einschließlich ERC-20, ERC-721 und ERC-1155 für fungible und nicht fungible Token. lang: de incomplete: true --- ## Einführung {#introduction} -Einer der vielen Entwicklungsstandards von Ethereum konzentriert sich auf Token-Schnittstellen. Diese Standards tragen dazu bei, dass Smart Contracts kombinierbar bleiben, so zum Beispiel sicherzustellen, wenn ein neues Projekt einen Token ausgibt, dass er mit den bestehenden dezentralen Börsen kompatibel bleibt. +Einer der vielen Entwicklungsstandards von Ethereum konzentriert sich auf Token-Schnittstellen. Diese Standards tragen dazu bei, dass Smart Contracts komponierbar bleiben, sodass, wenn ein neues Projekt einen Token ausgibt, dieser mit bestehenden dezentralisierten Börsen und Anwendungen kompatibel bleibt. + +Token-Standards definieren, wie sich Tokens im gesamten Ethereum-Ökosystem verhalten und interagieren. Sie erleichtern es Entwicklern, zu entwickeln, ohne das Rad neu erfinden zu müssen, und gewährleisten, dass Tokens nahtlos mit Wallets, Börsen und DeFi-Plattformen zusammenarbeiten. Ob im Gaming, in der Governance oder in anderen Anwendungsfällen, diese Standards sorgen für Konsistenz und machen Ethereum besser vernetzt. ## Voraussetzungen {#prerequisites} @@ -18,18 +20,22 @@ Einer der vielen Entwicklungsstandards von Ethereum konzentriert sich auf Token- Hier sind einige der beliebtesten Token-Standards auf Ethereum: -- [ERC-20](/developers/docs/standards/tokens/erc-20/) - Eine Standardschnittstelle für fungible (austauschbare) Token, wie z. B. Voting-Token, Staking-Token oder virtuelle Währungen. -- [ERC-721](/developers/docs/standards/tokens/erc-721/) - Eine Standardschnittstelle für nicht-fungible Token, wie eine Urkunde für ein Kunstwerk oder ein Song. -- [ERC-777](/developers/docs/standards/tokens/erc-777/) - ERC-777 ermöglicht es, zusätzliche Funktionen auf Token aufzusetzen, wie z. B. einen Mixer-Vertrag zur Verbesserung des Transaktionsschutzes oder eine Notfall-Wiederherstellungsfunktion für den Fall, dass Sie Ihre privaten Schlüssel verlieren. -- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - ERC-1155 ermöglicht einen effizienteren Handel und die Bündelung von Transaktionen und spart damit Kosten. Dieser Token-Standard ermöglicht die Erstellung sowohl von Utility-Token (wie $BNB oder $BAT) als auch von nicht-fungiblen Token wie CryptoPunks. +- [ERC-20](/developers/docs/standards/tokens/erc-20/) – Eine Standardschnittstelle für fungible (austauschbare) Tokens, wie Abstimmungstokens, Staking-Tokens oder virtuelle Währungen. + +### NFT-Standards {#nft-standards} + +- [ERC-721](/developers/docs/standards/tokens/erc-721/) – Eine Standardschnittstelle für nicht-fungible Tokens, wie eine Urkunde für ein Kunstwerk oder ein Lied. +- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) – ERC-1155 ermöglicht einen effizienteren Handel und die Bündelung von Transaktionen und spart damit Kosten. Dieser Token-Standard ermöglicht die Erstellung sowohl von Utility-Token (wie $BNB oder $BAT) als auch von nicht-fungiblen Token wie CryptoPunks. + +Die vollständige Liste der [ERC](https://eips.ethereum.org/erc)-Vorschläge. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -_Kennen Sie einen Community-Beitrag, der Ihnen geholfen hat? Editieren Sie diese Seite und füge Sie ihn hinzu!_ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ -## Ähnliche Tutorials {#related-tutorials} +## Verwandte Tutorials {#related-tutorials} -- [Token-Integration-Checkliste](/developers/tutorials/token-integration-checklist/) _– Eine Checkliste der Dinge, die bei der Interaktion mit Token berücksichtigt werden sollen._ -- [Deployment Ihres ersten Smart Contracts](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Eine Einführung in die Bereitstellung Ihres ersten Smart Contracts in einem Ethereum-Testnetzwerk._ -- [Übertragung und Freigabe von ERC20-Token aus einem Solidity-Smart-Contract](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _- Wie man einen Smart Contract verwendet, um mit einem Token unter Verwendung der Solidity-Sprache zu interagieren._ -- [Implementierung eines ERC721 Marktes [eine Anleitung]](/developers/tutorials/how-to-implement-an-erc721-market/) _– Wie man Token-Artikel dezentralisiert verkauft._ +- [Checkliste für die Token-Integration](/developers/tutorials/token-integration-checklist/) _– Eine Checkliste mit Dingen, die bei der Interaktion mit Tokens zu beachten sind._ +- [Den Smart Contract des ERC20-Tokens verstehen](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Eine Einführung in die Bereitstellung Ihres ersten Smart Contracts in einem Ethereum-Testnet._ +- [Übertragungen und Genehmigung von ERC20-Tokens aus einem Solidity-Smart-Contract](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _– Wie man einen Smart Contract verwendet, um mit einem Token mithilfe der Programmiersprache Solidity zu interagieren._ +- [Implementierung eines ERC721-Marktes [eine Anleitung]](/developers/tutorials/how-to-implement-an-erc721-market/) _– Wie man tokenisierte Artikel auf einer dezentralen Kleinanzeigenplattform zum Verkauf anbietet._ diff --git a/public/content/translations/de/developers/docs/storage/index.md b/public/content/translations/de/developers/docs/storage/index.md index 9dc977599d4..d954c7933f2 100644 --- a/public/content/translations/de/developers/docs/storage/index.md +++ b/public/content/translations/de/developers/docs/storage/index.md @@ -6,7 +6,7 @@ lang: de Im Gegensatz zu einem zentralisierten Server, der von einem einzelnen Unternehmen oder einer Organisation betrieben wird, bestehen dezantrale Speichersysteme aus einem Peer-to-Peer-Netzwerk, aufgebaut aus Nutzern, die einen Teil der gesamten Daten aufbewahren. Das macht das Speichersystem sehr robust. Diese können in Blockchain-basierten Anwendungen oder jedem anderen Peer-to-Peer Netzwerk sein. -Ethereum selbst kann als dezentrales Speichersystem genutzt werden und das wird es zum Speichern von Code als Smart Contracts auch. Doch Ethereum wurde nicht für größere Datenmengen konzipiert. Die Chain wächst ständig – aktuell umfasst die Ethereum-Chain ca. 500 GB bis 1TB ([je nach Client](https://etherscan.io/chartsync/chaindefault)) und jeder Node im Netzwerk muss in der Lage sein, all diese Daten zu speichern. Würde die Chain immer weiter expandieren (sagen wir mal 5 TB), dann wäre es nicht mehr möglich, dass alle Nodes weiter laufen. Außerdem würden die Kosten, eine solche Datenmenge für das Mainnet bereitzustellen, wegen der [Ressourcengebühren](/developers/docs/gas) unerschwinglich hoch sein. +Ethereum selbst kann als dezentrales Speichersystem genutzt werden und das wird es zum Speichern von Code als Smart Contracts auch. Doch Ethereum wurde nicht für größere Datenmengen konzipiert. Die Chain wächst ständig, aber zum Zeitpunkt der Erstellung dieses Artikels ist die Ethereum-Chain ca. 500 GB – 1 TB groß ([je nach Client](https://etherscan.io/chartsync/chaindefault)), und jeder Node im Netzwerk muss in der Lage sein, alle Daten zu speichern. Würde die Chain immer weiter expandieren (sagen wir mal 5 TB), dann wäre es nicht mehr möglich, dass alle Nodes weiter laufen. Außerdem wären die Kosten für die Bereitstellung dieser Datenmenge im Mainnet aufgrund von [Gas](/developers/docs/gas)-Gebühren unerschwinglich hoch. Aufgrund dieser Einschränkungen ist eine andere Chain oder Methode erforderlich, um große Datenmengen dezentral abzuspeichern. @@ -15,17 +15,17 @@ Bei dezentralen Speichersystemen (dStorage) gibt es ein paar Aspekte, die Sie be - Persistenzmechanismus/Anreizstruktur - Durchsetzung der Datenspeicherung - Dezentralität -- Konsensmechanismus +- Konsens -## Persistenzmechanismus/Anreizstruktur {#persistence-mechanism} +## Persistenzmechanismus / Anreizstruktur {#persistence-mechanism} ### Blockchain-basiert {#blockchain-based} Damit Daten für immer persistent sind, müssen wir uns einen Persistenzmechanismus zunutze machen. Auf Ethereum besteht der Mechanismus zur Persistenz darin, dass die gesamte Chain beim Betrieb eines Nodes berücksichtigt beziehungsweise heruntergeladen werden muss. Neue Daten werden am Ende der Kette angehängt und die Kette wächst weiter – jeder Node muss alle eingebetteten Daten replizieren. -Das wird als **Blockchain-basierte** Persistenz bezeichnet. +Dies wird als **blockchain-basierte** Persistenz bezeichnet. -Das Problem bei der Blockchain-basierten Persistenz ist, dass die Kette viel zu groß werden könnte, um alle Daten aufrechtzuerhalten und zu speichern (z. B. schätzen [viele Quellen](https://healthit.com.au/how-big-is-the-internet-and-how-do-we-measure-it/), dass das Internet über 40 Zetabyte Speicherkapazität benötigt). +Das Problem bei der Blockchain-basierten Persistenz ist, dass die Chain viel zu groß werden könnte, um alle Daten praktikabel zu verwalten und zu speichern (z. B. schätzen [viele Quellen](https://healthit.com.au/how-big-is-the-internet-and-how-do-we-measure-it/), dass das Internet über 40 Zettabyte Speicherkapazität benötigt). Die Blockchain benötigt außerdem auch eine Art Anreizstruktur. Bei der Blockchain-basierten Persistenz wird eine Zahlung an den Validator durchgeführt. Wenn Daten zur Blockchain hinzugefügt werden, werden die Validatoren für das Hinzufügen der Daten bezahlt. @@ -36,40 +36,40 @@ Plattformen mit Blockchain-basierter Persistenz: ### Vertragsbasiert {#contract-based} -**Vertragsbasierte** Persistenz ist dazu gedacht, dass Daten nicht von jedem Node repliziert und für immer gespeichert werden können, sondern durch vertragliche Vereinbarungen aufrechterhalten werden müssen. Das sind Vereinbarungen zwischen mehreren Nodes, die einander versprechen, bestimmte Daten für einen festgelegten Zeitraum verfügbar zu halten. Wenn die Vereinbarungen auslaufen, müssen sie beendet oder erneuert werden, um die Datenpersistenz zu garantieren. +Die **vertragsbasierte** Persistenz geht davon aus, dass Daten nicht von jedem Node repliziert und für immer gespeichert werden können, sondern stattdessen durch vertragliche Vereinbarungen aufrechterhalten werden müssen. Das sind Vereinbarungen zwischen mehreren Nodes, die einander versprechen, bestimmte Daten für einen festgelegten Zeitraum verfügbar zu halten. Wenn die Vereinbarungen auslaufen, müssen sie beendet oder erneuert werden, um die Datenpersistenz zu garantieren. -In den meisten Fällen werden nicht alle Daten in der Chain gespeichert, sondern nur der Hashwert der Position, an der sich die Daten in einer Chain befinden. So muss nicht die gesamte Chain skalieren, um alle Daten zu speichern. +In den meisten Fällen wird statt aller Daten auf der Blockchain nur der Hash gespeichert, der angibt, wo die Daten auf einer Kette zu finden sind. So muss nicht die gesamte Chain skalieren, um alle Daten zu speichern. Plattformen mit vertragsbsierter Persistenz: -- [Filecoin](https://docs.filecoin.io/about-filecoin/what-is-filecoin/) -- [Skynet](https://siasky.net/) +- [Filecoin](https://docs.filecoin.io/basics/what-is-filecoin) +- [Skynet](https://sia.tech/) - [Storj](https://storj.io/) - [Züs](https://zus.network/) -- [Crust-Netzwerk](https://crust.network) +- [Crust Network](https://crust.network) - [Swarm](https://www.ethswarm.org/) - [4EVERLAND](https://www.4everland.org/) -### Weitere Überlegungen {#additional-consideration} +### Zusätzliche Überlegungen {#additional-consideration} IPFS ist ein verteiltes System für die Speicherung und den Zugriff auf Dateien, Websites, Anwendungen und Daten. Es hat kein eingebautes Anreizsystem, sondern kann stattdessen mit einer der oben genannten vertragsbasierten Anreizlösungen für eine längerfristige Persistenz verwendet werden. Eine andere Möglichkeit, Daten auf IPFS zu halten, ist die Zusammenarbeit mit einem Pinning-Dienst, der Ihre Daten für Sie "anpinnt". Sie können sogar Ihren eigenen IPFS-Node betreiben und zum Netzwerk beitragen, um Ihre und/oder die Daten anderer kostenlos aufzubewahren. - [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/) -- [Pinata](https://www.pinata.cloud/) _(IPFS Pinning Service)_ -- [web3.storage](https://web3.storage/) _(IPFS/Filecoin Pinning Service)_ -- [Infura](https://infura.io/product/ipfs) _(IPFS Pinning Service)_ -- [IPFS Scan](https://ipfs-scan.io) _(IPFS Pinning Explorer)_ -- [4EVERLAND](https://www.4everland.org/)_(IPFS Pinning Service)_ -- [Filebase](https://filebase.com) _(IPFS Pinning Service)_ -- [Spheron Network](https://spheron.network/) _(IPFS-/Filecoin-Pinning-Dienst)_ +- [Pinata](https://www.pinata.cloud/) _(IPFS-Pinning-Dienst)_ +- [web3.storage](https://web3.storage/) _(IPFS/Filecoin-Pinning-Dienst)_ +- [Infura](https://infura.io/product/ipfs) _(IPFS-Pinning-Dienst)_ +- [IPFS Scan](https://ipfs-scan.io) _(IPFS-Pinning-Explorer)_ +- [4EVERLAND](https://www.4everland.org/) _(IPFS-Pinning-Dienst)_ +- [Filebase](https://filebase.com) _(IPFS-Pinning-Dienst)_ +- [Spheron Network](https://spheron.network/) _(IPFS/Filecoin-Pinning-Dienst)_ SWARM ist eine dezentrale Datenspeicherungs- und Datenverteilungstechnologie mit einem Speicher-Incentive-System und einem Speicher-Mietpreis-Orakel. -## Datenaufbewahrung/Verfügbarkeit {#data-retention} +## Datenaufbewahrung {#data-retention} Systeme müssen für die Datenverfügbarkeit über einen Mechanismus verfügen, der genau dies sicherstellt. -### Herausforderungsmechanismus {#challenge-mechanism} +### Challenge-Mechanismus {#challenge-mechanism} Einer der beliebtesten Wege zur Gewährleistung der Datenverfügbarkeit ist es, irgendeine Art von kryptographischer Herausforderung an die Knoten zu senden, die sie nur lösen können, wenn die Daten noch vorhanden sind. Ein einfaches Beispiel ist der Proof-of-Access von Arweave. Sie senden eine Herausforderung an Knoten, um zu sehen, ob sie über diese die Daten im aktuellsten Block sowie einem zufälligen Block in der Vergangenheit verfügen. Hat ein Knoten nicht die richtige Antwort, wird er bestraft. @@ -79,7 +79,7 @@ Anbieter von dStorage mit einem Herausforderungsmechanismus: - Skynet - Arweave - Filecoin -- Crust Netzwerk +- Crust-Netzwerk - 4EVERLAND ### Dezentralität {#decentrality} @@ -88,18 +88,17 @@ Es gibt keine hervorragenden Tools, um den Grad der Dezentralität von Plattform Dezentrale Tools ohne KYC: -- Züs (gerade erfolgt die Implementierung einer Version ohne KYC) - Skynet - Arweave - Filecoin - IPFS - Ethereum -- Crust Netzwerk +- Crust-Netzwerk - 4EVERLAND ### Konsens {#consensus} -Die meisten diesere Tools haben ihre eigene Version eines [Konsensmechanismus](/developers/docs/consensus-mechanisms/), basieren aber typischerweise auf [**Proof-of-Work (PoW)**](/developers/docs/consensus-mechanisms/pow/) oder [**Proof-of-Stake (PoS)**](/developers/docs/consensus-mechanisms/pos/). +Die meisten dieser Tools haben ihre eigene Version eines [Konsensmechanismus](/developers/docs/consensus-mechanisms/), aber im Allgemeinen basieren sie entweder auf [**Proof-of-Work (PoW)**](/developers/docs/consensus-mechanisms/pow/) oder [**Proof-of-Stake (PoS)**](/developers/docs/consensus-mechanisms/pos/). Basierend auf Proof-of-Work: @@ -111,56 +110,56 @@ Basierend auf Proof-of-Stake: - Ethereum - Filecoin - Züs -- Crust Netzwerk +- Crust-Netzwerk -## Verwandte Werkzeuge {#related-tools} +## Zugehörige Werkzeuge {#related-tools} -**IPFS – _InterPlanetary File System ist dezentrales Speicher- und Datei-Referenzierungssystem für Ethereum_** +**IPFS – _InterPlanetary File System ist ein dezentrales Speicher- und Dateireferenzierungssystem für Ethereum._** - [Ipfs.io](https://ipfs.io/) - [Dokumentation](https://docs.ipfs.io/) - [GitHub](https://github.com/ipfs/ipfs) -**Storj DCS – _Sicherer, privater und S3-kompatibler dezentraler Cloudobjektspeicher für Entwickler_** +**Storj DCS – _Sicherer, privater und S3-kompatibler dezentraler Cloud-Objektspeicher für Entwickler._** - [Storj.io](https://storj.io/) - [Dokumentation](https://docs.storj.io/) - [GitHub](https://github.com/storj/storj) -**Skynet – _Skynet ist eine dezentrale PoW-Chain speziell für ein dezentrales Web_** +**Sia – _Nutzt Kryptografie, um einen vertrauenslosen Cloud-Speichermarktplatz zu schaffen, der es Käufern und Verkäufern ermöglicht, direkt zu handeln._** -- [Skynet.net](https://siasky.net/) -- [Dokumentation](https://siasky.net/docs/) -- [GitHub](https://github.com/SkynetLabs/) +- [Skynet.net](https://sia.tech/) +- [Dokumentation](https://docs.sia.tech/) +- [GitHub](https://github.com/SiaFoundation/) -**Filecoin – _Erstellt vom dem Team, das hinter IPFS steht. Es handelt sich um eine Anreizebene, aufbauend auf den IPFS-Idealen._** +**Filecoin – _Filecoin wurde von demselben Team entwickelt, das auch hinter IPFS steht._** Es handelt sich um eine Anreizebene, aufbauend auf den IPFS-Idealen._\*\* - [Filecoin.io](https://filecoin.io/) - [Dokumentation](https://docs.filecoin.io/) - [GitHub](https://github.com/filecoin-project/) -**Arweave – _Arweave ist eine dStorage-Plattform für die Datenspeicherung_** +**Arweave – _Arweave ist eine dStorage-Plattform zur Datenspeicherung._** - [Arweave.org](https://www.arweave.org/) - [Dokumentation](https://docs.arweave.org/info/) - [Arweave](https://github.com/ArweaveTeam/arweave/) -**Züs – _Züs ist eine Proof-of-Stake-dStorage-Plattform mit Sharding und Blobbers._** +**Züs – _Züs ist eine Proof-of-Stake dStorage-Plattform mit Sharding und Blobbers._** - [zus.network](https://zus.network/) -- [Documentation](https://0chaindocs.gitbook.io/zus-docs) +- [Dokumentation](https://docs.zus.network/zus-docs/) - [GitHub](https://github.com/0chain/) -**Crust Netzwerk – _Crust ist eine dStorage Plattform auf dem IPFS._** +**Crust Network – _Crust ist eine dStorage-Plattform auf Basis von IPFS._** - [Crust.network](https://crust.network) - [Dokumentation](https://wiki.crust.network) - [GitHub](https://github.com/crustio) -**Swarm – _Ein verteiltes Speichersystem und Content-Verteilungs-Service für den Ethereum-Web3-Stack._** +**Swarm – _Eine verteilte Speicherplattform und ein Dienst zur Inhaltsverteilung für den Ethereum Web3-Stack._** - [EthSwarm.org](https://www.ethswarm.org/) -- [Dokumentation](https://docs.ethswarm.org/docs/) +- [Dokumentation](https://docs.ethswarm.org/) - [GitHub](https://github.com/ethersphere/) **OrbitDB – _Eine dezentrale Peer-to-Peer-Datenbank, die auf IPFS basiert._** @@ -169,48 +168,48 @@ Basierend auf Proof-of-Stake: - [Dokumentation](https://github.com/orbitdb/field-manual/) - [GitHub](https://github.com/orbitdb/orbit-db/) -**Aleph.im – _Dezentrales Cloudprojekt (Datenbanken, Dateispeicherung, Computing und DID). Eine einzigartige Mischung aus Peer-to-Peer-Technologie – Off-Chain und On-Chain. IPFS und Multi-Chain-Kompatibilität._** +**Aleph.im – _Dezentrales Cloud-Projekt (Datenbank, Dateispeicher, Computing und DID)._** Eine einzigartige Mischung aus Peer-to-Peer-Technologie – Off-Chain und On-Chain. IPFS und Multi-Chain-Kompatibilität._\*\* -- [Aleph.im](https://aleph.im/) -- [Dokumentation](https://aleph.im/#/developers/) +- [Aleph.im](https://aleph.cloud/) +- [Dokumentation](https://docs.aleph.cloud/) - [GitHub](https://github.com/aleph-im/) -**Ceramic – _Nutzergesteuerte IPFS-Datenbankspeicher für datenintensive und anspruchsvolle Anwendungen._** +**Ceramic – _Nutzergesteuerter IPFS-Datenbankspeicher für datenintensive und ansprechende Anwendungen._** - [Ceramic.network](https://ceramic.network/) -- [Dokumentation](https://developers.ceramic.network/learn/welcome/) +- [Dokumentation](https://developers.ceramic.network/) - [GitHub](https://github.com/ceramicnetwork/js-ceramic/) -**Filebase – _Ein S3-kompatibler dezentraler Speicher und geo-redundanter IPFS-Pinning-Service. Alle über Filebase auf IPFS hochgeladenen Dateien werden automatisch an die Filebase-Infrastruktur mit dreifacher Replikation auf der ganzen Welt gepinnt._** +**Filebase – _S3-kompatibler dezentraler Speicher und georedundanter IPFS-Pinning-Dienst. Alle über Filebase auf IPFS hochgeladenen Dateien werden automatisch mit 3-facher globaler Replikation an die Filebase-Infrastruktur gepinnt._** - [Filebase.com](https://filebase.com/) - [Dokumentation](https://docs.filebase.com/) - [GitHub](https://github.com/filebase) -**4EVERLAND - _Eine Web 3.0-Cloud-Computing-Plattform, die Speicher-, Rechen- und Netzwerk-Kernfunktionen integriert, S3-kompatibel ist und synchrone Datenspeicherung auf dezentralen Speichernetzwerken wie IPFS und Arweave bietet._** +**4EVERLAND – _Eine Web 3.0-Cloud-Computing-Plattform, die Speicher-, Rechen- und Netzwerk-Kernfunktionen integriert, S3-kompatibel ist und eine synchrone Datenspeicherung auf dezentralen Speichernetzwerken wie IPFS und Arweave bietet._** - [4everland.org](https://www.4everland.org/) - [Dokumentation](https://docs.4everland.org/) - [GitHub](https://github.com/4everland) -**Kaleido – _Eine Blockchain-as-a-Service-Plattform mit IPFS-Knoten auf einen Klick_** +**Kaleido – _Eine Blockchain-as-a-Service-Plattform mit IPFS-Nodes per Mausklick._** - [Kaleido](https://kaleido.io/) - [Dokumentation](https://docs.kaleido.io/kaleido-services/ipfs/) - [GitHub](https://github.com/kaleido-io) -**Spheron Network – _Spheron ist eine Platform-as-a-Service (PaaS), die für dApps entwickelt wurde, die ihre Anwendungen auf dezentraler Infrastruktur mit bester Leistung starten möchten. Sie bietet standardmäßig Rechenleistung, dezentrale Speicherung, CDN und Webhosting._** +**Spheron Network – _Spheron ist eine Platform-as-a-Service (PaaS), die für Dapps entwickelt wurde, die ihre Anwendungen auf einer dezentralen Infrastruktur mit bester Leistung starten möchten. Sie bietet standardmäßig Rechenleistung, dezentralen Speicher, CDN und Webhosting._** - [spheron.network](https://spheron.network/) - [Dokumentation](https://docs.spheron.network/) - [GitHub](https://github.com/spheronFdn) -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Was sind dezentrale Speichersysteme?](https://coinmarketcap.com/alexandria/article/what-is-decentralized-storage-a-deep-dive-by-filecoin) – _CoinMarketCap_ -- [Fünf gängige Mythen über dezentrale Speichersysteme entlarvt](https://www.storj.io/blog/busting-five-common-myths-about-decentralized-storage) – _Storj_ +- [Was ist dezentraler Speicher?](https://coinmarketcap.com/academy/article/what-is-decentralized-storage-a-deep-dive-by-filecoin) – _CoinMarketCap_ +- [Fünf verbreitete Mythen über dezentralen Speicher widerlegt](https://www.storj.io/blog/busting-five-common-myths-about-decentralized-storage) – _Storj_ -_Kennen Sie eine Community-Ressource, die Ihnen geholfen hat? Bearbeiten Sie diese Seite und fügen Sie sie hinzu._ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} diff --git a/public/content/translations/de/developers/docs/transactions/index.md b/public/content/translations/de/developers/docs/transactions/index.md index ef90d19d88f..6b8eae1cdd9 100644 --- a/public/content/translations/de/developers/docs/transactions/index.md +++ b/public/content/translations/de/developers/docs/transactions/index.md @@ -8,13 +8,14 @@ Transaktionen sind kryptographisch signierte Anweisungen von Konten. Ein Konto w ## Voraussetzungen {#prerequisites} -Um dir zu helfen, diese Seite besser zu verstehen, empfehlen wir dir, zuerst [ Konten](/developers/docs/accounts/), [Transaktionen](/developers/docs/transactions/) und unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. +Um diese Seite besser zu verstehen, empfehlen wir dir, zuerst [Konten](/developers/docs/accounts/) und unsere [Einführung in Ethereum](/developers/docs/intro-to-ethereum/) zu lesen. ## Was ist eine Transaktion? {#whats-a-transaction} Eine Transaktion von Ethereum bezieht sich auf eine Aktion, die von einem externen Konto initiiert wird; mit anderen Worten auf ein Konto, das von einem Menschen verwaltet wird und nicht von einem Vertrag. Wenn zum Beispiel Bob Alice 1 ETH sendet, muss Bobs Konto belastet werden und das von Alice muss eine Gutschrift erhalten. Diese zustandsverändernde Aktion findet innerhalb einer Transaktion statt. -![Diagramm mit einer Zustandsänderung aus einer Transaktion](./tx.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Diagramm, das eine Zustandsänderung durch eine Transaktion zeigt](./tx.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ Transaktionen, die den Zustand der EVM verändern, müssen auf das gesamte Netzwerk übertragen werden. Jeder Knoten kann eine Anfrage zur Ausführung einer Transaktion an die EVM senden, woraufhin ein Validator die Transaktion ausführt und die daraus resultierende Statusänderung an den Rest des Netzwerks weitergibt. @@ -22,17 +23,17 @@ Transaktionen sind gebührenpflichtig und müssen in einem validierten Block ent Eine abgeschlossene Transaktion enthält folgende Informationen: -- `von` – der Adresse des Senders, der die Transaktion unterzeichnet. Es handelt sich dabei um ein externes Konto, da Vertragskonten keine Transaktionen senden können. -- `to` – die Empfängeradresse (wenn es sich um ein Konto in externem Besitz handelt, wird durch die Transaktion ein Wert übertragen. Bei einem Smart-Contract-Konto führt die Transaktion den Vertragscode aus.) +- `from` – die Adresse des Absenders, der die Transaktion unterzeichnen wird. Es handelt sich dabei um ein externes Konto, da Vertragskonten keine Transaktionen senden können +- `to` – die Empfängeradresse (wenn es sich um ein Konto in externem Besitz handelt, wird die Transaktion einen Wert übertragen. Bei einem Smart-Contract-Konto führt die Transaktion den Vertragscode aus.) - `signature` – die Kennung des Absenders. Das wird generiert, wenn der private Schlüssel des Absenders die Transaktion signiert und bestätigt, dass der Absender diese Transaktion autorisiert hat. -- `nonce` – ein fortlaufend inkrementierender Zähler, der die Transaktionsnummer eines Kontos angibt -- `Wert` – gewünschte Menge an Ether (ETH), die vom Absender an den Empfänger zu überweisen sind (in WEI, ein Ether gleicht 1e + 18wei) -- `input data` – optionales Feld für die Eingabe beliebiger Daten -- `gasLimit` – die maximale Menge an Gaseinheiten, die von der Transaktion verbraucht werden können. Die [EVM](/developers/docs/evm/opcodes) gibt die Gas-Einheiten an, die für jeden Berechnungsschritt benötigt werden -- `maxPriorityFeePerGas` – der Höchstpreis des verbrauchten Gas, der als Trinkgeld an den Validierer weitergegeben wird -- `maxFeePerGas` – die maximale Gebühr pro Gas-Einheit, die für die Transaktion gezahlt werden soll (einschließlich `baseFeePerGas` und `maxPriorityFeePerGas`) +- `nonce` – ein sequenziell inkrementierender Zähler, der die Transaktionsnummer des Kontos angibt +- `value` – der Betrag an ETH, der vom Absender an den Empfänger überwiesen werden soll (in WEI, wobei 1 ETH 1e+18 wei entspricht) +- `input data` – optionales Feld zur Aufnahme beliebiger Daten +- `gasLimit` – die maximale Menge an Gaseinheiten, die von der Transaktion verbraucht werden können. Die [EVM](/developers/docs/evm/opcodes) gibt die für jeden Berechnungsschritt erforderlichen Gaseinheiten an +- `maxPriorityFeePerGas` – der Höchstpreis des verbrauchten Gases, der als Trinkgeld für den Validator enthalten ist +- `maxFeePerGas` – die maximale Gebühr pro Gaseinheit, die für die Transaktion zu zahlen ist (einschließlich `baseFeePerGas` und `maxPriorityFeePerGas`) -Gas ist ein Hinweis auf die Berechnung, die für die Bearbeitung der Transaktion durch einen Validierer erforderlich ist. Benutzer müssen für diese Berechnung eine Gebühr bezahlen. Das `gasLimit` und `maxPriorityFeePerGas` bestimmen die maximale Transaktionsgebühr, die an den Validator gezahlt wird. [Mehr zu Gas](/developers/docs/gas/). +Gas ist ein Hinweis auf die Berechnung, die für die Bearbeitung der Transaktion durch einen Validierer erforderlich ist. Benutzer müssen für diese Berechnung eine Gebühr bezahlen. Das `gasLimit` und `maxPriorityFeePerGas` bestimmen die maximale Transaktionsgebühr, die an den Validator gezahlt wird. [Mehr über Gas](/developers/docs/gas/). Das Transaktionsobjekt wird in etwa wie folgt aussehen: @@ -52,7 +53,7 @@ Aber ein Transaktionsobjekt muss mit dem privaten Schlüssel des Absenders signi Ein Ethereum-Client wie Geth wird diesen Signaturprozess bearbeiten. -Beispiel-[JSON-RPC](/developers/docs/apis/json-rpc)-Aufruf: +Beispiel für einen [JSON-RPC](/developers/docs/apis/json-rpc)-Aufruf: ```json { @@ -99,22 +100,26 @@ Beispielantwort: } ``` -- `raw` ist die signierte Transaktion in [Recursive Length Prefix (RLP)](/developers/docs/data-structures-and-encoding/rlp) in kodierter Form. -- Das `tx` ist die signierte Transaktion im JSON-Format. +- `raw` ist die signierte Transaktion in [Recursive Length Prefix (RLP)](/developers/docs/data-structures-and-encoding/rlp)-kodierter Form +- `tx` ist die signierte Transaktion in JSON-Form Mit dem Signatur-Hash kann für die Transaktion kryptographisch nachgewiesen werden, dass sie vom Absender stammt und dem Netzwerk übermittelt wurde. ### Das Datenfeld {#the-data-field} -Die überwiegende Mehrheit der Transaktionen greift auf einen Vertrag über ein externes Konto zu. Die meisten Verträge sind in Solidity geschrieben und interpretieren ihr Datenfeld entsprechedn dem [Application Binary Interface (ABI)](/glossary/#abi). +Die überwiegende Mehrheit der Transaktionen greift auf einen Vertrag über ein externes Konto zu. +Die meisten Verträge sind in Solidity geschrieben und interpretieren ihr Datenfeld gemäß der [Application Binary Interface (ABI)](/glossary/#abi). -Die ersten vier Bytes geben an, welche Funktion aufgerufen werden soll, wobei der Hash des Funktionsnamens und der Argumente verwendet wird. Manchmal kannst du die Funktion anhand des Selektors aus [dieser Datenbank](https://www.4byte.directory/signatures/) identifizieren. +Die ersten vier Bytes geben an, welche Funktion aufgerufen werden soll, wobei der Hash des Funktionsnamens und der Argumente verwendet wird. +Manchmal kannst du die Funktion aus dem Selektor mithilfe [dieser Datenbank](https://www.4byte.directory/signatures/) identifizieren. -Der Rest der Aufrufdaten sind die Argumente, [codiert wie in den ABI-Spezifikationen angegeben](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). +Der Rest der Calldata sind die Argumente, [kodiert wie in den ABI-Spezifikationen angegeben](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). -Betrachten wir zum Beispiel [diese Transaktion](https://etherscan.io/tx/0xd0dcbe007569fcfa1902dae0ab8b4e078efe42e231786312289b1eee5590f6a1). Verwende **Für mehr hier klicken**, um die Aufrufdaten zu sehen. +Schauen wir uns zum Beispiel [diese Transaktion](https://etherscan.io/tx/0xd0dcbe007569fcfa1902dae0ab8b4e078efe42e231786312289b1eee5590f6a1) an. +Klicke auf **Click to see More**, um die Calldata zu sehen. -Der Funktions-Selektor ist `0xa9059cbb`. Es gibt mehrere [bekannte Funktionen mit dieser Signatur](https://www.4byte.directory/signatures/?bytes4_signature=0xa9059cbb). In diesem Fall wurde [der Contract-Quellcode](https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code) auf Etherscan hochgeladen, so dass wir wissen, dass die Funktion `transfer(address,uint256)` ist. +Der Funktionsselektor ist `0xa9059cbb`. Es gibt mehrere [bekannte Funktionen mit dieser Signatur](https://www.4byte.directory/signatures/?bytes4_signature=0xa9059cbb). +In diesem Fall wurde [der Quellcode des Vertrags](https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code) auf Etherscan hochgeladen, also wissen wir, dass die Funktion `transfer(address,uint256)` lautet. Der Rest der Daten lautet: @@ -123,11 +128,13 @@ Der Rest der Daten lautet: 000000000000000000000000000000000000000000000000000000003b0559f4 ``` -Entsprechend den ABI-Spezifikationen erscheinen Ganzzahlwerte (wie Adressen, die 20-Byte-Ganzzahlen sind) in ABI als 32-Byte-Wörter, die vorne mit Nullen aufgefüllt werden. Also wissen wir, dass die Adresse von `to` [`4f6742badb049791cd9a37ea913f2bac38d01279`](https://etherscan.io/address/0x4f6742badb049791cd9a37ea913f2bac38d01279) ist. Der Wert ist `value` 0x3b0559f4 = 990206452. +Entsprechend den ABI-Spezifikationen erscheinen Ganzzahlwerte (wie Adressen, die 20-Byte-Ganzzahlen sind) in ABI als 32-Byte-Wörter, die vorne mit Nullen aufgefüllt werden. +Wir wissen also, dass die `to`-Adresse [`4f6742badb049791cd9a37ea913f2bac38d01279`](https://etherscan.io/address/0x4f6742badb049791cd9a37ea913f2bac38d01279) ist. +Der `value` ist 0x3b0559f4 = 990206452. ## Arten von Transaktionen {#types-of-transactions} -Bei Ethereum gibt es unterschiedliche Arten von Transaktionen: +Bei Ethereum gibt es ein paar verschiedene Arten von Transaktionen: - Reguläre Transaktionen: eine Transaktion von einem Konto auf ein anderes. - Vertragseinsatz-Transaktionen: eine Transaktion ohne "An"-Adresse, bei der das Datenfeld für den Vertragscode verwendet wird. @@ -135,9 +142,9 @@ Bei Ethereum gibt es unterschiedliche Arten von Transaktionen: ### Über Gas {#on-gas} -Wie bereits erwähnt, kosten das Ausführen von Transaktionen [gas](/developers/docs/gas/). Einfache Überweisungstransaktionen erfordern 21000 Gas. +Wie bereits erwähnt, kostet die Ausführung von Transaktionen [Gas](/developers/docs/gas/). Einfache Überweisungstransaktionen erfordern 21000 Gas. -Damit Bob also Alice 1 ETH zu einer `BasisgebührPerGas` von 190 gwei und einer `maximalenPrioritätsgebührPerGas` von 10 gwei schicken kann, muss er folgende Gebühr bezahlen: +Damit Bob Alice 1 ETH bei einer `baseFeePerGas` von 190 Gwei und einer `maxPriorityFeePerGas` von 10 Gwei senden kann, muss Bob die folgende Gebühr bezahlen: ``` (190 + 10) * 21000 = 4.200.000 gwei @@ -145,35 +152,38 @@ Damit Bob also Alice 1 ETH zu einer `BasisgebührPerGas` von 190 gwei und einer 0,0042 ETH ``` -Bobs Konto wird mit **-1,0042 ETH** belastet (1 ETH für Alice + 0,0042 ETH an Gas-Gebühren) +Bobs Konto wird mit **-1,0042 ETH** belastet (1 ETH für Alice + 0,0042 ETH an Gasgebühren) Alices Konto wird **+1,0 ETH** gutgeschrieben -Die Grundgebühr wird **-0,00399 ETH** verbrannt +Die Grundgebühr wird verbrannt **-0,00399 ETH** -Validatoren behalten das "Trinkgeld" **+0,000210 ETH** +Der Validator behält das Trinkgeld **+0,000210 ETH** - -![Diagramm zeigt, wie ungenutztes Gas zurückerstattet wird](./gas-tx.png) _Diagramm angepasst von [Ethereum EVM illustriert](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Diagramm, das zeigt, wie ungenutztes Gas zurückerstattet wird](./gas-tx.png) +_Diagramm adaptiert von [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ Jedes Gas, das nicht in einer Transaktion verwendet wird, wird auf das Benutzerkonto zurückerstattet. -### Smart Contract-Interaktionen {#smart-contract-interactions} +### Interaktionen mit Smart Contracts {#smart-contract-interactions} Gas wird für jede Transaktion benötigt, die Smart Contracts betrifft. -Smart Contracts können auch Funktionen enthalten, die als [`view`](https://docs.soliditylang.org/en/latest/contracts.html#view-functions) oder [`pure`](https://docs.soliditylang.org/en/latest/contracts.html#pure-functions) bezeichnet werden; sie verändern nicht den Zustand des Vertrags. Daher ist es nicht erforderlich, Gas zu zahlen, wenn diese Funktionen von einem externen Konto (EOA) aufgerufen werden. Der zugrunde liegende RPC-Aufruf in diesem Szenario ist [`eth_call`](/developers/docs/apis/json-rpc#eth_call) +Smart Contracts können auch Funktionen enthalten, die als [`view`](https://docs.soliditylang.org/en/latest/contracts.html#view-functions)- oder [`pure`](https://docs.soliditylang.org/en/latest/contracts.html#pure-functions)-Funktionen bekannt sind und den Zustand des Vertrags nicht verändern. Daher ist es nicht erforderlich, Gas zu zahlen, wenn diese Funktionen von einem externen Konto (EOA) aufgerufen werden. Der zugrunde liegende RPC-Aufruf für dieses Szenario ist [`eth_call`](/developers/docs/apis/json-rpc#eth_call). -Im Gegensatz zum Zugriff über `eth_call` werden diese `view`- oder `pure`-Funktionen auch häufig intern aufgerufen (also vom Vertrag selbst oder von einem anderen Vertrag), was jedoch Gas kostet. +Im Gegensatz zum Zugriff über `eth_call` werden diese `view`- oder `pure`-Funktionen auch häufig intern aufgerufen (d.h. vom Vertrag selbst oder von einem anderen Vertrag), was Gas kostet. -## Transaktions-Lebenszyklus {#transaction-lifecycle} +## Lebenszyklus einer Transaktion {#transaction-lifecycle} Sobald die Transaktion abgeschickt wurde, passiert Folgendes: -1. Ein Transaktions-Hash wird kryptografisch erzeugt: `0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017` +1. Ein Transaktions-Hash wird kryptografisch generiert: + `0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017` 2. Die Transaktion wird dann an das Netzwerk weitergeleitet und zu einem Transaktionspool hinzugefügt, der aus allen anderen ausstehenden Netztransaktionen besteht. 3. Ein Validator muss Ihre Transaktion auswählen und in einem Block hinzufügen, um die Transaktion zu verifizieren und sie als "erfolgreich" zu bezeichnen. -4. Mit der Zeit wird der Block, der Ihre Transaktion enthält, auf "justified" und dann auf " finalized" hochgestuft. Mit diesen Hochstufungen steigt auch die Sicherheit, dass Ihre Transaktion erfolgreich war und nicht mehr verändert werden kann. Sobald ein Block abgeschlossen, also "finalized", ist, könnte er nur noch durch einen Angriff auf Netzwerkebene verändert werden, der viele Milliarden Dollar kosten würde. +4. Mit der Zeit wird der Block, der Ihre Transaktion enthält, auf "justified" und dann auf " finalized" hochgestuft. Diese Upgrades geben eine viel + größere Sicherheit, dass deine Transaktion erfolgreich war und niemals geändert wird. Sobald ein Block „finalisiert“ ist, kann er nur durch einen + Angriff auf Netzwerkebene geändert werden, der viele Milliarden Dollar kosten würde. ## Eine visuelle Demo {#a-visual-demo} @@ -181,38 +191,40 @@ Schaue Austin bei einer Führung durch Transaktionen, Gas und Mining zu. -## Typisierter Transaktionsumschlag {#typed-transaction-envelope} +## Typisierter Transaktions-Envelope {#typed-transaction-envelope} -Ursprünglich hatte Ethereum ein einziges Format für Transaktionen. Jede Transaktion enthielt eine Nonce, einen Gaspreis, ein Gaslimit, eine Zieladresse, einen Wert, Daten, v, r und s. Diese Felder sind [RLP-kodiert](/developers/docs/data-structures-and-encoding/rlp/) und sehen etwa folgendermaßen aus: +Ursprünglich hatte Ethereum ein einziges Format für Transaktionen. Jede Transaktion enthielt eine Nonce, einen Gaspreis, ein Gaslimit, eine Zieladresse, einen Wert, Daten, v, r und s. Diese Felder sind [RLP-kodiert](/developers/docs/data-structures-and-encoding/rlp/), um etwa so auszusehen: `RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])` -Ethereum hat sich so entwickelt, dass es mehrere Transaktionsarten unterstützt, damit neue Funktionen wie Zugriffslisten und [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) implementiert werden können, ohne die alten Transaktionsformate zu beeinflussen. +Ethereum hat sich weiterentwickelt, um mehrere Arten von Transaktionen zu unterstützen, damit neue Funktionen wie Zugriffslisten und [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) implementiert werden können, ohne die alten Transaktionsformate zu beeinträchtigen. -[EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) ermöglicht dieses Verhalten. Transaktionen werden wie folgt interpretiert: +[EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) ist das, was dieses Verhalten ermöglicht. Transaktionen werden wie folgt interpretiert: `TransactionType || TransactionPayload` Die Felder sind wie folgt definiert: -- `TransactionType` – eine Zahl zwischen 0 und 0x7f, für insgesamt 128 mögliche Transaktionsarten. +- `TransactionType` – eine Zahl zwischen 0 und 0x7f, für insgesamt 128 mögliche Transaktionstypen. - `TransactionPayload` – ein beliebiges Byte-Array, das durch den Transaktionstyp definiert wird. Basierend auf dem `TransactionType`-Wert kann eine Transaktion wie folgt klassifiziert werden: -1. **Typ-0-Transaktionen (veraltet):** Das ursprüngliche Transaktionsformat, das seit dem Start von Ethereum verwendet wird. Diese Transaktionen enthalten keine Funktionen aus [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) wie dynamische Gasgebührenkalkulationen oder Zugriffslisten für Smart Contracts. Veraltete Transaktionen haben in ihrer serialisierten Form keinen spezifischen Präfix, der ihren Typ angibt; sie beginnen mit dem Byte `0xf8`, wenn die [Recursive Length Prefix(RLP)](/developers/docs/data-structures-and-encoding/rlp)-Kodierung verwendet wird. Der TransactionType-Wert für diese Transaktionen ist `0x0`. +1. **Typ-0-Transaktionen (Legacy):** Das ursprüngliche Transaktionsformat, das seit dem Start von Ethereum verwendet wird. Sie enthalten keine Funktionen von [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), wie z. B. dynamische Gasgebührenberechnungen oder Zugriffslisten für Smart Contracts. Legacy-Transaktionen fehlt in ihrer serialisierten Form ein spezifisches Präfix, das ihren Typ angibt. Sie beginnen mit dem Byte `0xf8`, wenn die [Recursive Length Prefix (RLP)](/developers/docs/data-structures-and-encoding/rlp)-Kodierung verwendet wird. Der TransactionType-Wert für diese Transaktionen ist `0x0`. -2. **Typ-1-Transaktionen:** Diese Transaktionen wurden in [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) als Teil des [Berlin-Upgrades](/ethereum-forks/#berlin) von Ethereum eingeführt und enthalten einen `accessList`-Parameter. Diese Liste gibt Adressen und Speicherschlüssel an, auf die bei der Transaktion zugegriffen werden soll, was potenziell die [Gas](/developers/docs/gas/)-Kosten für komplexe Transaktionen mit Smart Contracts reduzieren kann. Änderungen des EIP-1559-Gebührenmarkts sind in Typ-1-Transaktionen nicht enthalten. Typ-1-Transaktionen enthalten auch einen `yParity`-Parameter, der entweder `0x0` oder `0x1` sein kann und die Parität des y-Werts der secp256k1-Signatur angibt. Sie werden durch das Anfangs-Byte `0x01` identifiziert und ihr TransactionType-Wert ist `0x1`. +2. **Typ-1-Transaktionen:** Eingeführt in [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) als Teil des [Berlin-Upgrades](/ethereum-forks/#berlin) von Ethereum, enthalten diese Transaktionen einen `accessList`-Parameter. Diese Liste gibt Adressen und Speicherschlüssel an, auf die die Transaktion zugreifen soll, was dazu beitragen kann, die [Gas](/developers/docs/gas/)-Kosten für komplexe Transaktionen mit Smart Contracts zu reduzieren. Änderungen des EIP-1559-Gebührenmarkts sind in Typ-1-Transaktionen nicht enthalten. Typ-1-Transaktionen enthalten auch einen `yParity`-Parameter, der entweder `0x0` oder `0x1` sein kann und die Parität des y-Wertes der secp256k1-Signatur anzeigt. Sie werden durch das Startbyte `0x01` identifiziert, und ihr TransactionType-Wert ist `0x1`. -3. **Typ-2-Transaktionen**, allgemein als EIP-1559-Transaktionen bezeichnet, sind Transaktionen, die in [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), dem [London-Upgrade](/ethereum-forks/#london) von Ethereum, eingeführt wurden. Diese haben sich zur Standardform für Transaktionen auf dem Ethereum-Netzwerk entwickelt. Diese Transaktionen führen einen neuen Gebührenmarktmechanismus ein, der durch die Trennung der Transaktionsgebühr in eine Basisgebühr und eine Prioritätsgebühr die Vorhersehbarkeit verbessert. Sie beginnen mit dem Byte `0x02` und enthalten Felder wie `maxPriorityFeePerGas` und `maxFeePerGas`. Typ-2-Transaktionen sind aufgrund ihrer Flexibilität und Effizienz nun der Standard und werden besonders in Zeiten hoher Netzwerkbelastung bevorzugt – aufgrund ihrer Fähigkeit, den Benutzern eine besser vorhersehbare Verwaltung der Transaktionsgebühren zu ermöglichen. Der TransactionType-Wert für diese Transaktionen ist `0x2`. +3. **Typ-2-Transaktionen**, allgemein als EIP-1559-Transaktionen bezeichnet, sind Transaktionen, die mit [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) im Rahmen des [London-Upgrades](/ethereum-forks/#london) von Ethereum eingeführt wurden. Diese haben sich zur Standardform für Transaktionen auf dem Ethereum-Netzwerk entwickelt. Diese Transaktionen führen einen neuen Gebührenmarktmechanismus ein, der durch die Trennung der Transaktionsgebühr in eine Basisgebühr und eine Prioritätsgebühr die Vorhersehbarkeit verbessert. Sie beginnen mit dem Byte `0x02` und enthalten Felder wie `maxPriorityFeePerGas` und `maxFeePerGas`. Typ-2-Transaktionen sind aufgrund ihrer Flexibilität und Effizienz nun der Standard und werden besonders in Zeiten hoher Netzwerkbelastung bevorzugt – aufgrund ihrer Fähigkeit, den Benutzern eine besser vorhersehbare Verwaltung der Transaktionsgebühren zu ermöglichen. Der TransactionType-Wert für diese Transaktionen ist `0x2`. +4. **Typ-3-Transaktionen (Blob)** wurden in [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) als Teil des [Dencun-Upgrades](/ethereum-forks/#dencun) von Ethereum eingeführt. Diese Transaktionen sind darauf ausgelegt, „Bloß“-Daten (Binary große Objekte) effizienter zu verarbeiten, was insbesondere Layer-2-Rollups zugutekommt, da sie eine Möglichkeit bieten, Daten zu geringeren Kosten im Ethereum-Netzwerk zu veröffentlichen. Blob-Transaktionen enthalten zusätzliche Felder wie `blobVersionedHashes`, `maxFeePerBlobGas` und `blobGasPrice`. Sie beginnen mit dem Byte `0x03`, und ihr TransactionType-Wert ist `0x3`. Blau-Transaktionen stellen eine erhebliche Verbesserung der Datenverfügbarkeit und Skalierbarkeit von Ethereum dar. +5. **Typ-4-Transaktionen** wurden in [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) als Teil des [Pectra-Upgrades](/roadmap/pectra/) von Ethereum eingeführt. Diese Transaktionen sind so konzipiert, dass sie vorwärtskompatibel mit der Kontoabstraktion sind. Sie ermöglichen es EOAs, sich vorübergehend wie Smart-Contract-Konten zu verhalten, ohne ihre ursprüngliche Funktionalität zu beeinträchtigen. Sie enthalten einen `authorization_list`-Parameter, der den Smart Contract angibt, an den das EOA seine Autorität delegiert. Nach der Transaktion enthält das Code-Feld des EOA die Adresse des delegierten Smart Contracts. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [EIP-2718: Typisierter Transaktionsumschlag](https://eips.ethereum.org/EIPS/eip-2718) +- [EIP-2718: Typisierter Transaktions-Envelope](https://eips.ethereum.org/EIPS/eip-2718) -_Du kennst Community-Ressourcen die dir geholfen haben? Bearbeite diese Seite und füge sie hinzu!_ +_Sie kennen Community-Resourcen die Ihnen geholfen haben? Bearbeiten Sie diese Seite und fügen Sie sie hinzu!_ ## Verwandte Themen {#related-topics} diff --git a/public/content/translations/de/developers/docs/web2-vs-web3/index.md b/public/content/translations/de/developers/docs/web2-vs-web3/index.md index 92fd6f7abc0..5cdc7f15841 100644 --- a/public/content/translations/de/developers/docs/web2-vs-web3/index.md +++ b/public/content/translations/de/developers/docs/web2-vs-web3/index.md @@ -1,14 +1,14 @@ --- -title: Web2 vs Web3 -description: +title: Web2 vs. Web3 +description: Vergleichen Sie zentralisierte Web2-Dienste mit dezentralen Web3 Anwendungen, die auf der Ethereum-Blockchain-Technologie basieren. lang: de --- Web2 bezieht sich auf die Version des Internets, die die meisten von uns heute kennen. Ein Internet dominiert von Unternehmen, die im Austausch für deine persönlichen Daten Dienstleistungen erbringen. Web3 bezieht sich im Kontext von Ethereum auf dezentrale Apps, die auf der Blockchain laufen. Dies sind Apps, mit denen jeder teilnehmen kann, ohne seine persönlichen Daten zu monetarisieren. -Suchen Sie nach einer Einführung für Einsteiger? Schauen Sie sich unsere [Einführung in web3](/web3/) an. +Suchen Sie nach einer Einführung für Einsteiger? Siehe unsere [Einführung in Web3](/web3/). -## Web3 – Vorteile {#web3-benefits} +## Vorteile von Web3 {#web3-benefits} Viele Web3-Entwickler haben aufgrund der inhärenten Dezentralisierung von Ethereum beschlossen, dApps zu erstellen: @@ -27,7 +27,7 @@ Viele Web3-Entwickler haben aufgrund der inhärenten Dezentralisierung von Ether Das bedeutet nicht, dass alle Dienste in eine dApp umgewandelt werden müssen. Diese Beispiele zeigen die wichtigsten Unterschiede zwischen Web2- und Web3-Diensten. -## Web3 – Einschränkungen {#web3-limitations} +## Einschränkungen von Web3 {#web3-limitations} Web3 hat momentan einige Einschränkungen: @@ -40,23 +40,23 @@ Web3 hat momentan einige Einschränkungen: In der unten stehenden Tabelle finden Sie einige Vor- und Nachteile zentralisierter und dezentralisierter digitaler Netzwerke. -| Zentralisierte Systeme | Dezentralisierte Systeme | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Niedriger Netzwerkdurchmesser (alle Teilnehmer sind mit einer zentralen Behörde verbunden); Informationen werden schnell verbreitet, da die Verbreitung durch eine zentrale Autorität mit vielen rechnerischen Ressourcen gehandhabt wird. | Die am weitesten entfernten Teilnehmer im Netzwerk können möglicherweise viele Abstände voneinander entfernt sein. Von einer Seite des Netzwerks ausgestrahlte Informationen können lange brauchen, bis sie die andere Seite erreichen. | -| In der Regel leistungsfähiger (höherer Durchsatz, weniger gesamte Rechenressourcen nötig) und leichter implementierbar. | In der Regel niedrigere Leistung (niedrigerer Durchsatz, mehr gesamte Rechenressourcen nötig) und komplexer zu implementieren. | -| Im Falle widersprüchlicher Daten ist die Auflösung klar und einfach: Die ultimative Quelle der Wahrheit ist die zentrale Autorität. | Ein Protokoll (oft komplex) wird für die Streitbeilegung benötigt , wenn Peers widersprüchliche Ansprüche auf den Zustand der Daten erheben, auf die die Teilnehmer synchronisiert werden sollen. | -| Single Point of Failure: Böswillige Akteure können das Netzwerk möglicherweise durch gezielte Angriffe auf die zentrale Autorität ausschalten. | No Single Point of Failure: Das Netzwerk kann immer noch funktionieren, auch wenn ein großer Teil der Teilnehmer angegriffen bzw. ausgeschaltet wird. | +| Zentralisierte Systeme | Dezentralisierte Systeme | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Niedriger Netzwerkdurchmesser (alle Teilnehmer sind mit einer zentralen Behörde verbunden); Informationen werden schnell verbreitet, da die Verbreitung durch eine zentrale Autorität mit vielen rechnerischen Ressourcen gehandhabt wird. | Die am weitesten entfernten Teilnehmer im Netzwerk können möglicherweise viele Abstände voneinander entfernt sein. Von einer Seite des Netzwerks ausgestrahlte Informationen können lange brauchen, bis sie die andere Seite erreichen. | +| In der Regel leistungsfähiger (höherer Durchsatz, weniger gesamte Rechenressourcen nötig) und leichter implementierbar. | In der Regel niedrigere Leistung (niedrigerer Durchsatz, mehr gesamte Rechenressourcen nötig) und komplexer zu implementieren. | +| Im Falle widersprüchlicher Daten ist die Auflösung klar und einfach: Die ultimative Quelle der Wahrheit ist die zentrale Autorität. | Ein Protokoll (oft komplex) wird für die Streitbeilegung benötigt , wenn Peers widersprüchliche Ansprüche auf den Zustand der Daten erheben, auf die die Teilnehmer synchronisiert werden sollen. | +| Single Point of Failure: Böswillige Akteure können das Netzwerk möglicherweise durch gezielte Angriffe auf die zentrale Autorität ausschalten. | No Single Point of Failure: Das Netzwerk kann immer noch funktionieren, auch wenn ein großer Teil der Teilnehmer angegriffen bzw. ausgeschaltet wird. | | Die Koordination zwischen den Netzwerkteilnehmern ist viel einfacher und wird von einer zentralen Autorität verwaltet. Die zentrale Autorität kann Netzwerkteilnehmer dazu zwingen, Upgrades, Protokoll-Updates etc. mit sehr wenig Widerstand zu übernehmen. | Die Koordinierung ist oft schwierig, da kein einziger Agent das letzte Wort bei Entscheidungen auf Netzwerkebene, Protokoll-Upgrades usw. hat. Im schlimmsten Fall neigt das Netzwerk zur Zersplitterung, wenn es Meinungsverschiedenheiten über Änderungen des Protokolls gibt. | -| Die zentrale Autorität kann Daten zensieren, wodurch Teile des Netzwerks von der Interaktion mit dem Rest des Netzes abgeschnitten werden könnten. | Zensur ist viel schwieriger, da Informationen viele Möglichkeiten haben, sich über das Netzwerk zu verbreiten. | -| Die Teilnahme am Netzwerk wird von der zentralen Autorität kontrolliert. | Jeder kann am Netzwerk teilnehmen; es gibt keine „Gatekeeper“. Idealerweise sind die Teilnahmekosten sehr niedrig. | +| Die zentrale Autorität kann Daten zensieren, wodurch Teile des Netzwerks von der Interaktion mit dem Rest des Netzes abgeschnitten werden könnten. | Zensur ist viel schwieriger, da Informationen viele Möglichkeiten haben, sich über das Netzwerk zu verbreiten. | +| Die Teilnahme am Netzwerk wird von der zentralen Autorität kontrolliert. | Jeder kann am Netzwerk teilnehmen; es gibt keine „Gatekeeper“. Idealerweise sind die Teilnahmekosten sehr niedrig. | Beachten Sie, dass das allgemeine Muster sind, die nicht auf jedes Netzwerk zutreffen. In der Realität liegt der Grad der Zentralisierung bzw. Dezentralisierung eines Netzwerks in einem Spektrum. Kein Netzwerk ist vollständig zentralisiert oder vollständig dezentralisiert. -## Weiterführende Informationen {#further-reading} +## Weiterführende Lektüre {#further-reading} -- [Was ist Web3?](/web3/) – _ethereum.org_ -- [Die Architektur einer Web 3.0 Anwendung](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) – _Preethi Kasireddy_ -- [Die Bedeutung der Dezentralisierung](https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274) _Feb 6, 2017 – Vitalik Buterin_ -- [Why Decentralization Matters](https://medium.com/s/story/why-decentralization-matters-5e3f79f7638e) _Feb 18, 2018 – Chris Dixon_ -- [Was ist Web 3.0 & Warum es wichtig ist](https://medium.com/fabric-ventures/what-is-web-3-0-why-it-matters-934eb07f3d2b) _Dez 31, 2019 – Max Mersch und Richard Muirhead_ -- [Warum wir Web 3.0 brauchen](https://medium.com/@gavofyork/why-we-need-web-3-0-5da4f2bf95ab)_Sep 12,2018 - Gavin Wood_ +- [Was ist Web3?](/web3/) - _ethereum.org_ +- [Die Architektur einer Web 3.0-Anwendung](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ +- [Die Bedeutung von Dezentralisierung](https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274) _6. Feb. 2017 - Vitalik Buterin_ +- [Warum Dezentralisierung wichtig ist](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) _18. Feb. 2018 - Chris Dixon_ +- [Was ist Web 3.0 und warum ist es wichtig](https://medium.com/fabric-ventures/what-is-web-3-0-why-it-matters-934eb07f3d2b) _31. Dez. 2019 - Max Mersch und Richard Muirhead_ +- [Warum wir Web 3.0 brauchen](https://gavofyork.medium.com/why-we-need-web-3-0-5da4f2bf95ab) _12. Sep. 2018 - Gavin Wood_ diff --git a/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 9d19e536037..ec6491a7a12 100644 --- a/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -1,123 +1,122 @@ --- -title: Ethereum-Einführung für Pythonentwickler, Teil 1 -description: Eine Einführung in die Entwicklung von Ethereum, zugeschnitten auf Entwickler mit einem Hintergrund in Python +title: Ethereum-Einführung für Python-Entwickler, Teil 1 +description: Eine Einführung in die Ethereum-Entwicklung, besonders nützlich für Personen mit Kenntnissen in der Programmiersprache Python author: Marc Garreau lang: de -tags: - - "Erste Schritte" - - "Python" - - "web3.py" +tags: [ "Python", "web3.py" ] skill: beginner -published: 2020-09-08 +published: 08.09.2020 source: Snake charmers sourceUrl: https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/ --- -Sie haben bereits von Ethereum gehört und möchten tiefer in die Materie eintauchen? In diesem Beitrag werden einige Blockchain-Grundlagen kurz erläutert und dann werden Sie mit einem simulierten Ethereum-Node interagieren – Blockdaten lesen, Kontostände prüfen und Transaktionen senden. Dabei werden wir die Unterschiede zwischen den traditionellen Methoden der App-Entwicklung und diesem neuen dezentralen Modell herausstellen. +Sie haben also von dieser Ethereum-Sache gehört und sind bereit, sich in den Kaninchenbau zu wagen? Dieser Beitrag behandelt kurz einige Blockchain-Grundlagen und führt Sie dann in die Interaktion mit einem simulierten Ethereum-Node ein – das Lesen von Blockdaten, die Überprüfung von Kontoständen und das Senden von Transaktionen. Dabei werden wir die Unterschiede zwischen traditionellen Methoden zur Erstellung von Apps und diesem neuen dezentralen Paradigma hervorheben. -## (Benötigtes) Vorwissen {#soft-prerequisites} +## (Optionale) Voraussetzungen {#soft-prerequisites} -Dieser Beitrag ist für Entwickler mit den unterschiedlichsten Kenntnissen gedacht. Zum Einsatz kommen [Python-Tools](/developers/docs/programming-languages/python/). Diese dienen allerdings nur als Mittel zum Zweck, wenn Sie also keine Vorerfahrung mit Python mitbringen, ist das kein Problem. Allerdings treffe ich ein paar Annahmen über Ihr Vorwissen, damit wir schnell zu den Ethereum-spezifischen Inhalten übergehen können. +Dieser Beitrag soll für eine breite Palette von Entwicklern zugänglich sein. [Python-Tools](/developers/docs/programming-languages/python/) werden verwendet, aber sie sind nur ein Mittel zum Zweck – es ist kein Problem, wenn Sie kein Python-Entwickler sind. Ich werde jedoch ein paar Annahmen darüber treffen, was Sie bereits wissen, damit wir schnell zu den Ethereum-spezifischen Teilen übergehen können. -Vorbedinungen: +Annahmen: -- Sie können sich in einem Terminal bewegen -- Sie haben bereits ein paar Zeilen Python-Code geschrieben -- Python Version 3.6 oder höher ist auf Ihrem Rechner installiert (die Verwendung einer [virtuellen Umgebung](https://realpython.com/effective-python-environment/#virtual-environments) wird dringend empfohlen) -- Sie haben `pip`, das Python-Installationspaket, installiert (Nochmals: Sollten Sie einige dieser Anforderungen nicht erfüllen oder nicht nebenher mit programmieren wollen, sollte es dennoch möglich sein, den Beispielen inhaltlich zu folgen). +- Sie können sich in einem Terminal zurechtfinden, +- Sie haben ein paar Zeilen Python-Code geschrieben, +- Python Version 3.6 oder höher ist auf Ihrem Rechner installiert (die Verwendung einer [virtuellen Umgebung](https://realpython.com/effective-python-environment/#virtual-environments) wird dringend empfohlen), und +- Sie haben `pip`, den Paket-Installer von Python, verwendet. + Auch wenn einige dieser Punkte nicht zutreffen oder Sie nicht vorhaben, den Code in diesem Artikel zu reproduzieren, können Sie dem Inhalt wahrscheinlich trotzdem gut folgen. -## Blockchains, kurz gefasst {#blockchains-briefly} +## Blockchains, kurz erklärt {#blockchains-briefly} -Es gibt viele Möglichkeiten, Ethereum zu beschreiben, doch im Kern ist es eine Blockchain. Blockchains bestehen aus einer Reihe von Blöcken, also lassen Sie uns damit beginnen. Einfach ausgedrückt: Jeder Block der Ethereum-Blockchain besteht nur aus einigen Metadaten und einer Liste von Transaktionen. Im JSON-Format sieht das folgendermaßen aus: +Es gibt viele Möglichkeiten, Ethereum zu beschreiben, doch im Kern ist es eine Blockchain. Blockchains bestehen aus einer Reihe von Blöcken, also lassen Sie uns damit beginnen. Einfach ausgedrückt, ist jeder Block in der Ethereum-Blockchain nur eine Ansammlung von Metadaten und eine Liste von Transaktionen. Im JSON-Format sieht das in etwa so aus: ```json { "number": 1234567, "hash": "0xabc123...", "parentHash": "0xdef456...", - "miner": "0xa1b2c3...", ..., "transactions": [...] } ``` -Jeder [Block](/developers/docs/blocks/) hat eine Referenz auf den vor ihm liegenden Block. Der `parentHash` ist einfach der Hash des vorherigen Blocks. +Jeder [Block](/developers/docs/blocks/) hat eine Referenz auf den Block, der davor kam; der `parentHash` ist einfach der Hash des vorherigen Blocks. -Hinweis: Ethereum nutzt regelmäßig Hashfunktionen, um Werte mit fester Länge (Hashes) zu erzeugen. Hashes spielen eine wichtige Rolle in Ethereum, für den Einstieg können Sie sie einfach als eindeutige ID vorstellen. +Hinweis: Ethereum verwendet regelmäßig Hash-Funktionen, um Werte fester Größe („Hashes“) zu erzeugen. Hashes spielen eine wichtige Rolle in Ethereum, aber vorerst können Sie sie sich einfach als eindeutige IDs vorstellen. ![Ein Diagramm, das eine Blockchain einschließlich der Daten in jedem Block darstellt](./blockchain-diagram.png) -_Eine Blockchain ist im Grunde eine verknüpfte Liste. Jeder Block verweist auf den vorangehenden Block._ +_Eine Blockchain ist im Grunde eine verkettete Liste; jeder Block hat eine Referenz auf den vorherigen Block._ -Diese Datenstruktur ist nicht neu. Aber die Regeln (z. B. Peer-to-Peer-Protokolle), die im Netzwerk gelten, sind neu. Es gibt keine zentrale Autorität. Die Netzwerkteilnehmer (Peers) müssen zusammenarbeiten und konkurrieren, um das Netzwerk aufrechtzuerhalten und zu entscheiden, welche Transaktionen in den nächsten Block aufgenommen werden. Wenn Sie also einem Freund Geld schicken möchten, müssen Sie diese Transaktion an das Netzwerk senden und dann darauf warten, dass sie in einen kommenden Block aufgenommen wird. +Diese Datenstruktur ist nichts Neues, aber die Regeln (d. h. die Peer-to-Peer-Protokolle), die das Netzwerk steuern, sind es. Es gibt keine zentrale Autorität; das Netzwerk von Peers muss zusammenarbeiten, um das Netzwerk aufrechtzuerhalten, und konkurrieren, um zu entscheiden, welche Transaktionen in den nächsten Block aufgenommen werden. Wenn Sie also einem Freund Geld schicken möchten, müssen Sie diese Transaktion an das Netzwerk senden und dann darauf warten, dass sie in einen kommenden Block aufgenommen wird. -Die einzige Möglichkeit für die Blockchain, zu verifizieren, dass Geld wirklich von einem Nutzer zu einem anderen gesendet wurde, ist die Nutzung einer für diese Blockchain nativen Währung (d. h. die von ihr geschaffen und verwaltet wird). Bei Ethereum heißt diese Währung Ether. Die Ethereum-Blockchain enthält die einzigen offiziellen Aufzeichnungen über die Kontostände. +Die einzige Möglichkeit für die Blockchain, zu verifizieren, dass Geld wirklich von einem Nutzer zu einem anderen gesendet wurde, ist die Nutzung einer für diese Blockchain nativen Währung (d. h. die von ihr geschaffen und verwaltet wird). In Ethereum heißt diese Währung Ether, und die Ethereum-Blockchain enthält die einzige offizielle Aufzeichnung der Kontostände. -## Ein neues Modell {#a-new-paradigm} +## Ein neues Paradigma {#a-new-paradigm} -Dieser neue dezentralisierte Technologie-Stack hat neue Entwicklertools hervorgebracht. Solche Tools gibt es in vielen Programmiersprachen, aber in diesem Beitrag schauen wir durch die Python-Brille. Um es noch einmal zu betonen: Selbst wenn Python nicht Ihre bevorzugte Sprache ist, sollten Sie den Anweisungen trotzdem leicht folgen können. +Dieser neue dezentralisierte Technologie-Stack hat neue Entwicklertools hervorgebracht. Solche Tools gibt es in vielen Programmiersprachen, aber wir werden sie aus der Python-Perspektive betrachten. Um es noch einmal zu wiederholen: Auch wenn Python nicht Ihre bevorzugte Sprache ist, sollte es kein Problem sein, mitzukommen. -Python-Entwickler, die mit Ethereum interagieren möchten, nutzen wahrscheinlich [Web3.py](https://web3py.readthedocs.io/). Web3.py ist eine Bibliothek, die es sehr einfach macht, sich mit einem Ethereum-Node zu verbinden und dann Daten zu senden und zu empfangen. +Python-Entwickler, die mit Ethereum interagieren möchten, greifen wahrscheinlich zu [Web3.py](https://web3py.readthedocs.io/). Web3.py ist eine Bibliothek, die die Verbindung zu einem Ethereum-Node sowie das Senden und Empfangen von Daten von diesem erheblich vereinfacht. -Hinweis: "Ethereum-Node" und "Ethereum-Client" werden synonym verwendet. In beiden Fällen ist Software gemeint, die ein Teilnehmer am Ethereum-Netzwerk ausführt. Diese Software kann Blockdaten lesen, Updates empfangen, wenn neue Blöcke zur Kette hinzugefügt ("geminted") werden, neue Transaktionen übertragen und vieles mehr. +Hinweis: „Ethereum-Node“ und „Ethereum-Client“ werden synonym verwendet. In beiden Fällen bezieht es sich auf die Software, die ein Teilnehmer im Ethereum-Netzwerk ausführt. Diese Software kann Blockdaten lesen, Aktualisierungen empfangen, wenn neue Blöcke zur Kette hinzugefügt werden, neue Transaktionen übertragen und vieles mehr. Technisch gesehen ist der Client die Software, der Node ist der Computer, auf dem die Software läuft. -[Ethereum-Clients](/developers/docs/nodes-and-clients/) können so konfiguriert werden, dass sie über [IPC](https://wikipedia.org/wiki/Inter-process_communication), HTTP oder Websockets erreichbar sind. Daher muss Web3.py diese Konfiguration spiegeln. Web3.py bezeichnet diese Verbindungsoptionen als **Anbieter**. Sie müssen einen der drei Anbieter wählen, um eine Web3.py-Instanz mit Ihrem Node zu verbinden. +[Ethereum-Clients](/developers/docs/nodes-and-clients/) können so konfiguriert werden, dass sie über [IPC](https://wikipedia.org/wiki/Inter-process_communication), HTTP oder Websockets erreichbar sind, daher muss Web3.py diese Konfiguration widerspiegeln. Web3.py bezeichnet diese Verbindungsoptionen als **Anbieter**. Sie sollten einen der drei Anbieter wählen, um die Web3.py-Instanz mit Ihrem Node zu verbinden. ![Ein Diagramm, das zeigt, wie web3.py IPC verwendet, um Ihre Anwendung mit einem Ethereum-Node zu verbinden](./web3py-and-nodes.png) -_Konfigurieren Sie den Ethereum-Node und Web3.py so, dass sie über das gleiche Protokoll kommunizieren. Im folgenden Diagramm ist das beispielsweise IPC._ +_Konfigurieren Sie den Ethereum-Node und Web3.py so, dass sie über dasselbe Protokoll kommunizieren, z. B. IPC in diesem Diagramm._ -Sobald Web3.py richtig konfiguriert ist, können Sie mit der Blockchain interagieren. Hier sind eine paar Anwendungsbeispiele für Web3.py als Vorschau auf das was noch folgt: +Sobald Web3.py richtig konfiguriert ist, können Sie mit der Blockchain interagieren. Hier sind ein paar Anwendungsbeispiele für Web3.py als Vorschau auf das, was noch folgt: ```python -# read block data: +# Blockdaten lesen: w3.eth.get_block('latest') -# send a transaction: +# eine Transaktion senden: w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...}) ``` ## Installation {#installation} -In dieser Einführung arbeiten wir nur mit dem Python-Interpreter. Wir erzeugen keine Verzeichnisse, Dateien, Klassen oder Funktionen. +In dieser exemplarischen Vorgehensweise arbeiten wir nur innerhalb eines Python-Interpreters. Wir werden keine Verzeichnisse, Dateien, Klassen oder Funktionen erstellen. -Hinweis: In den folgenden Beispielen kennzeichnet '$' Befehle, die im Terminal ausgeführt werden. (Geben Sie dabei das '$' nicht mit ein. Es ist nur ein Hinweis auf den Beginn einer Zeile.) +Hinweis: In den folgenden Beispielen sind Befehle, die mit `$` beginnen, für die Ausführung im Terminal vorgesehen. (Geben Sie das `$` nicht mit ein, es kennzeichnet nur den Zeilenanfang.) -Installieren Sie zuerst [IPython](https://ipython.org/), um eine benutzerfreundliche Umgebung zu erstellen. IPython bietet neben anderen Funktionen eine Tab-Vervollständigung an. Damit lässt sich einfacher heruasfinden, was innerhalb von Web3.py möglich ist. +Installieren Sie zuerst [IPython](https://ipython.org/), um eine benutzerfreundliche Umgebung zum Erkunden zu erhalten. IPython bietet unter anderem eine Tab-Vervollständigung an, die es viel einfacher macht, zu erkennen, was mit Web3.py alles möglich ist. ```bash -$ pip install ipython +pip install ipython ``` -Web3.py wird unter dem Namen `web3` publiziert. Nehmen Sie die Installation wie folgt vor: +Web3.py wird unter dem Namen `web3` veröffentlicht. Installieren Sie es wie folgt: ```bash -$ pip install web3 +pip install web3 ``` -Als Nächstes werden wir eine Blockchain-Simulation durchführen, die noch einige weitere Abhängigkeiten erfordert. Nehmen Sie die Installation wie folgt vor: +Noch etwas – wir werden später eine Blockchain simulieren, was ein paar weitere Abhängigkeiten erfordert. Sie können diese wie folgt installieren: ```bash -$ pip install 'web3[tester]' +pip install 'web3[tester]' ``` -Nun kann es losgehen. +Jetzt sind Sie startklar! + +Hinweis: Das `web3[tester]`-Paket funktioniert bis Python 3.10.xx ## Eine Sandbox einrichten {#spin-up-a-sandbox} -Öffnen Sie eine neue Python-Umgebung, indem Sie `ipython` in Ihrem Terminal ausführen. Diese Ausführung ist vergleichbar mit `python`, bietet aber deutlich mehr Funktionen. +Öffnen Sie eine neue Python-Umgebung, indem Sie `ipython` in Ihrem Terminal ausführen. Dies ist vergleichbar mit der Ausführung von `python`, bietet aber deutlich mehr Funktionen. ```bash -$ ipython +ipython ``` -Es werden einige Informationen über Ihre aktuelle Version von Python und IPython angezeigt. Anschließend sollten Sie eine Aufforderung zur Eingabe erhalten: +Es werden einige Informationen über die Versionen von Python und IPython angezeigt, die Sie verwenden. Anschließend sollten Sie eine Aufforderung zur Eingabe sehen: ```python In [1]: ``` -Sie befinden sich jetzt in einer interaktiven Python-Shell-Umgebung. Hier können Sie sich nun austoben. Nun ist es an der Zeit, Web3.py zu importieren: +Sie sehen nun eine interaktive Python-Shell. Im Grunde ist es eine Sandbox zum Herumspielen. Wenn Sie es bis hierher geschafft haben, ist es an der Zeit, Web3.py zu importieren: ```python In [1]: from web3 import Web3 @@ -125,74 +124,75 @@ In [1]: from web3 import Web3 ## Einführung in das Web3-Modul {#introducing-the-web3-module} -Das [Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api)-Modul ist nicht nur ein Gateway zu Ethereum, sondern bietet auch einige komfortable Funktionen an. Sehen wir uns ein paar davon genauer an. +Das [Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api)-Modul ist nicht nur ein Gateway zu Ethereum, sondern bietet auch einige praktische Funktionen. Sehen wir uns ein paar davon an. -In einer Ethereum-Anwendung müssen Sie üblicherweise Währungsbezeichnungen umrechnen. Das Web3-Modul stellt Ihnen dazu hilfreiche Methoden zur Verfügung: [fromWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.fromWei) und [toWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toWei). +In einer Ethereum-Anwendung müssen Sie üblicherweise Währungsbezeichnungen umrechnen. Das Web3-Modul bietet hierfür ein paar Hilfsmethoden: [from_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.from_wei) und [to_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_wei). -Hinweis: Computer sind bekanntermaßen schlecht bei der Verarbeitung von Dezimalmathematik. Um das zu umgehen, geben Entwickler Dollarbeträge oft in Cent an. Beispiel: Ein Artikel mit einem Preis von 5,99 USD wird in der Datenbank als 599 angelegt. +Hinweis: Computer sind bekanntermaßen schlecht bei der Verarbeitung von Dezimalzahlen. Um dies zu umgehen, speichern Entwickler Dollarbeträge oft in Cent. Beispielsweise kann ein Artikel mit einem Preis von 5,99 $ in der Datenbank als 599 gespeichert werden. -Transaktionen in Ether werden in ähnlicher Weise verwaltet. Aber statt zwei Dezimalstellen hat Ether 18 Stück. Die kleinste Einheit von Ether wird Wei genannt. Das ist auch der Wert, der beim Senden von Transaktionen angegeben wird. +Ein ähnliches Muster wird beim Umgang mit Transaktionen in Ether verwendet. Doch anstelle von zwei Dezimalstellen hat Ether 18! Die kleinste Einheit von Ether wird Wei genannt. Das ist also der Wert, der beim Senden von Transaktionen angegeben wird. -1 Ether = 1000000000000000000 Wei +1 Ether = 1.000.000.000.000.000.000 Wei -1 Wei = 0.000000000000000001 Ether +1 Wei = 0,000000000000000001 Ether -Versuchen Sie, einige Werte nach und von Wei zu konvertieren. [Beachten Sie](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations), dass es zwischen Ether und Wei noch andere Einheiten gibt. Eine der bekanntesten ist **Gwei**, da Transaktionsgebühren in dieser Einheit angegeben werden. +Versuchen Sie, einige Werte von und in Wei umzurechnen. Beachten Sie, dass es [Namen für viele der Denominationen](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) zwischen Ether und Wei gibt. Eine der bekanntesten davon ist **Gwei**, da Transaktionsgebühren oft in dieser Einheit dargestellt werden. ```python -In [2]: Web3.toWei(1, 'ether') +In [2]: Web3.to_wei(1, 'ether') Out[2]: 1000000000000000000 -In [3]: Web3.fromWei(500000000, 'gwei') +In [3]: Web3.from_wei(500000000, 'gwei') Out[3]: Decimal('0.5') ``` -Das Web3-Modul enthält außerdem einen Datenformatkonvertierer (z. B. [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)), Adresse (z. B., [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)), und Hashfunktionen (z. B., [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak)). Viele davon werden hier genauer erklärt. Um alle verfügbaren Funktionen und Eigenschaften anzuzeigen, können Sie die Autovervollständigung in IPython nutzen. Geben Sie dafür den folgenden Code ein: `Web3`. Anschließend drücken Sie bitte zweimal die Tab-Taste. +Weitere Hilfsmethoden im Web3-Modul umfassen Datenformat-Konverter (z. B. [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)), Adress-Hilfsfunktionen (z. B. [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)) und Hash-Funktionen (z. B. [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak)). Viele davon werden später in dieser Reihe behandelt. Um alle verfügbaren Methoden und Eigenschaften anzuzeigen, nutzen Sie die automatische Vervollständigung von IPython, indem Sie `Web3` eingeben. und nach dem Punkt zweimal die Tab-Taste drücken. -## Kommunikation mit der Blockchain {#talk-to-the-chain} +## Kommunikation mit der Chain {#talk-to-the-chain} -Die bisher vorgestellten Funktionen sind toll. Aber sehen wir uns nun einmal die Blockchain genauer an. Im nächsten Schritt konfiguireren wir Web3.py für die Kommunikation mit einem Ethereum-Node. Dabei können wir IPC, HTTP oder Websocket-Anbieter verwenden. +Die Hilfsmethoden sind schön und gut, aber lassen Sie uns zur Blockchain übergehen. Der nächste Schritt ist die Konfiguration von Web3.py zur Kommunikation mit einem Ethereum-Node. Hier haben wir die Möglichkeit, die Anbieter IPC, HTTP oder Websocket zu verwenden. -Wir werden hier nicht weiter darauf eingehen, aber ein Beispiel für einen kompletten Workflow mit dem HTTP-Provider könnte wie folgt aussehen: +Wir werden diesen Weg nicht weiter verfolgen, aber ein Beispiel für einen kompletten Arbeitsablauf mit dem HTTP-Anbieter könnte etwa so aussehen: - Laden Sie einen Ethereum-Node herunter, z. B. [Geth](https://geth.ethereum.org/). -- Starten Sie Geth in einem Terminalfenster und warten Sie bis die Netzwerksynchronisierung abgeschlossen ist. Der Standard-HTTP-Port ist `8545`, kann jedoch umkonfiguriert werden. -- Stellen Sie eine Verbindung von Web3.py zu dem Ethereum-Node über HTTP, `localhost:8545`, her. `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))` -- Agieren Sie über die `w3`-Instanz mit dem Node. +- Starten Sie Geth in einem Terminalfenster und warten Sie, bis es sich mit dem Netzwerk synchronisiert hat. Der Standard-HTTP-Port ist `8545`, ist aber konfigurierbar. +- Weisen Sie Web3.py an, sich mit dem Node über HTTP auf `localhost:8545` zu verbinden. + `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))` +- Verwenden Sie die `w3`-Instanz, um mit dem Node zu interagieren. -Wenn Sie nur an einer Entwicklungsumgebung interessiert sind, ist dieser Weg unnötig, da der Synchronisierungsprozess mehrere Stunden dauert. Web3.py stellt für diesen Zweck einen vierten Provider zur Verfügung, den **EthereumTesterProvider**. Dieser Test-Provider ist mit einem simulierten Ethereum-Node mit Fake-Währungen und einfachen Berechtigungen verknüpft. +Obwohl dies ein „echter“ Weg ist, dauert der Synchronisierungsprozess Stunden und ist unnötig, wenn Sie nur eine Entwicklungsumgebung wollen. Web3.py stellt für diesen Zweck einen vierten Anbieter bereit, den **EthereumTesterProvider**. Dieser Testanbieter verknüpft sich mit einem simulierten Ethereum-Node mit gelockerten Berechtigungen und einer Spielwährung. ![Ein Diagramm, das den EthereumTesterProvider zeigt, der Ihre web3.py-Anwendung mit einem simulierten Ethereum-Node verbindet](./ethereumtesterprovider.png) _Der EthereumTesterProvider verbindet sich mit einem simulierten Node und ist praktisch für schnelle Entwicklungsumgebungen._ -Dieser simulierter Node heißt [eth-tester](https://github.com/ethereum/eth-tester) und wurde mit dem Befehl `pip install web3[tester]` installiert. Um das Web3.py mit dem Testanbieter zu verbinden, geben Sie Folgendes ein: +Dieser simulierte Node heißt [eth-tester](https://github.com/ethereum/eth-tester) und wurde als Teil des `pip install web3[tester]`-Befehls installiert. Die Konfiguration von Web3.py zur Verwendung dieses Testanbieters ist so einfach wie: ```python In [4]: w3 = Web3(Web3.EthereumTesterProvider()) ``` -Jetzt können Sie mit der Blockchain kommunizieren. Wie das genau funktioniert? Ich habe da etwas für Sie zusammengestellt. Machen wir eine schnelle Tour. +Jetzt sind Sie bereit, auf der Chain zu surfen! Das ist kein gängiger Ausdruck. Das habe ich mir gerade ausgedacht. Machen wir eine kurze Tour. -## Los geht's {#the-quick-tour} +## Die Kurztour {#the-quick-tour} -Zuallererst eine Zuverlässigkeitsüberprüfung: +Zuallererst ein Sanity-Check: ```python -In [5]: w3.isConnected() +In [5]: w3.is_connected() Out[5]: True ``` -Da wir einen Testanbieter verwenden, ist der Test nicht sehr aussagekräftig, doch falls er fehlschlägt, ist die Wahrscheinlichkeit hoch, dass Sie eine falsche Variable in `w3` eingegeben haben. Überprüfen Sie, ob Sie die inneren Klammern eingefügt haben, also `Web3.EthereumTesterProvider()`. +Da wir den Testanbieter verwenden, ist dies kein sehr aussagekräftiger Test, aber wenn er fehlschlägt, haben Sie wahrscheinlich bei der Instanziierung der `w3`-Variable etwas falsch eingegeben. Überprüfen Sie, ob Sie die inneren Klammern eingefügt haben, d. h. `Web3.EthereumTesterProvider()`. -## 1. Stop auf der Tour: [Konten](/developers/docs/accounts/) {#tour-stop-1-accounts} +## Tour-Stopp Nr. 1: [Konten](/developers/docs/accounts/) {#tour-stop-1-accounts} -Der Einfachheit halber hat der Testanbieter bereits einige Konten eingerichtet und sie mit Test-Ether gefüllt. +Der Einfachheit halber hat der Testanbieter einige Konten erstellt und sie mit Test-Ether vorgeladen. -Zunächst sehen wir uns die folgende Kontenliste an: +Zuerst sehen wir uns eine Liste dieser Konten an: ```python In [6]: w3.eth.accounts @@ -201,27 +201,27 @@ Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf', '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...] ``` -Wenn Sie diesen Befehl ausführen, sollten Sie eine Liste von zehn Zeichenketten sehen, die mit `0x` beginnen. Jede davon ist eine **öffentliche Adresse** und gewissermaßen analog zur Kontonummer auf einem Prüfkonto. Diese Adresse würden Sie angeben, wenn Ihnen jemand Ether senden will. +Wenn Sie diesen Befehl ausführen, sollten Sie eine Liste von zehn Zeichenketten sehen, die mit `0x` beginnen. Jede davon ist eine **öffentliche Adresse** und ist in gewisser Weise analog zur Kontonummer eines Girokontos. Sie würden diese Adresse jemandem geben, der Ihnen Ether senden möchte. -Wie bereits erwähnt, hat der Testanbieter jedes dieser Konten mit Test-Ether gefüllt. Lassen Sie uns herausfinden, wie viel sich auf dem ersten Konto befindet: +Wie bereits erwähnt, hat der Testanbieter jedes dieser Konten mit etwas Test-Ether vorgeladen. Finden wir heraus, wie viel sich auf dem ersten Konto befindet: ```python In [7]: w3.eth.get_balance(w3.eth.accounts[0]) Out[7]: 1000000000000000000000000 ``` -Das sind viele Nullen. Bevor Sie vor Freude in die Luft springen, erinnern Sie sich bitte an unsere vorherige Lektion über die Schreibweise von Währungen. Ether wird in der kleinsten Einheit Wei angegeben. Rechnen Sie dies in Ether um: +Das sind eine Menge Nullen! Bevor Sie lachend zur falschen Bank gehen, erinnern Sie sich an die Lektion über Währungsbezeichnungen von vorhin. Ether-Werte werden in der kleinsten Einheit, Wei, dargestellt. Rechnen Sie das in Ether um: ```python -In [8]: w3.fromWei(1000000000000000000000000, 'ether') +In [8]: w3.from_wei(1000000000000000000000000, 'ether') Out[8]: Decimal('1000000') ``` -Eine Millionen Test-Ether – sind immer noch gut. +Eine Million Test-Ether – immer noch nicht zu verachten. -## 2. Stop auf der Tour: Blockdaten {#tour-stop-2-block-data} +## Tour-Stopp Nr. 2: Blockdaten {#tour-stop-2-block-data} -Werfen wir einen Blick auf den Status dieser simulierten Blockchain: +Werfen wir einen Blick auf den Zustand dieser simulierten Blockchain: ```python In [9]: w3.eth.get_block('latest') @@ -234,32 +234,35 @@ Out[9]: AttributeDict({ }) ``` -Über einen Block werden viele Informationen zurückgegeben, doch auf ein paar davon sollten Sie achten: +Über einen Block werden viele Informationen zurückgegeben, aber hier sind nur ein paar Dinge hervorzuheben: -- Die Blocknummer ist Null – unabhängig davon, wie lange es her ist, dass Sie den Testanbieter konfiguriert haben. Im Gegensatz zum echten Ethereum-Netzwerk, das ungefähr alle 15 Sekunden einen neuen Block erstellt, wartet diese Simulation, bis sie von Ihnen etwas zu tun bekommt. -- Die `transactions` sind ebenfalls leer, da wir bisher noch nichts gemacht haben. Dieser erste Block ist ein **leerer Block**, nur um die Kette in Gang zu setzen. -- Beachten Sie, dass der `parentHash` nur ein Bund aus leeren Bytes ist. Das bedeutet, dass es sich um den ersten Block in der Kette handelt, auch bekannt als **Genesis Block**. +- Die Blocknummer ist Null – egal, wie lange es her ist, dass Sie den Testanbieter konfiguriert haben. Im Gegensatz zum echten Ethereum-Netzwerk, das alle 12 Sekunden einen neuen Block hinzufügt, wartet diese Simulation, bis Sie ihr Arbeit geben. +- `transactions` ist aus demselben Grund eine leere Liste: Wir haben noch nichts getan. Dieser erste Block ist ein **leerer Block**, nur um die Kette zu starten. +- Beachten Sie, dass der `parentHash` nur eine Reihe von leeren Bytes ist. Dies bedeutet, dass es sich um den ersten Block in der Kette handelt, auch bekannt als **Genesis-Block**. -## 3. Stop auf der Tour: [Transaktionen](/developers/docs/transactions/) {#tour-stop-3-transactions} +## Tour-Stopp Nr. 3: [Transaktionen](/developers/docs/transactions/) {#tour-stop-3-transactions} -Wir verharren bei Block Null bis es eine Transaktion zum Minen gibt, also geben wir ihm eine. Senden Sie ein paar Test-Ether von einem Konto zum anderem: +Wir stecken bei Block Null fest, bis eine Transaktion ansteht, also geben wir ihm eine. Senden Sie ein paar Test-Ether von einem Konto zum anderen: ```python In [10]: tx_hash = w3.eth.send_transaction({ 'from': w3.eth.accounts[0], 'to': w3.eth.accounts[1], - 'value': w3.toWei(3, 'ether'), + 'value': w3.to_wei(3, 'ether'), 'gas': 21000 }) ``` -Das ist typischerweise der Punkt, an dem Sie mehrere Sekunden warten würden, bis Ihre Transaktion in einem neuen Block erstellt wurde. Der gesamte Prozess läuft wie folgt ab: +Dies ist normalerweise der Punkt, an dem Sie mehrere Sekunden warten müssten, bis Ihre Transaktion in einen neuen Block aufgenommen wird. Der gesamte Prozess läuft ungefähr so ab: -1. Übermitteln Sie eine Transaktion und halten Sie den Transaktions-Hash bereit. Die Transaktion ist ausstehend bis sie geminted wurde. `tx_hash = w3.eth.send_transaction({ … })` -2. Warten Sie, bis die Transaktion geminted wurde: `w3.eth.wait_for_transaction_receipt(tx_hash)` -3. Setzen Sie die Anwendungslogik fort. Um die erfolgreiche Transaktion anzuzeigen: `w3.eth.get_transaction(tx_hash)` +1. Senden Sie eine Transaktion und behalten Sie den Transaktions-Hash. Bis der Block mit der Transaktion erstellt und übertragen wird, ist die Transaktion „ausstehend“. + `tx_hash = w3.eth.send_transaction({ … })` +2. Warten Sie, bis die Transaktion in einen Block aufgenommen wird: + `w3.eth.wait_for_transaction_receipt(tx_hash)` +3. Setzen Sie die Anwendungslogik fort. Um die erfolgreiche Transaktion anzuzeigen: + `w3.eth.get_transaction(tx_hash)` -Unsere simulierte Umgebung wird die Transaktion sofort in einem neuen Block hinzufügen, so dass wir die Transaktion direkt sehen können: +Unsere simulierte Umgebung fügt die Transaktion sofort in einem neuen Block hinzu, sodass wir die Transaktion sofort anzeigen können: ```python In [11]: w3.eth.get_transaction(tx_hash) @@ -274,22 +277,24 @@ Out[11]: AttributeDict({ }) ``` -Hier werden sie einige bekannte Details sehen: Die Felder `from`, `to` und `value` sollten mit den Einträgen unseres `send_transaction`-Aufrufs übereinstimmen. Das andere beruhigende Aspekt ist, dass diese Transaktion als erste Transaktion (`'transactionIndex': 0`) in Block Nr. 1 enthalten war. +Hier sehen Sie einige vertraute Details: Die Felder `from`, `to` und `value` sollten mit den Eingaben unseres `send_transaction`-Aufrufs übereinstimmen. Der andere beruhigende Aspekt ist, dass diese Transaktion als erste Transaktion (`'transactionIndex': 0`) in Block Nummer 1 aufgenommen wurde. -Wir können den Erfolg dieser Transaktion auch leicht überprüfen, indem wir die Salden der beiden beteiligten Konten kontrollieren. Drei Ether sollten sich von einem auf das andere Konto bewegt haben. +Wir können den Erfolg dieser Transaktion auch leicht überprüfen, indem wir die Salden der beiden beteiligten Konten kontrollieren. Drei Ether sollten von einem zum anderen transferiert worden sein. ```python In [12]: w3.eth.get_balance(w3.eth.accounts[0]) -Out[12]: 999996999999999999969000 +Out[12]: 999996999979000000000000 In [13]: w3.eth.get_balance(w3.eth.accounts[1]) Out[13]: 1000003000000000000000000 ``` -Letzteres sieht gut aus. Der Saldo hat sich von 1.000.000 auf 1.000.003 Ether erhöht. Aber was ist mit dem ersten Konto passiert? Es scheint etwas mehr, als drei Ether verloren zu haben. Leider ist nichts im Leben kostenlos. Die Nutzung des öffentlichen Netzes von Ethereum erfordert, dass das Netzwerk für seine Unterstützung eine Aufwandsentschädigung erhält. Eine kleine Transaktionsgebühr wurde vom Konto abgezogen, in Größenordnung von 31000 Wei. +Letzteres sieht gut aus! Der Saldo stieg von 1.000.000 auf 1.000.003 Ether. Aber was ist mit dem ersten Konto passiert? Es scheint etwas mehr als drei Ether verloren zu haben. Leider ist nichts im Leben umsonst, und die Nutzung des öffentlichen Ethereum-Netzwerks erfordert, dass Sie Ihre Peers für ihre unterstützende Rolle entschädigen. Eine kleine Transaktionsgebühr wurde von dem Konto abgezogen, das die Transaktion übermittelt hat – diese Gebühr ist die Menge des verbrauchten Gases (21.000 Gaseinheiten für eine ETH-Überweisung) multipliziert mit einer Grundgebühr, die je nach Netzwerkaktivität variiert, plus einem Trinkgeld, das an den Validator geht, der die Transaktion in einen Block aufnimmt. + +Mehr zu [Gas](/developers/docs/gas/#post-london) -Hinweis: Im öffentlichen Netzwerk basieren Transaktionsgebühren auf variablen Netzanforderungen und wie schnell Sie eine Transaktion verarbeiten möchten. Wenn Sie an einer Aufschlüsselung der Berechnung der Gebühren interessiert sind, sehen Sie sich meinen früheren Beitrag auf "Wie Transaktionen in einem Block enthalten sind" an. +Hinweis: Im öffentlichen Netzwerk sind die Transaktionsgebühren variabel und basieren auf der Netzwerknachfrage und der gewünschten Verarbeitungsgeschwindigkeit einer Transaktion. Wenn Sie an einer Aufschlüsselung der Gebührenberechnung interessiert sind, lesen Sie meinen früheren Beitrag darüber, wie Transaktionen in einen Block aufgenommen werden. -## Und atmen {#and-breathe} +## Und durchatmen {#and-breathe} -Wir sind schon eine ganze Weile dabei, daher ist jetzt ein guter Zeitpunkt für eine Pause. Im zweiten Teil unserer Serie befassen wir uns weiter mit der Materie. Einige der weiteren Konzepte: Verbindung zu einem echten Node, Smart Contracts und Token. Haben Sie weitere Fragen? Lassen Sie es mich wissen. Ihr Feedback hat Einfluss darauf, wohin die Reise geht. Anfragen können Sie gerne über [Twitter](https://twitter.com/wolovim) stellen. +Wir sind schon eine ganze Weile dabei, also scheint dies ein guter Zeitpunkt für eine Pause zu sein. Der Kaninchenbau geht weiter, und wir werden im zweiten Teil dieser Serie weiterforschen. Einige der kommenden Konzepte: Verbindung zu einem echten Node, Smart Contracts und Token. Haben Sie weitere Fragen? Lassen Sie es mich wissen! Ihr Feedback wird beeinflussen, wie wir von hier aus weitermachen. Anfragen sind über [Twitter](https://twitter.com/wolovim) willkommen. diff --git a/public/content/translations/de/developers/tutorials/all-you-can-cache/index.md b/public/content/translations/de/developers/tutorials/all-you-can-cache/index.md new file mode 100644 index 00000000000..7645215f097 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/all-you-can-cache/index.md @@ -0,0 +1,866 @@ +--- +title: "Alles, was Sie cachen können" +description: Erfahren Sie, wie Sie einen Caching-Vertrag für günstigere Rollup-Transaktionen erstellen und verwenden. +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +tags: [ "Layer 2", "Caching", "Speicher" ] +skill: intermediate +published: 2022-09-15 +lang: de +--- + +Bei der Verwendung von Rollups sind die Kosten für ein Byte in der Transaktion viel höher als die Kosten für einen Storage-Slot. Daher ist es sinnvoll, so viele Informationen wie möglich on-chain zu cachen. + +In diesem Artikel erfahren Sie, wie Sie einen Caching-Vertrag so erstellen und verwenden, dass jeder wahrscheinlich mehrfach genutzte Parameterwert zwischengespeichert wird. Nach der ersten Verwendung ist er dann mit einer viel kleineren Anzahl von Bytes verfügbar. Außerdem lernen Sie, wie Sie Off-Chain-Code schreiben, der diesen Cache nutzt. + +Wenn Sie den Artikel überspringen und nur den Quellcode sehen möchten, [finden Sie ihn hier](https://github.com/qbzzt/20220915-all-you-can-cache). Der Entwicklungs-Stack ist [Foundry](https://getfoundry.sh/introduction/installation/). + +## Gesamtdesign {#overall-design} + +Der Einfachheit halber gehen wir davon aus, dass alle Transaktionsparameter `uint256` sind und eine Länge von 32 Bytes haben. Wenn wir eine Transaktion erhalten, parsen wir jeden Parameter wie folgt: + +1. Wenn das erste Byte `0xFF` ist, nehmen Sie die nächsten 32 Bytes als Parameterwert und schreiben Sie ihn in den Cache. + +2. Wenn das erste Byte `0xFE` ist, nehmen Sie die nächsten 32 Bytes als Parameterwert, aber schreiben Sie ihn _nicht_ in den Cache. + +3. Für jeden anderen Wert nehmen Sie die oberen vier Bits als Anzahl der zusätzlichen Bytes und die unteren vier Bits als die höchstwertigen Bits des Cache-Schlüssels. Hier sind einige Beispiele: + + | Bytes in Calldata | Cache-Schlüssel | + | :---------------- | --------------: | + | 0x0F | 0x0F | + | 0x10,0x10 | 0x10 | + | 0x12,0xAC | 0x02AC | + | 0x2D,0xEA, 0xD6 | 0x0DEAD6 | + +## Cache-Manipulation {#cache-manipulation} + +Der Cache ist in [`Cache.sol`](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol) implementiert. Gehen wir ihn Zeile für Zeile durch. + +```solidity +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + + +contract Cache { + + bytes1 public constant INTO_CACHE = 0xFF; + bytes1 public constant DONT_CACHE = 0xFE; +``` + +Diese Konstanten werden verwendet, um die Sonderfälle zu interpretieren, in denen wir alle Informationen bereitstellen und sie entweder in den Cache geschrieben haben wollen oder nicht. Das Schreiben in den Cache erfordert zwei [`SSTORE`](https://www.evm.codes/#55)-Operationen in zuvor ungenutzte Storage-Slots zu einem Preis von je 22100 Gas, daher machen wir es optional. + +```solidity + + mapping(uint => uint) public val2key; +``` + +Ein [Mapping](https://www.geeksforgeeks.org/solidity/solidity-mappings/) zwischen den Werten und ihren Schlüsseln. Diese Information ist notwendig, um Werte zu kodieren, bevor Sie die Transaktion versenden. + +```solidity + // An Position n befindet sich der Wert für den Schlüssel n+1, weil wir die Null + // als „nicht im Cache“ reservieren müssen. + uint[] public key2val; +``` + +Wir können ein Array für die Zuordnung von Schlüsseln zu Werten verwenden, da wir die Schlüssel zuweisen und dies der Einfachheit halber sequenziell tun. + +```solidity + function cacheRead(uint _key) public view returns (uint) { + require(_key <= key2val.length, "Lese nicht initialisierten Cache-Eintrag"); + return key2val[_key-1]; + } // cacheRead +``` + +Lesen Sie einen Wert aus dem Cache. + +```solidity + // Einen Wert in den Cache schreiben, falls er noch nicht vorhanden ist + // Nur öffentlich, damit der Test funktioniert + function cacheWrite(uint _value) public returns (uint) { + // Wenn der Wert bereits im Cache ist, geben Sie den aktuellen Schlüssel zurück + if (val2key[_value] != 0) { + return val2key[_value]; + } +``` + +Es hat keinen Sinn, denselben Wert mehr als einmal in den Cache zu legen. Wenn der Wert bereits vorhanden ist, geben Sie einfach den vorhandenen Schlüssel zurück. + +```solidity + // Da 0xFE ein Sonderfall ist, ist der größte Schlüssel, den der Cache + // halten kann, 0x0D gefolgt von 15 0xFFs. Wenn die Cache-Länge bereits so + // groß ist, schlägt der Vorgang fehl. + // 1 2 3 4 5 6 7 8 9 A B C D E F + require(key2val.length+1 < 0x0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, + "Cache-Überlauf"); +``` + +Ich glaube nicht, dass wir jemals einen so großen Cache erhalten werden (ca. 1,8\*1037 Einträge, für deren Speicherung etwa 1027 TB erforderlich wären). Ich bin jedoch alt genug, um mich an [„640 KB wären immer genug“](https://quoteinvestigator.com/2011/09/08/640k-enough/) zu erinnern. Dieser Test ist sehr günstig. + +```solidity + // Den Wert mit dem nächsten Schlüssel schreiben + val2key[_value] = key2val.length+1; +``` + +Fügen Sie die umgekehrte Suche hinzu (vom Wert zum Schlüssel). + +```solidity + key2val.push(_value); +``` + +Fügen Sie die Vorwärtssuche hinzu (vom Schlüssel zum Wert). Da wir die Werte sequenziell zuweisen, können wir sie einfach nach dem letzten Array-Wert hinzufügen. + +```solidity + return key2val.length; + } // cacheWrite +``` + +Gibt die neue Länge von `key2val` zurück, d. h. die Zelle, in der der neue Wert gespeichert ist. + +```solidity + function _calldataVal(uint startByte, uint length) + private pure returns (uint) +``` + +Diese Funktion liest einen Wert aus Calldata beliebiger Länge (bis zu 32 Bytes, der Wortgröße). + +```solidity + { + uint _retVal; + + require(length < 0x21, + "_calldataVal-Längenlimit beträgt 32 Bytes"); + require(length + startByte <= msg.data.length, + "_calldataVal versucht, über die Calldata-Größe hinaus zu lesen"); +``` + +Diese Funktion ist intern. Wenn also der Rest des Codes korrekt geschrieben ist, sind diese Tests nicht erforderlich. Sie kosten jedoch nicht viel, also können wir sie auch gleich einbauen. + +```solidity + assembly { + _retVal := calldataload(startByte) + } +``` + +Dieser Code ist in [Yul](https://docs.soliditylang.org/en/v0.8.16/yul.html). Er liest einen 32-Byte-Wert aus Calldata. Dies funktioniert auch, wenn Calldata vor `startByte+32` aufhört, da nicht initialisierter Speicherplatz in der EVM als Null betrachtet wird. + +```solidity + _retVal = _retVal >> (256-length*8); +``` + +Wir wollen nicht unbedingt einen 32-Byte-Wert. Dadurch werden die überzähligen Bytes entfernt. + +```solidity + return _retVal; + } // _calldataVal + + + // Einen einzelnen Parameter aus Calldata lesen, beginnend bei _fromByte + function _readParam(uint _fromByte) internal + returns (uint _nextByte, uint _parameterValue) + { +``` + +Lesen Sie einen einzelnen Parameter aus Calldata. Beachten Sie, dass wir nicht nur den gelesenen Wert zurückgeben müssen, sondern auch den Ort des nächsten Bytes, da die Parameter von 1 Byte bis zu 33 Bytes lang sein können. + +```solidity + // Das erste Byte sagt uns, wie der Rest zu interpretieren ist + uint8 _firstByte; + + _firstByte = uint8(_calldataVal(_fromByte, 1)); +``` + +Solidity versucht, die Anzahl der Fehler zu reduzieren, indem es potenziell gefährliche [implizite Typumwandlungen](https://docs.soliditylang.org/en/v0.8.16/types.html#implicit-conversions) verbietet. Ein Downgrade, zum Beispiel von 256 Bit auf 8 Bit, muss explizit sein. + +```solidity + + // Den Wert lesen, aber nicht in den Cache schreiben + if (_firstByte == uint8(DONT_CACHE)) + return(_fromByte+33, _calldataVal(_fromByte+1, 32)); + + // Den Wert lesen und in den Cache schreiben + if (_firstByte == uint8(INTO_CACHE)) { + uint _param = _calldataVal(_fromByte+1, 32); + cacheWrite(_param); + return(_fromByte+33, _param); + } + + // Wenn wir hier angekommen sind, bedeutet das, dass wir aus dem Cache lesen müssen + + // Anzahl der zusätzlich zu lesenden Bytes + uint8 _extraBytes = _firstByte / 16; +``` + +Nehmen Sie das untere [Nibble](https://en.wikipedia.org/wiki/Nibble) und kombinieren Sie es mit den anderen Bytes, um den Wert aus dem Cache zu lesen. + +```solidity + uint _key = (uint256(_firstByte & 0x0F) << (8*_extraBytes)) + + _calldataVal(_fromByte+1, _extraBytes); + + return (_fromByte+_extraBytes+1, cacheRead(_key)); + + } // _readParam + + + // n Parameter lesen (Funktionen wissen, wie viele Parameter sie erwarten) + function _readParams(uint _paramNum) internal returns (uint[] memory) { +``` + +Wir könnten die Anzahl der Parameter, die wir haben, aus Calldata selbst entnehmen, aber die Funktionen, die uns aufrufen, wissen, wie viele Parameter sie erwarten. Es ist einfacher, wenn sie es uns sagen. + +```solidity + // Die Parameter, die wir lesen + uint[] memory params = new uint[](_paramNum); + + // Die Parameter beginnen bei Byte 4, davor steht die Funktionssignatur + uint _atByte = 4; + + for(uint i=0; i<_paramNum; i++) { + (_atByte, params[i]) = _readParam(_atByte); + } +``` + +Lesen Sie die Parameter, bis Sie die benötigte Anzahl haben. Wenn wir das Ende von Calldata überschreiten, wird `_readParams` den Aufruf rückgängig machen. + +```solidity + + return(params); + } // readParams + + // Zum Testen von _readParams, das Lesen von vier Parametern testen + function fourParam() public + returns (uint256,uint256,uint256,uint256) + { + uint[] memory params; + params = _readParams(4); + return (params[0], params[1], params[2], params[3]); + } // fourParam +``` + +Ein großer Vorteil von Foundry ist, dass Tests in Solidity geschrieben werden können ([siehe Testen des Caches unten](#testing-the-cache)). Dies macht Unit-Tests viel einfacher. Dies ist eine Funktion, die vier Parameter liest und sie zurückgibt, damit der Test überprüfen kann, ob sie korrekt waren. + +```solidity + // Einen Wert abrufen, Bytes zurückgeben, die ihn kodieren (wenn möglich unter Verwendung des Caches) + function encodeVal(uint _val) public view returns(bytes memory) { +``` + +`encodeVal` ist eine Funktion, die Off-Chain-Code aufruft, um Calldata zu erstellen, die den Cache nutzen. Sie empfängt einen einzelnen Wert und gibt die Bytes zurück, die ihn kodieren. Diese Funktion ist eine `view`, erfordert also keine Transaktion und kostet bei externem Aufruf kein Gas. + +```solidity + uint _key = val2key[_val]; + + // Der Wert ist noch nicht im Cache, fügen Sie ihn hinzu + if (_key == 0) + return bytes.concat(INTO_CACHE, bytes32(_val)); +``` + +In der [EVM](/entwickler/docs/evm/) wird davon ausgegangen, dass jeder nicht initialisierte Speicher Null ist. Wenn wir also nach dem Schlüssel für einen nicht vorhandenen Wert suchen, erhalten wir eine Null. In diesem Fall sind die Bytes, die ihn kodieren, `INTO_CACHE` (damit er beim nächsten Mal zwischengespeichert wird), gefolgt von dem tatsächlichen Wert. + +```solidity + // Wenn der Schlüssel <0x10 ist, geben Sie ihn als einzelnes Byte zurück + if (_key < 0x10) + return bytes.concat(bytes1(uint8(_key))); +``` + +Einzelne Bytes sind am einfachsten. Wir verwenden einfach [`bytes.concat`](https://docs.soliditylang.org/en/v0.8.16/types.html#the-functions-bytes-concat-and-string-concat), um einen `bytes`-Typ in ein Byte-Array zu verwandeln, das eine beliebige Länge haben kann. Trotz des Namens funktioniert es auch mit nur einem Argument einwandfrei. + +```solidity + // Zwei-Byte-Wert, kodiert als 0x1vvv + if (_key < 0x1000) + return bytes.concat(bytes2(uint16(_key) | 0x1000)); +``` + +Wenn wir einen Schlüssel haben, der kleiner als 163 ist, können wir ihn in zwei Bytes ausdrücken. Wir konvertieren zuerst `_key`, einen 256-Bit-Wert, in einen 16-Bit-Wert und verwenden ein logisches Oder, um die Anzahl der zusätzlichen Bytes zum ersten Byte hinzuzufügen. Dann wandeln wir es einfach in einen `bytes2`-Wert um, der in `bytes` umgewandelt werden kann. + +```solidity + // Es gibt wahrscheinlich eine clevere Möglichkeit, die folgenden Zeilen als Schleife auszuführen, + // aber es ist eine View-Funktion, also optimiere ich für die Zeit des Programmierers und + // die Einfachheit. + + if (_key < 16*256**2) + return bytes.concat(bytes3(uint24(_key) | (0x2 * 16 * 256**2))); + if (_key < 16*256**3) + return bytes.concat(bytes4(uint32(_key) | (0x3 * 16 * 256**3))); + . + . + . + if (_key < 16*256**14) + return bytes.concat(bytes15(uint120(_key) | (0xE * 16 * 256**14))); + if (_key < 16*256**15) + return bytes.concat(bytes16(uint128(_key) | (0xF * 16 * 256**15))); +``` + +Die anderen Werte (3 Bytes, 4 Bytes usw.) werden auf die gleiche Weise behandelt, nur mit unterschiedlichen Feldgrößen. + +```solidity + // Wenn wir hier ankommen, ist etwas falsch. + revert("Fehler in encodeVal, sollte nicht passieren"); +``` + +Wenn wir hier ankommen, bedeutet das, dass wir einen Schlüssel erhalten haben, der nicht kleiner als 16\*25615 ist. Aber `cacheWrite` begrenzt die Schlüssel, sodass wir nicht einmal bis zu 14\*25616 kommen (was ein erstes Byte von 0xFE hätte, also wie `DONT_CACHE` aussehen würde). Aber es kostet uns nicht viel, einen Test hinzuzufügen, für den Fall, dass ein zukünftiger Programmierer einen Fehler einbaut. + +```solidity + } // encodeVal + +} // Cache +``` + +### Testen des Caches {#testing-the-cache} + +Einer der Vorteile von Foundry ist, dass [Sie Tests in Solidity schreiben können](https://getfoundry.sh/forge/tests/overview/), was das Schreiben von Unit-Tests erleichtert. Die Tests für die `Cache`-Klasse sind [hier](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/Cache.t.sol). Da der Testcode repetitiv ist, wie es bei Tests oft der Fall ist, werden in diesem Artikel nur die interessanten Teile erklärt. + +```solidity +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "forge-std/Test.sol"; + + +// Need to run `forge test -vv` for the console. +import "forge-std/console.sol"; +``` + +Dies ist nur eine Boilerplate, die notwendig ist, um das Testpaket und `console.log` zu verwenden. + +```solidity +import "src/Cache.sol"; +``` + +Wir müssen den Vertrag kennen, den wir testen. + +```solidity +contract CacheTest is Test { + Cache cache; + + function setUp() public { + cache = new Cache(); + } +``` + +Die `setUp`-Funktion wird vor jedem Test aufgerufen. In diesem Fall erstellen wir einfach einen neuen Cache, damit sich unsere Tests nicht gegenseitig beeinflussen. + +```solidity + function testCaching() public { +``` + +Tests sind Funktionen, deren Namen mit `test` beginnen. Diese Funktion überprüft die grundlegende Cache-Funktionalität, das Schreiben von Werten und das erneute Lesen. + +```solidity + for(uint i=1; i<5000; i++) { + cache.cacheWrite(i*i); + } + + for(uint i=1; i<5000; i++) { + assertEq(cache.cacheRead(i), i*i); +``` + +So führen Sie das eigentliche Testen mit [`assert...`-Funktionen](https://getfoundry.sh/reference/forge-std/std-assertions/) durch. In diesem Fall prüfen wir, ob der Wert, den wir geschrieben haben, auch der ist, den wir lesen. Wir können das Ergebnis von `cache.cacheWrite` verwerfen, da wir wissen, dass Cache-Schlüssel linear vergeben werden. + +```solidity + } + } // testCaching + + + // Cache the same value multiple times, ensure that the key stays + // the same + function testRepeatCaching() public { + for(uint i=1; i<100; i++) { + uint _key1 = cache.cacheWrite(i); + uint _key2 = cache.cacheWrite(i); + assertEq(_key1, _key2); + } +``` + +Zuerst schreiben wir jeden Wert zweimal in den Cache und stellen sicher, dass die Schlüssel identisch sind (was bedeutet, dass der zweite Schreibvorgang nicht wirklich stattgefunden hat). + +```solidity + for(uint i=1; i<100; i+=3) { + uint _key = cache.cacheWrite(i); + assertEq(_key, i); + } + } // testRepeatCaching +``` + +Theoretisch könnte es einen Fehler geben, der sich nicht auf aufeinanderfolgende Cache-Schreibvorgänge auswirkt. Hier führen wir also einige Schreibvorgänge durch, die nicht aufeinanderfolgen, und sehen, dass die Werte immer noch nicht neu geschrieben werden. + +```solidity + // Read a uint from a memory buffer (to make sure we get back the parameters + // we sent out) + function toUint256(bytes memory _bytes, uint256 _start) internal pure + returns (uint256) +``` + +Liest ein 256-Bit-Wort aus einem `bytes memory`-Puffer. Mit dieser Hilfsfunktion können wir überprüfen, ob wir die richtigen Ergebnisse erhalten, wenn wir einen Funktionsaufruf ausführen, der den Cache verwendet. + +```solidity + { + require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); + uint256 tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0x20), _start)) + } +``` + +Yul unterstützt keine Datenstrukturen jenseits von `uint256`. Wenn Sie also auf eine komplexere Datenstruktur wie den Speicherpuffer `_bytes` verweisen, erhalten Sie die Adresse dieser Struktur. Solidity speichert `bytes memory`-Werte als 32-Byte-Wort, das die Länge enthält, gefolgt von den eigentlichen Bytes. Um also Byte-Nummer `_start` zu erhalten, müssen wir `_bytes+32+_start` berechnen. + +```solidity + + return tempUint; + } // toUint256 + + // Function signature for fourParams(), courtesy of + // https://www.4byte.directory/signatures/?bytes4_signature=0x3edc1e6d + bytes4 constant FOUR_PARAMS = 0x3edc1e6d; + + // Just some constant values to see we're getting the correct values back + uint256 constant VAL_A = 0xDEAD60A7; + uint256 constant VAL_B = 0xBEEF; + uint256 constant VAL_C = 0x600D; + uint256 constant VAL_D = 0x600D60A7; +``` + +Einige Konstanten, die wir für Tests benötigen. + +```solidity + function testReadParam() public { +``` + +Rufen Sie `fourParams()` auf, eine Funktion, die `readParams` verwendet, um zu testen, ob wir Parameter korrekt lesen können. + +```solidity + address _cacheAddr = address(cache); + bool _success; + bytes memory _callInput; + bytes memory _callOutput; +``` + +Wir können den normalen ABI-Mechanismus nicht verwenden, um eine Funktion über den Cache aufzurufen, daher müssen wir den Low-Level-Mechanismus [`
.call()`](https://docs.soliditylang.org/en/v0.8.16/types.html#members-of-addresses) verwenden. Dieser Mechanismus verwendet `bytes memory` als Eingabe und gibt diese (sowie einen booleschen Wert) als Ausgabe zurück. + +```solidity + // Erster Aufruf, der Cache ist leer + _callInput = bytes.concat( + FOUR_PARAMS, +``` + +Es ist nützlich, wenn derselbe Vertrag sowohl zwischengespeicherte Funktionen (für Aufrufe direkt aus Transaktionen) als auch nicht zwischengespeicherte Funktionen (für Aufrufe von anderen Smart Contracts) unterstützt. Dazu müssen wir uns weiterhin auf den Solidity-Mechanismus verlassen, um die richtige Funktion aufzurufen, anstatt alles in [eine `fallback`-Funktion](https://docs.soliditylang.org/en/v0.8.16/contracts.html#fallback-function) zu packen. Dies macht die Zusammensetzbarkeit wesentlich einfacher. Ein einzelnes Byte würde in den meisten Fällen ausreichen, um die Funktion zu identifizieren, sodass wir drei Bytes (16\*3=48 Gas) verschwenden. Als ich das schrieb, kosteten diese 48 Gas jedoch 0,07 Cent, was ein angemessener Preis für einfacheren, weniger fehleranfälligen Code ist. + +```solidity + // Erster Wert, zum Cache hinzufügen + cache.INTO_CACHE(), + bytes32(VAL_A), +``` + +Der erste Wert: Eine Markierung, die besagt, dass es sich um einen vollständigen Wert handelt, der in den Cache geschrieben werden muss, gefolgt von den 32 Bytes des Wertes. Die anderen drei Werte sind ähnlich, mit der Ausnahme, dass `VAL_B` nicht in den Cache geschrieben wird und `VAL_C` sowohl der dritte als auch der vierte Parameter ist. + +```solidity + . + . + . + ); + (_success, _callOutput) = _cacheAddr.call(_callInput); +``` + +Hier rufen wir den `Cache`-Vertrag auf. + +```solidity + assertEq(_success, true); +``` + +Wir erwarten, dass der Anruf erfolgreich ist. + +```solidity + assertEq(cache.cacheRead(1), VAL_A); + assertEq(cache.cacheRead(2), VAL_C); +``` + +Wir beginnen mit einem leeren Cache und fügen dann `VAL_A` gefolgt von `VAL_C` hinzu. Wir erwarten, dass der erste den Schlüssel 1 und der zweite den Schlüssel 2 hat. + +``` + assertEq(toUint256(_callOutput,0), VAL_A); + assertEq(toUint256(_callOutput,32), VAL_B); + assertEq(toUint256(_callOutput,64), VAL_C); + assertEq(toUint256(_callOutput,96), VAL_C); +``` + +Die Ausgabe sind die vier Parameter. Hier überprüfen wir, ob es richtig ist. + +```solidity + // Zweiter Aufruf, wir können den Cache verwenden + _callInput = bytes.concat( + FOUR_PARAMS, + + // Erster Wert im Cache + bytes1(0x01), +``` + +Cache-Schlüssel unter 16 sind nur ein Byte lang. + +```solidity + // Zweiter Wert, nicht zum Cache hinzufügen + cache.DONT_CACHE(), + bytes32(VAL_B), + + // Dritter und vierter Wert, gleicher Wert + bytes1(0x02), + bytes1(0x02) + ); + . + . + . + } // testReadParam +``` + +Die Tests nach dem Aufruf sind identisch mit denen nach dem ersten Aufruf. + +```solidity + function testEncodeVal() public { +``` + +Diese Funktion ist ähnlich wie `testReadParam`, nur dass wir die Parameter nicht explizit schreiben, sondern `encodeVal()` verwenden. + +```solidity + . + . + . + _callInput = bytes.concat( + FOUR_PARAMS, + cache.encodeVal(VAL_A), + cache.encodeVal(VAL_B), + cache.encodeVal(VAL_C), + cache.encodeVal(VAL_D) + ); + . + . + . + assertEq(_callInput.length, 4+1*4); + } // testEncodeVal +``` + +Der einzige zusätzliche Test in `testEncodeVal()` besteht darin, zu überprüfen, ob die Länge von `_callInput` korrekt ist. Für den ersten Aufruf ist es 4+33\*4. Beim zweiten, bei dem jeder Wert bereits im Cache ist, ist es 4+1\*4. + +```solidity + // Testen Sie encodeVal, wenn der Schlüssel mehr als ein einzelnes Byte hat + // Maximal drei Bytes, da das Füllen des Caches auf vier Bytes zu lange dauert. + function testEncodeValBig() public { + // Legen Sie eine Reihe von Werten in den Cache. + // Um die Dinge einfach zu halten, verwenden Sie den Schlüssel n für den Wert n. + for(uint i=1; i<0x1FFF; i++) { + cache.cacheWrite(i); + } +``` + +Die obige Funktion `testEncodeVal` schreibt nur vier Werte in den Cache, so dass [der Teil der Funktion, der sich mit Multi-Byte-Werten befasst](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol#L144-L171), nicht überprüft wird. Aber dieser Code ist kompliziert und fehleranfällig. + +Der erste Teil dieser Funktion ist eine Schleife, die alle Werte von 1 bis 0x1FFF in der richtigen Reihenfolge in den Cache schreibt, damit wir diese Werte kodieren können und wissen, wohin sie gehen. + +```solidity + . + . + . + + _callInput = bytes.concat( + FOUR_PARAMS, + cache.encodeVal(0x000F), // Ein Byte 0x0F + cache.encodeVal(0x0010), // Zwei Bytes 0x1010 + cache.encodeVal(0x0100), // Zwei Bytes 0x1100 + cache.encodeVal(0x1000) // Drei Bytes 0x201000 + ); +``` + +Testen Sie Ein-Byte-, Zwei-Byte- und Drei-Byte-Werte. Wir testen nicht darüber hinaus, da es zu lange dauern würde, genügend Stack-Einträge zu schreiben (mindestens 0x10000000, etwa eine Viertelmilliarde). + +```solidity + . + . + . + . + } // testEncodeValBig + + + // Test, was bei einem zu kleinen Puffer zu einem Revert führt + function testShortCalldata() public { +``` + +Testen Sie, was im anormalen Fall passiert, wenn nicht genügend Parameter vorhanden sind. + +```solidity + . + . + . + (_success, _callOutput) = _cacheAddr.call(_callInput); + assertEq(_success, false); + } // testShortCalldata +``` + +Da es zurückgesetzt wird, sollte das Ergebnis, das wir erhalten, `false` sein. + +``` + // Aufruf mit nicht vorhandenen Cache-Schlüsseln + function testNoCacheKey() public { + . + . + . + _callInput = bytes.concat( + FOUR_PARAMS, + + // Erster Wert, zum Cache hinzufügen + cache.INTO_CACHE(), + bytes32(VAL_A), + + // Zweiter Wert + bytes1(0x0F), + bytes2(0x1234), + bytes11(0xA10102030405060708090A) + ); +``` + +Diese Funktion erhält vier vollkommen legitime Parameter, nur dass der Cache leer ist und es keine Werte zum Lesen gibt. + +```solidity + . + . + . + // Test, ob bei einem übermäßig langen Puffer alles funktioniert + function testLongCalldata() public { + address _cacheAddr = address(cache); + bool _success; + bytes memory _callInput; + bytes memory _callOutput; + + // Erster Aufruf, der Cache ist leer + _callInput = bytes.concat( + FOUR_PARAMS, + + // Erster Wert, zum Cache hinzufügen + cache.INTO_CACHE(), bytes32(VAL_A), + + // Zweiter Wert, zum Cache hinzufügen + cache.INTO_CACHE(), bytes32(VAL_B), + + // Dritter Wert, zum Cache hinzufügen + cache.INTO_CACHE(), bytes32(VAL_C), + + // Vierter Wert, zum Cache hinzufügen + cache.INTO_CACHE(), bytes32(VAL_D), + + // Und ein weiterer Wert für „Viel Glück“ + bytes4(0x31112233) + ); +``` + +Diese Funktion sendet fünf Werte. Wir wissen, dass der fünfte Wert ignoriert wird, weil er kein gültiger Cache-Eintrag ist, was zu einer Zurückweisung geführt hätte, wenn er nicht enthalten gewesen wäre. + +```solidity + (_success, _callOutput) = _cacheAddr.call(_callInput); + assertEq(_success, true); + . + . + . + } // testLongCalldata + +} // CacheTest + +``` + +## Eine Beispielanwendung {#a-sample-app} + +Tests in Solidity zu schreiben ist schön und gut, aber am Ende muss eine Dapp in der Lage sein, Anfragen von außerhalb der Kette zu verarbeiten, um nützlich zu sein. Dieser Artikel zeigt, wie man Caching in einer Dapp mit `WORM` verwendet, was für „Write Once, Read Many“ steht. Wenn ein Schlüssel noch nicht geschrieben ist, können Sie einen Wert darauf schreiben. Wenn der Schlüssel bereits geschrieben ist, erhalten Sie einen Revert. + +### Der Vertrag {#the-contract} + +[Dies ist der Vertrag](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/WORM.sol). Es wiederholt größtenteils, was wir bereits mit `Cache` und `CacheTest` gemacht haben, also behandeln wir nur die Teile, die interessant sind. + +```solidity +import "./Cache.sol"; + +contract WORM is Cache { +``` + +Der einfachste Weg, `Cache` zu verwenden, ist, es in unserem eigenen Vertrag zu erben. + +```solidity + function writeEntryCached() external { + uint[] memory params = _readParams(2); + writeEntry(params[0], params[1]); + } // writeEntryCached +``` + +Diese Funktion ist ähnlich wie `fourParam` in `CacheTest` oben. Da wir die ABI-Spezifikationen nicht befolgen, ist es am besten, keine Parameter in der Funktion zu deklarieren. + +```solidity + // Machen Sie es einfacher, uns anzurufen + // Funktionssignatur für writeEntryCached(), mit freundlicher Genehmigung von + // https://www.4byte.directory/signatures/?bytes4_signature=0xe4e4f2d3 + bytes4 constant public WRITE_ENTRY_CACHED = 0xe4e4f2d3; +``` + +Der externe Code, der `writeEntryCached` aufruft, muss die Calldata manuell erstellen, anstatt `worm.writeEntryCached` zu verwenden, da wir die ABI-Spezifikationen nicht befolgen. Dieser konstante Wert erleichtert das Schreiben. + +Beachten Sie, dass wir `WRITE_ENTRY_CACHED` zwar als Zustandsvariable definieren, zum externen Lesen jedoch die Getter-Funktion `worm.WRITE_ENTRY_CACHED()` verwendet werden muss. + +```solidity + function readEntry(uint key) public view + returns (uint _value, address _writtenBy, uint _writtenAtBlock) +``` + +Die Lesefunktion ist eine `View`-Funktion, erfordert also keine Transaktion und kostet kein Gas. Daher gibt es keinen Vorteil, den Cache für den Parameter zu verwenden. Bei Ansichtsfunktionen ist es am besten, den einfacheren Standardmechanismus zu verwenden. + +### Der Test-Code {#the-testing-code} + +[Dies ist der Test-Code für den Vertrag](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/WORM.t.sol). Nochmals, lassen Sie uns nur das Interessante betrachten. + +```solidity + function testWReadWrite() public { + worm.writeEntry(0xDEAD, 0x60A7); + + vm.expectRevert(bytes("Eintrag bereits geschrieben")); + worm.writeEntry(0xDEAD, 0xBEEF); +``` + +[Dies (`vm.expectRevert`)](https://book.getfoundry.sh/cheatcodes/expect-revert#expectrevert) ist, wie wir in einem Foundry-Test angeben, dass der nächste Aufruf fehlschlagen sollte, und der gemeldete Grund für einen Fehler. Dies gilt, wenn wir die Syntax `. verwenden()` anstatt die Calldata zu erstellen und den Vertrag über die Low-Level-Schnittstelle aufzurufen (`.call()` usw.). + +```solidity + function testReadWriteCached() public { + uint cacheGoat = worm.cacheWrite(0x60A7); +``` + +Hier verwenden wir die Tatsache, dass `cacheWrite` den Cache-Schlüssel zurückgibt. Dies ist nichts, was wir in der Produktion erwarten würden, da `cacheWrite` den Zustand ändert und daher nur während einer Transaktion aufgerufen werden kann. Transaktionen haben keine Rückgabewerte. Wenn sie Ergebnisse haben, sollen diese als Ereignisse ausgegeben werden. Der Rückgabewert von `cacheWrite` ist also nur von On-Chain-Code aus zugänglich, und On-Chain-Code benötigt kein Parameter-Caching. + +```solidity + (_success,) = address(worm).call(_callInput); +``` + +So teilen wir Solidity mit, dass `.call()` zwar zwei Rückgabewerte hat, wir aber nur am ersten interessiert sind. + +```solidity + (_success,) = address(worm).call(_callInput); + assertEq(_success, false); +``` + +Da wir die Low-Level-Funktion `
.call()` verwenden, können wir `vm.expectRevert()` nicht verwenden und müssen uns den booleschen Erfolgswert ansehen, den wir vom Aufruf erhalten. + +```solidity + event EntryWritten(uint indexed key, uint indexed value); + + . + . + . + + _callInput = bytes.concat( + worm.WRITE_ENTRY_CACHED(), worm.encodeVal(a), worm.encodeVal(b)); + vm.expectEmit(true, true, false, false); + emit EntryWritten(a, b); + (_success,) = address(worm).call(_callInput); +``` + +So überprüfen wir, ob der Code in Foundry [ein Ereignis korrekt ausgibt](https://getfoundry.sh/reference/cheatcodes/expect-emit/). + +### Der Client {#the-client} + +Was man mit Solidity-Tests nicht bekommt, ist JavaScript-Code, den man kopieren und in die eigene Anwendung einfügen kann. Um diesen Code zu schreiben, habe ich WORM im [Optimism Goerli](https://community.optimism.io/docs/useful-tools/networks/#optimism-goerli), dem neuen Testnet von [Optimism](https://www.optimism.io/), bereitgestellt. Es befindet sich an der Adresse [`0xd34335b1d818cee54e3323d3246bd31d94e6a78a`](https://goerli-optimism.etherscan.io/address/0xd34335b1d818cee54e3323d3246bd31d94e6a78a). + +[Sie können den JavaScript-Code für den Client hier sehen](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/javascript/index.js). So verwenden Sie es: + +1. Klonen Sie das Git-Repository: + + ```sh + git clone https://github.com/qbzzt/20220915-all-you-can-cache.git + ``` + +2. Installieren Sie die erforderlichen Pakete: + + ```sh + cd javascript + yarn + ``` + +3. Kopieren Sie die Konfigurationsdatei: + + ```sh + cp .env.example .env + ``` + +4. Bearbeiten Sie `.env` für Ihre Konfiguration: + + | Parameter | Wert | + | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | + | MNEMONIC | Die Mnemonik für ein Konto, das genug ETH hat, um eine Transaktion zu bezahlen. [Hier können Sie kostenlose ETH für das Optimism Goerli-Netzwerk erhalten](https://optimismfaucet.xyz/). | + | OPTIMISM_GOERLI_URL | URL zu Optimism Goerli. Der öffentliche Endpunkt `https://goerli.optimism.io` ist ratenbegrenzt, aber für das, was wir hier brauchen, ausreichend. | + +5. Führen Sie `index.js` aus. + + ```sh + node index.js + ``` + + Diese Beispielanwendung schreibt zunächst einen Eintrag in WORM und zeigt die Calldata und einen Link zur Transaktion auf Etherscan an. Dann liest es diesen Eintrag zurück und zeigt den verwendeten Schlüssel und die Werte im Eintrag an (Wert, Blocknummer und Autor). + +Der größte Teil des Clients ist normales Dapp-JavaScript. Auch hier gehen wir nur die interessanten Teile durch. + +```javascript +. +. +. +const main = async () => { + const func = await worm.WRITE_ENTRY_CACHED() + + // Jedes Mal einen neuen Schlüssel benötigen + const key = await worm.encodeVal(Number(new Date())) +``` + +Ein bestimmter Slot kann nur einmal beschrieben werden, daher verwenden wir den Zeitstempel, um sicherzustellen, dass wir keine Slots wiederverwenden. + +```javascript +const val = await worm.encodeVal("0x600D") + +// Einen Eintrag schreiben +const calldata = func + key.slice(2) + val.slice(2) +``` + +Ethers erwartet, dass die Aufrufdaten (call data) eine Hex-Zeichenfolge sind, also `0x` gefolgt von einer geraden Anzahl hexadezimaler Ziffern. Da `key` und `val` beide mit `0x` beginnen, müssen wir diese Header entfernen. + +```javascript +const tx = await worm.populateTransaction.writeEntryCached() +tx.data = calldata + +sentTx = await wallet.sendTransaction(tx) +``` + +Wie beim Solidity-Testcode können wir eine zwischengespeicherte Funktion nicht normal aufrufen. Stattdessen müssen wir einen Mechanismus auf niedrigerer Ebene verwenden. + +```javascript + . + . + . + // Lesen des gerade geschriebenen Eintrags + const realKey = '0x' + key.slice(4) // das FF-Flag entfernen + const entryRead = await worm.readEntry(realKey) + . + . + . +``` + +Zum Lesen von Einträgen können wir den normalen Mechanismus verwenden. Es ist nicht erforderlich, Parameter-Caching mit `view`-Funktionen zu verwenden. + +## Fazit {#conclusion} + +Der Code in diesem Artikel ist ein Proof of Concept, dessen Zweck es ist, die Idee leicht verständlich zu machen. Für ein produktionsreifes System sollten Sie möglicherweise einige zusätzliche Funktionen implementieren: + +- Behandeln Sie Werte, die nicht `uint256` sind. Zum Beispiel Zeichenketten. +- Anstelle eines globalen Caches könnten Sie eine Zuordnung zwischen Benutzern und Caches haben. Verschiedene Benutzer verwenden unterschiedliche Werte. +- Werte, die für Adressen verwendet werden, unterscheiden sich von denen, die für andere Zwecke verwendet werden. Es könnte sinnvoll sein, einen separaten Cache nur für Adressen zu haben. +- Derzeit basieren die Cache-Schlüssel auf einem „First come, smallest key“-Algorithmus. Die ersten sechzehn Werte können als einzelnes Byte gesendet werden. Die nächsten 4080 Werte können als zwei Bytes gesendet werden. Die nächste Million Werte sind drei Bytes usw. Ein Produktionssystem sollte Nutzungszähler für Cache-Einträge führen und diese so neu organisieren, dass die sechzehn _häufigsten_ Werte ein Byte, die nächsten 4080 häufigsten Werte zwei Bytes usw. sind. + + Dies ist jedoch eine potenziell gefährliche Operation. Stellen Sie sich die folgende Abfolge von Ereignissen vor: + + 1. Noam Naive ruft `encodeVal` auf, um die Adresse zu kodieren, an die er Token senden möchte. Diese Adresse ist eine der ersten, die in der Anwendung verwendet wird, daher ist der kodierte Wert 0x06. Dies ist eine `view`-Funktion, keine Transaktion, also ist es zwischen Noam und dem von ihm verwendeten Knoten, und niemand sonst weiß davon. + + 2. Owen Owner führt die Neuanordnung des Caches durch. Sehr wenige Leute verwenden diese Adresse tatsächlich, daher ist sie jetzt als 0x201122 kodiert. Ein anderer Wert, 1018, wird 0x06 zugewiesen. + + 3. Noam Naive sendet seine Token an 0x06. Sie gehen an die Adresse `0x0000000000000000000000000de0b6b3a7640000`, und da niemand den privaten Schlüssel für diese Adresse kennt, bleiben sie dort einfach stecken. Noam ist _nicht glücklich_. + + Es gibt Möglichkeiten, dieses Problem und das damit zusammenhängende Problem von Transaktionen, die sich während der Neuanordnung des Caches im Mempool befinden, zu lösen, aber Sie müssen sich dessen bewusst sein. + +Ich habe hier Caching mit Optimism demonstriert, weil ich ein Optimism-Mitarbeiter bin und dies das Rollup ist, das ich am besten kenne. Aber es sollte mit jedem Rollup funktionieren, das minimale Kosten für die interne Verarbeitung verlangt, sodass im Vergleich dazu das Schreiben der Transaktionsdaten auf L1 der Hauptaufwand ist. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). + diff --git a/public/content/translations/de/developers/tutorials/app-plasma/index.md b/public/content/translations/de/developers/tutorials/app-plasma/index.md new file mode 100644 index 00000000000..df5ca6104a5 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/app-plasma/index.md @@ -0,0 +1,1261 @@ +--- +title: Schreiben Sie ein App-spezifisches Plasma, das die Privatsphäre wahrt +description: In diesem Tutorial bauen wir eine halbgeheime Bank für Einlagen. Die Bank ist eine zentralisierte Komponente; sie kennt das Guthaben jedes Benutzers. Diese Informationen werden jedoch nicht onchain gespeichert. Stattdessen veröffentlicht die Bank einen Hash des Zustands. Jedes Mal, wenn eine Transaktion stattfindet, veröffentlicht die Bank den neuen Hash, zusammen mit einem Zero-Knowledge-Proof, dass sie eine signierte Transaktion hat, die den Hash-Zustand in den neuen ändert. Nach der Lektüre dieses Tutorials werden Sie nicht nur verstehen, wie man Zero-Knowledge-Proofs verwendet, sondern auch, warum man sie verwendet und wie man dies sicher tut. +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +tags: + [ + "Zero-Knowledge", + "Server", + "Off-Chain", + "Privatsphäre" + ] +skill: advanced +lang: de +published: 2025-10-15 +--- + +## Einführung {#introduction} + +Im Gegensatz zu [Rollups](/developers/docs/scaling/zk-rollups/) nutzen [Plasmas](/developers/docs/scaling/plasma) das Ethereum-Mainnet für die Integrität, aber nicht für die Verfügbarkeit. In diesem Artikel schreiben wir eine Anwendung, die sich wie ein Plasma verhält, wobei Ethereum die Integrität (keine unbefugten Änderungen), aber nicht die Verfügbarkeit (eine zentralisierte Komponente kann ausfallen und das gesamte System lahmlegen) garantiert. + +Die Anwendung, die wir hier schreiben, ist eine Bank, die die Privatsphäre wahrt. Verschiedene Adressen haben Konten mit Guthaben, und sie können Geld (ETH) an andere Konten senden. Die Bank veröffentlicht Hashes des Zustands (Konten und deren Guthaben) und Transaktionen, hält aber die tatsächlichen Guthaben offchain, wo sie privat bleiben können. + +## Design {#design} + +Dies ist kein produktionsreifes System, sondern ein Lehrmittel. Als solches ist es mit mehreren vereinfachenden Annahmen geschrieben. + +- Fester Konten-Pool. Es gibt eine bestimmte Anzahl von Konten, und jedes Konto gehört zu einer vorbestimmten Adresse. Dies sorgt für ein viel einfacheres System, da es schwierig ist, Datenstrukturen variabler Größe in Zero-Knowledge-Proofs zu handhaben. Für ein produktionsreifes System können wir die [Merkle-Root](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) als Zustands-Hash verwenden und Merkle-Proofs für die erforderlichen Guthaben bereitstellen. + +- Arbeitsspeicher. Auf einem Produktionssystem müssen wir alle Kontoguthaben auf die Festplatte schreiben, um sie im Falle eines Neustarts zu erhalten. Hier ist es in Ordnung, wenn die Informationen einfach verloren gehen. + +- Nur Überweisungen. Ein Produktionssystem würde eine Möglichkeit erfordern, Vermögenswerte bei der Bank einzuzahlen und abzuheben. Aber der Zweck hier ist nur, das Konzept zu veranschaulichen, daher ist diese Bank auf Überweisungen beschränkt. + +### Zero-Knowledge-Proofs {#zero-knowledge-proofs} + +Auf einer fundamentalen Ebene zeigt ein Zero-Knowledge-Proof, dass der Beweisführer einige Daten, _Datenprivat_, kennt, sodass eine Beziehung _Beziehung_ zwischen einigen öffentlichen Daten, _Datenöffentlich_, und _Datenprivat_ besteht. Der Verifizierer kennt _Beziehung_ und _Datenöffentlich_. + +Um die Privatsphäre zu wahren, müssen die Zustände und die Transaktionen privat sein. Aber um die Integrität zu gewährleisten, muss der [kryptographische Hash](https://de.wikipedia.org/wiki/Kryptographische_Hashfunktion) der Zustände öffentlich sein. Um den Leuten, die Transaktionen einreichen, zu beweisen, dass diese Transaktionen wirklich stattgefunden haben, müssen wir auch Transaktions-Hashes veröffentlichen. + +In den meisten Fällen sind _Datenprivat_ die Eingabe für das Zero-Knowledge-Proof-Programm und _Datenöffentlich_ die Ausgabe. + +Diese Felder in _Datenprivat_: + +- _Zustandn_, der alte Zustand +- _Zustandn+1_, der neue Zustand +- _Transaktion_, eine Transaktion, die den alten Zustand in den neuen ändert. Diese Transaktion muss diese Felder enthalten: + - _Zieladresse_, die die Überweisung empfängt + - _Betrag_, der überwiesen wird + - _Nonce_, um sicherzustellen, dass jede Transaktion nur einmal verarbeitet werden kann. + Die Quelladresse muss nicht in der Transaktion enthalten sein, da sie aus der Signatur wiederhergestellt werden kann. +- _Signatur_, eine Signatur, die zur Durchführung der Transaktion berechtigt ist. In unserem Fall ist die einzige Adresse, die zur Durchführung einer Transaktion berechtigt ist, die Quelladresse. Da unser Zero-Knowledge-System so funktioniert, wie es funktioniert, benötigen wir zusätzlich zur Ethereum-Signatur auch den öffentlichen Schlüssel des Kontos. + +Dies sind die Felder in _Datenöffentlich_: + +- _Hash(Zustandn)_, der Hash des alten Zustands +- _Hash(Zustandn+1)_, der Hash des neuen Zustands +- _Hash(Transaktion)_, der Hash der Transaktion, der den Zustand von _Zustandn_ zu _Zustandn+1_ ändert. + +Die Beziehung überprüft mehrere Bedingungen: + +- Die öffentlichen Hashes sind tatsächlich die korrekten Hashes für die privaten Felder. +- Die Transaktion, angewendet auf den alten Zustand, ergibt den neuen Zustand. +- Die Signatur stammt von der Quelladresse der Transaktion. + +Aufgrund der Eigenschaften von kryptographischen Hash-Funktionen ist der Beweis dieser Bedingungen ausreichend, um die Integrität zu gewährleisten. + +### Datenstrukturen {#data-structures} + +Die primäre Datenstruktur ist der Zustand, der vom Server gehalten wird. Für jedes Konto verfolgt der Server das Kontoguthaben und eine [Nonce](https://de.wikipedia.org/wiki/Nonce), die verwendet wird, um [Replay-Angriffe](https://de.wikipedia.org/wiki/Replay-Angriff) zu verhindern. + +### Komponenten {#components} + +Dieses System erfordert zwei Komponenten: + +- Der _Server_, der Transaktionen empfängt, verarbeitet und Hashes zusammen mit den Zero-Knowledge-Proofs in der Chain postet. +- Ein _Smart Contract_, der die Hashes speichert und die Zero-Knowledge-Proofs verifiziert, um sicherzustellen, dass die Zustandsübergänge legitim sind. + +### Daten- und Kontrollfluss {#flows} + +Dies sind die Wege, auf denen die verschiedenen Komponenten kommunizieren, um von einem Konto auf ein anderes zu überweisen. + +1. Ein Webbrowser übermittelt eine signierte Transaktion, die eine Überweisung vom Konto des Unterzeichners auf ein anderes Konto anfordert. + +2. Der Server überprüft, ob die Transaktion gültig ist: + + - Der Unterzeichner hat ein Konto bei der Bank mit ausreichendem Guthaben. + - Der Empfänger hat ein Konto bei der Bank. + +3. Der Server berechnet den neuen Zustand, indem er den überwiesenen Betrag vom Guthaben des Unterzeichners abzieht und zum Guthaben des Empfängers addiert. + +4. Der Server berechnet einen Zero-Knowledge-Proof, dass die Zustandsänderung gültig ist. + +5. Der Server übermittelt eine Transaktion an Ethereum, die Folgendes enthält: + + - Der neue Zustands-Hash + - Der Transaktions-Hash (damit der Absender der Transaktion weiß, dass sie verarbeitet wurde) + - Der Zero-Knowledge-Proof, der beweist, dass der Übergang zum neuen Zustand gültig ist + +6. Der Smart Contract verifiziert den Zero-Knowledge-Proof. + +7. Wenn der Zero-Knowledge-Proof erfolgreich ist, führt der Smart Contract die folgenden Aktionen aus: + - Aktualisieren des aktuellen Zustands-Hashes auf den neuen Zustands-Hash + - Ausgabe eines Log-Eintrags mit dem neuen Zustands-Hash und dem Transaktions-Hash + +### Werkzeuge {#tools} + +Für den clientseitigen Code werden wir [Vite](https://vite.dev/), [React](https://react.dev/), [Viem](https://viem.sh/) und [Wagmi](https://wagmi.sh/) verwenden. Dies sind branchenübliche Werkzeuge; wenn Sie mit ihnen nicht vertraut sind, können Sie [dieses Tutorial](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) verwenden. + +Der Großteil des Servers ist in JavaScript mit [Node](https://nodejs.org/en) geschrieben. Der Zero-Knowledge-Teil ist in [Noir](https://noir-lang.org/) geschrieben. Wir benötigen die Version `1.0.0-beta.10`, also führen Sie nach der [Installation von Noir gemäß den Anweisungen](https://noir-lang.org/docs/getting_started/quick_start) Folgendes aus: + +``` +noirup -v 1.0.0-beta.10 +``` + +Die Blockchain, die wir verwenden, ist `anvil`, eine lokale Test-Blockchain, die Teil von [Foundry](https://getfoundry.sh/introduction/installation) ist. + +## Implementierung {#implementation} + +Da es sich um ein komplexes System handelt, werden wir es in Etappen implementieren. + +### Stufe 1 – Manuelles Zero-Knowledge {#stage-1} + +Für die erste Stufe signieren wir eine Transaktion im Browser und geben dann die Informationen manuell an den Zero-Knowledge-Proof weiter. Der Zero-Knowledge-Code erwartet diese Informationen in `server/noir/Prover.toml` (dokumentiert [hier](https://noir-lang.org/docs/getting_started/project_breakdown#provertoml-1)). + +So sehen Sie es in Aktion: + +1. Stellen Sie sicher, dass Sie [Node](https://nodejs.org/en/download) und [Noir](https://noir-lang.org/install) installiert haben. Installieren Sie sie vorzugsweise auf einem UNIX-System wie macOS, Linux oder [WSL](https://learn.microsoft.com/de-de/windows/wsl/install). + +2. Laden Sie den Code für Stufe 1 herunter und starten Sie den Webserver, um den Client-Code bereitzustellen. + + ```sh + git clone https://github.com/qbzzt/250911-zk-bank.git -b 01-manual-zk + cd 250911-zk-bank + cd client + npm install + npm run dev + ``` + + Der Grund, warum Sie hier einen Webserver benötigen, ist, dass viele Wallets (wie MetaMask) zur Verhinderung bestimmter Betrugsarten keine Dateien akzeptieren, die direkt von der Festplatte bereitgestellt werden. + +3. Öffnen Sie einen Browser mit einer Wallet. + +4. Geben Sie in der Wallet eine neue Passphrase ein. Beachten Sie, dass dies Ihre bestehende Passphrase löscht, also _stellen Sie sicher, dass Sie ein Backup haben_. + + Die Passphrase lautet `test test test test test test test test test test test junk`, die Standard-Test-Passphrase für Anvil. + +5. Navigieren Sie zum [clientseitigen Code](http://localhost:5173/). + +6. Verbinden Sie sich mit der Wallet und wählen Sie Ihr Zielkonto und den Betrag aus. + +7. Klicken Sie auf **Sign** und signieren Sie die Transaktion. + +8. Unter der Überschrift **Prover.toml** finden Sie einen Text. Ersetzen Sie `server/noir/Prover.toml` durch diesen Text. + +9. Führen Sie den Zero-Knowledge-Proof aus. + + ```sh + cd ../server/noir + nargo execute + ``` + + Die Ausgabe sollte ähnlich sein wie + + ``` + ori@CryptoDocGuy:~/noir/250911-zk-bank/server/noir$ nargo execute + + [zkBank] Circuit witness successfully solved + [zkBank] Witness saved to target/zkBank.gz + [zkBank] Circuit output: (0x199aa62af8c1d562a6ec96e66347bf3240ab2afb5d022c895e6bf6a5e617167b, 0x0cfc0a67cb7308e4e9b254026b54204e34f6c8b041be207e64c5db77d95dd82d, 0x450cf9da6e180d6159290554ae3d8787, 0x6d8bc5a15b9037e52fb59b6b98722a85) + ``` + +10. Vergleichen Sie die letzten beiden Werte mit dem Hash, den Sie im Webbrowser sehen, um zu prüfen, ob die Nachricht korrekt gehasht wurde. + +#### `server/noir/Prover.toml` {#server-noir-prover-toml} + +[Diese Datei](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Prover.toml) zeigt das von Noir erwartete Informationsformat. + +```toml +message="send 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 500 finney (milliEth) 0 " +``` + +Die Nachricht ist im Textformat, was es für den Benutzer leicht verständlich macht (was beim Signieren notwendig ist) und für den Noir-Code leicht zu parsen ist. Der Betrag wird in Finneys angegeben, um einerseits Teilüberweisungen zu ermöglichen und andererseits leicht lesbar zu sein. Die letzte Zahl ist die [Nonce](https://de.wikipedia.org/wiki/Nonce). + +Die Zeichenkette ist 100 Zeichen lang. Zero-Knowledge-Proofs können nicht gut mit Daten variabler Größe umgehen, daher ist es oft notwendig, Daten aufzufüllen. + +```toml +pubKeyX=["0x83",...,"0x75"] +pubKeyY=["0x35",...,"0xa5"] +signature=["0xb1",...,"0x0d"] +``` + +Diese drei Parameter sind Byte-Arrays fester Größe. + +```toml +[[accounts]] +address="0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" +balance=100_000 +nonce=0 + +[[accounts]] +address="0x70997970C51812dc3A010C7d01b50e0d17dc79C8" +balance=100_000 +nonce=0 +``` + +Dies ist die Art, ein Array von Strukturen zu spezifizieren. Für jeden Eintrag geben wir die Adresse, das Guthaben (in milliETH, auch bekannt als [Finney](https://cryptovalleyjournal.com/glossary/finney/)) und den nächsten Nonce-Wert an. + +#### `client/src/Transfer.tsx` {#client-src-transfer-tsx} + +[Diese Datei](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/client/src/Transfer.tsx) implementiert die clientseitige Verarbeitung und generiert die `server/noir/Prover.toml`-Datei (diejenige, die die Zero-Knowledge-Parameter enthält). + +Hier ist die Erklärung der interessanteren Teile. + +```tsx +export default attrs => { +``` + +Diese Funktion erstellt die `Transfer`-React-Komponente, die andere Dateien importieren können. + +```tsx + const accounts = [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x90F79bf6EB2c4f870365E785982E1f101E93b906", + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", + ] +``` + +Dies sind die Kontoadressen, die durch die Passphrase `test ...` erstellt werden. test junk\` Passphrase. Wenn Sie Ihre eigenen Adressen verwenden möchten, ändern Sie einfach diese Definition. + +```tsx + const account = useAccount() + const wallet = createWalletClient({ + transport: custom(window.ethereum!) + }) +``` + +Diese [Wagmi-Hooks](https://wagmi.sh/react/api/hooks) ermöglichen uns den Zugriff auf die [viem](https://viem.sh/)-Bibliothek und die Wallet. + +```tsx + const message = `send ${toAccount} ${ethAmount*1000} finney (milliEth) ${nonce}`.padEnd(100, " ") +``` + +Dies ist die mit Leerzeichen aufgefüllte Nachricht. Jedes Mal, wenn sich eine der `useState`-Variablen (https://react.dev/reference/react/useState) ändert, wird die Komponente neu gezeichnet und die `message` wird aktualisiert. + +```tsx + const sign = async () => { +``` + +Diese Funktion wird aufgerufen, wenn der Benutzer auf die Schaltfläche **Sign** klickt. Die Nachricht wird automatisch aktualisiert, aber die Signatur erfordert die Genehmigung des Benutzers in der Wallet, und wir möchten nicht danach fragen, es sei denn, es ist notwendig. + +```tsx + const signature = await wallet.signMessage({ + account: fromAccount, + message, + }) +``` + +Bitten Sie die Wallet, [die Nachricht zu signieren](https://viem.sh/docs/accounts/local/signMessage). + +```tsx + const hash = hashMessage(message) +``` + +Holen Sie sich den Nachrichten-Hash. Es ist hilfreich, ihn dem Benutzer für das Debugging (des Noir-Codes) zur Verfügung zu stellen. + +```tsx + const pubKey = await recoverPublicKey({ + hash, + signature + }) +``` + +[Holen Sie sich den öffentlichen Schlüssel](https://viem.sh/docs/utilities/recoverPublicKey). Dies ist für die [Noir `ecrecover`](https://github.com/colinnielsen/ecrecover-noir)-Funktion erforderlich. + +```tsx + setSignature(signature) + setHash(hash) + setPubKey(pubKey) +``` + +Setzen Sie die Zustandvariablen. Dadurch wird die Komponente neu gezeichnet (nachdem die `sign`-Funktion beendet ist) und dem Benutzer die aktualisierten Werte angezeigt. + +```tsx + let proverToml = ` +``` + +Der Text für `Prover.toml`. + +```tsx +message="${message}" + +pubKeyX=${hexToArray(pubKey.slice(4,4+2*32))} +pubKeyY=${hexToArray(pubKey.slice(4+2*32))} +``` + +Viem stellt uns den öffentlichen Schlüssel als 65-Byte-Hexadezimalzeichenkette zur Verfügung. Das erste Byte ist `0x04`, ein Versionsmarker. Darauf folgen 32 Bytes für das `x` des öffentlichen Schlüssels und dann 32 Bytes für das `y` des öffentlichen Schlüssels. + +Noir erwartet jedoch, diese Informationen als zwei Byte-Arrays zu erhalten, eines für `x` und eines für `y`. Es ist einfacher, dies hier auf dem Client zu parsen als als Teil des Zero-Knowledge-Proofs. + +Beachten Sie, dass dies im Allgemeinen eine gute Praxis bei Zero-Knowledge ist. Code innerhalb eines Zero-Knowledge-Proofs ist teuer, daher sollte jede Verarbeitung, die außerhalb des Zero-Knowledge-Proofs durchgeführt werden kann, auch außerhalb des Zero-Knowledge-Proofs durchgeführt werden. + +```tsx +signature=${hexToArray(signature.slice(2,-2))} +``` + +Die Signatur wird ebenfalls als eine 65-Byte lange Hexadezimal-Zeichenkette bereitgestellt. Das letzte Byte ist jedoch nur notwendig, um den öffentlichen Schlüssel wiederherzustellen. Da der öffentliche Schlüssel bereits dem Noir-Code zur Verfügung gestellt wird, benötigen wir ihn nicht zur Überprüfung der Signatur, und der Noir-Code erfordert ihn nicht. + +```tsx +${accounts.map(accountInProverToml).reduce((a,b) => a+b, "")} +` +``` + +Stellen Sie die Konten bereit. + +```tsx + setProverToml(proverToml) + } + + return ( + <> +

Transfer

+``` + +Dies ist das HTML (genauer gesagt, [JSX](https://react.dev/learn/writing-markup-with-jsx)) Format der Komponente. + +#### `server/noir/src/main.nr` {#server-noir-src-main-nr} + +[Diese Datei](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/src/main.nr) ist der eigentliche Zero-Knowledge-Code. + +``` +use std::hash::pedersen_hash; +``` + +[Pedersen-Hash](https://rya-sge.github.io/access-denied/2024/05/07/pedersen-hash-function/) wird mit der [Noir-Standardbibliothek](https://noir-lang.org/docs/noir/standard_library/cryptographic_primitives/hashes#pedersen_hash) bereitgestellt. Zero-Knowledge-Proofs verwenden häufig diese Hash-Funktion. Es ist viel einfacher, sie in [arithmetischen Schaltungen](https://rareskills.io/post/arithmetic-circuit) im Vergleich zu den Standard-Hash-Funktionen zu berechnen. + +``` +use keccak256::keccak256; +use dep::ecrecover; +``` + +Diese beiden Funktionen sind externe Bibliotheken, die in [`Nargo.toml`](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Nargo.toml) definiert sind. Sie sind genau das, wofür sie benannt sind: eine Funktion, die den [Keccak256-Hash](https://emn178.github.io/online-tools/keccak_256.html) berechnet, und eine Funktion, die Ethereum-Signaturen verifiziert und die Ethereum-Adresse des Unterzeichners wiederherstellt. + +``` +global ACCOUNT_NUMBER : u32 = 5; +``` + +Noir ist von [Rust](https://www.rust-lang.org/) inspiriert. Variablen sind standardmäßig Konstanten. Auf diese Weise definieren wir globale Konfigurationskonstanten. Insbesondere ist `ACCOUNT_NUMBER` die Anzahl der Konten, die wir speichern. + +Datentypen mit dem Namen `u` sind diese Anzahl von Bits, ohne Vorzeichen. Die einzigen unterstützten Typen sind `u8`, `u16`, `u32`, `u64` und `u128`. + +``` +global FLAT_ACCOUNT_FIELDS : u32 = 2; +``` + +Diese Variable wird für den Pedersen-Hash der Konten verwendet, wie unten erklärt. + +``` +global MESSAGE_LENGTH : u32 = 100; +``` + +Wie oben erklärt, ist die Nachrichtenlänge fest. Sie wird hier angegeben. + +``` +global ASCII_MESSAGE_LENGTH : [u8; 3] = [0x31, 0x30, 0x30]; +global HASH_BUFFER_SIZE : u32 = 26+3+MESSAGE_LENGTH; +``` + +[EIP-191-Signaturen](https://eips.ethereum.org/EIPS/eip-191) erfordern einen Puffer mit einem 26-Byte-Präfix, gefolgt von der Nachrichtenlänge in ASCII und schließlich der Nachricht selbst. + +``` +struct Account { + balance: u128, + address: Field, + nonce: u32, +} +``` + +Die Informationen, die wir über ein Konto speichern. [`Field`](https://noir-lang.org/docs/noir/concepts/data_types/fields) ist eine Zahl, typischerweise bis zu 253 Bits, die direkt in der [arithmetischen Schaltung](https://rareskills.io/post/arithmetic-circuit) verwendet werden kann, die den Zero-Knowledge-Proof implementiert. Hier verwenden wir das `Field`, um eine 160-Bit-Ethereum-Adresse zu speichern. + +``` +struct TransferTxn { + from: Field, + to: Field, + amount: u128, + nonce: u32 +} +``` + +Die Informationen, die wir für eine Überweisungstransaktion speichern. + +``` +fn flatten_account(account: Account) -> [Field; FLAT_ACCOUNT_FIELDS] { +``` + +Eine Funktionsdefinition. Der Parameter ist eine `Account`-Information. Das Ergebnis ist ein Array von `Field`-Variablen, dessen Länge `FLAT_ACCOUNT_FIELDS` ist. + +``` + let flat = [ + account.address, + ((account.balance << 32) + account.nonce.into()).into(), + ]; +``` + +Der erste Wert im Array ist die Kontoadresse. Der zweite Wert enthält sowohl das Guthaben als auch die Nonce. Die `.into()`-Aufrufe ändern eine Zahl in den Datentyp, den sie haben muss. `account.nonce` ist ein `u32`-Wert, aber um ihn zu `account.balance << 32`, einem `u128`-Wert, hinzuzufügen, muss er ein `u128` sein. Das ist das erste `.into()`. Der zweite wandelt das `u128`-Ergebnis in ein `Field` um, damit es in das Array passt. + +``` + flat +} +``` + +In Noir können Funktionen nur am Ende einen Wert zurückgeben (es gibt keine vorzeitige Rückgabe). Um den Rückgabewert anzugeben, werten Sie ihn kurz vor der schließenden Klammer der Funktion aus. + +``` +fn flatten_accounts(accounts: [Account; ACCOUNT_NUMBER]) -> [Field; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER] { +``` + +Diese Funktion wandelt das Konten-Array in ein `Field`-Array um, das als Eingabe für einen Pedersen-Hash verwendet werden kann. + +``` + let mut flat: [Field; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER] = [0; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER]; +``` + +So geben Sie eine veränderliche Variable an, d. h. _keine_ Konstante. Variablen in Noir müssen immer einen Wert haben, also initialisieren wir diese Variable mit Nullen. + +``` + for i in 0..ACCOUNT_NUMBER { +``` + +Dies ist eine `for`-Schleife. Beachten Sie, dass die Grenzen Konstanten sind. Noir-Schleifen müssen ihre Grenzen zur Kompilierzeit kennen. Der Grund dafür ist, dass arithmetische Schaltungen keine Flusskontrolle unterstützen. Bei der Verarbeitung einer `for`-Schleife fügt der Compiler den Code einfach mehrmals ein, einmal für jede Iteration. + +``` + let fields = flatten_account(accounts[i]); + for j in 0..FLAT_ACCOUNT_FIELDS { + flat[i*FLAT_ACCOUNT_FIELDS + j] = fields[j]; + } + } + + flat +} + +fn hash_accounts(accounts: [Account; ACCOUNT_NUMBER]) -> Field { + pedersen_hash(flatten_accounts(accounts)) +} +``` + +Schließlich sind wir bei der Funktion angelangt, die das Konten-Array hasht. + +``` +fn find_account(accounts: [Account; ACCOUNT_NUMBER], address: Field) -> u32 { + let mut account : u32 = ACCOUNT_NUMBER; + + for i in 0..ACCOUNT_NUMBER { + if accounts[i].address == address { + account = i; + } + } +``` + +Diese Funktion findet das Konto mit einer bestimmten Adresse. Diese Funktion wäre in Standardcode furchtbar ineffizient, da sie über alle Konten iteriert, auch nachdem sie die Adresse gefunden hat. + +Bei Zero-Knowledge-Proofs gibt es jedoch keine Flusskontrolle. Wenn wir jemals eine Bedingung prüfen müssen, müssen wir sie jedes Mal prüfen. + +Etwas Ähnliches geschieht mit `if`-Anweisungen. Die `if`-Anweisung in der obigen Schleife wird in diese mathematischen Aussagen übersetzt. + +_bedingungergebnis = accounts[i].address == address_ // eins, wenn sie gleich sind, sonst null + +_kontoneu = bedingungergebnis\*i + (1-bedingungergebnis)\*kontoalt_ + +```rust + assert (account < ACCOUNT_NUMBER, f"{address} hat kein Konto"); + + account +} +``` + +Die [`assert`](https://noir-lang.org/docs/dev/noir/concepts/assert)-Funktion führt zum Absturz des Zero-Knowledge-Proofs, wenn die Behauptung falsch ist. In diesem Fall, wenn wir kein Konto mit der relevanten Adresse finden können. Um die Adresse zu melden, verwenden wir einen [Format-String](https://noir-lang.org/docs/noir/concepts/data_types/strings#format-strings). + +```rust +fn apply_transfer_txn(accounts: [Account; ACCOUNT_NUMBER], txn: TransferTxn) -> [Account; ACCOUNT_NUMBER] { +``` + +Diese Funktion wendet eine Überweisungstransaktion an und gibt das neue Kontenarray zurück. + +```rust + let from = find_account(accounts, txn.from); + let to = find_account(accounts, txn.to); + + let (txnFrom, txnAmount, txnNonce, accountNonce) = + (txn.from, txn.amount, txn.nonce, accounts[from].nonce); +``` + +Wir können in Noir nicht auf Strukturelemente innerhalb eines Format-Strings zugreifen, also erstellen wir eine nutzbare Kopie. + +```rust + assert (accounts[from].balance >= txn.amount, + f"{txnFrom} hat keine {txnAmount} Finney"); + + assert (accounts[from].nonce == txn.nonce, + f"Transaktion hat Nonce {txnNonce}, aber das Konto wird voraussichtlich {accountNonce} verwenden"); +``` + +Dies sind zwei Bedingungen, die eine Transaktion ungültig machen könnten. + +```rust + let mut newAccounts = accounts; + + newAccounts[from].balance -= txn.amount; + newAccounts[from].nonce += 1; + newAccounts[to].balance += txn.amount; + + newAccounts +} +``` + +Erstellen Sie das neue Konten-Array und geben Sie es dann zurück. + +```rust +fn readAddress(messageBytes: [u8; MESSAGE_LENGTH]) -> Field +``` + +Diese Funktion liest die Adresse aus der Nachricht. + +```rust +{ + let mut result : Field = 0; + + for i in 7..47 { +``` + +Die Adresse ist immer 20 Byte (auch bekannt als 40 Hexadezimalziffern) lang und beginnt bei Zeichen #7. + +```rust + result *= 0x10; + if messageBytes[i] >= 48 & messageBytes[i] <= 57 { // 0-9 + result += (messageBytes[i]-48).into(); + } + if messageBytes[i] >= 65 & messageBytes[i] <= 70 { // A-F + result += (messageBytes[i]-65+10).into() + } + if messageBytes[i] >= 97 & messageBytes[i] <= 102 { // a-f + result += (messageBytes[i]-97+10).into() + } + } + + result +} + +fn readAmountAndNonce(messageBytes: [u8; MESSAGE_LENGTH]) -> (u128, u32) +``` + +Lesen Sie den Betrag und die Nonce aus der Nachricht. + +```rust +{ + let mut amount : u128 = 0; + let mut nonce: u32 = 0; + let mut stillReadingAmount: bool = true; + let mut lookingForNonce: bool = false; + let mut stillReadingNonce: bool = false; +``` + +In der Nachricht ist die erste Zahl nach der Adresse der Betrag in Finney (auch bekannt als Tausendstel eines ETH), der überwiesen werden soll. Die zweite Zahl ist die Nonce. Jeder Text dazwischen wird ignoriert. + +```rust + for i in 48..MESSAGE_LENGTH { + if messageBytes[i] >= 48 & messageBytes[i] <= 57 { // 0-9 + let digit = (messageBytes[i]-48); + + if stillReadingAmount { + amount = amount*10 + digit.into(); + } + + if lookingForNonce { // We just found it + stillReadingNonce = true; + lookingForNonce = false; + } + + if stillReadingNonce { + nonce = nonce*10 + digit.into(); + } + } else { + if stillReadingAmount { + stillReadingAmount = false; + lookingForNonce = true; + } + if stillReadingNonce { + stillReadingNonce = false; + } + } + } + + (amount, nonce) +} +``` + +Die Rückgabe eines [Tupels](https://noir-lang.org/docs/noir/concepts/data_types/tuples) ist die Noir-Methode, um mehrere Werte aus einer Funktion zurückzugeben. + +```rust +fn readTransferTxn(message: str) -> TransferTxn +{ + let mut txn: TransferTxn = TransferTxn { from: 0, to: 0, amount:0, nonce:0 }; + let messageBytes = message.as_bytes(); + + txn.to = readAddress(messageBytes); + let (amount, nonce) = readAmountAndNonce(messageBytes); + txn.amount = amount; + txn.nonce = nonce; + + txn +} +``` + +Diese Funktion konvertiert die Nachricht in Bytes und dann die Beträge in eine `TransferTxn`. + +```rust +// Das Äquivalent zu Viems hashMessage +// https://viem.sh/docs/utilities/hashMessage#hashmessage +fn hashMessage(message: str) -> [u8;32] { +``` + +Wir konnten den Pedersen-Hash für die Konten verwenden, da sie nur innerhalb des Zero-Knowledge-Proofs gehasht werden. In diesem Code müssen wir jedoch die Signatur der Nachricht überprüfen, die vom Browser generiert wird. Dafür müssen wir dem Ethereum-Signaturformat in [EIP 191](https://eips.ethereum.org/EIPS/eip-191) folgen. Das bedeutet, wir müssen einen kombinierten Puffer mit einem Standardpräfix, der Nachrichtenlänge in ASCII und der Nachricht selbst erstellen und den Ethereum-Standard Keccak256 verwenden, um ihn zu hashen. + +```rust + // ASCII-Präfix + let prefix_bytes = [ + 0x19, // \x19 + 0x45, // 'E' + 0x74, // 't' + 0x68, // 'h' + 0x65, // 'e' + 0x72, // 'r' + 0x65, // 'e' + 0x75, // 'u' + 0x6D, // 'm' + 0x20, // ' ' + 0x53, // 'S' + 0x69, // 'i' + 0x67, // 'g' + 0x6E, // 'n' + 0x65, // 'e' + 0x64, // 'd' + 0x20, // ' ' + 0x4D, // 'M' + 0x65, // 'e' + 0x73, // 's' + 0x73, // 's' + 0x61, // 'a' + 0x67, // 'g' + 0x65, // 'e' + 0x3A, // ':' + 0x0A // '\n' + ]; +``` + +Um Fälle zu vermeiden, in denen eine Anwendung den Benutzer bittet, eine Nachricht zu signieren, die als Transaktion oder für einen anderen Zweck verwendet werden kann, gibt EIP 191 an, dass alle signierten Nachrichten mit dem Zeichen 0x19 (kein gültiges ASCII-Zeichen) beginnen, gefolgt von `Ethereum Signed Message:` und einem Zeilenumbruch. + +```rust + let mut buffer: [u8; HASH_BUFFER_SIZE] = [0u8; HASH_BUFFER_SIZE]; + for i in 0..26 { + buffer[i] = prefix_bytes[i]; + } + + let messageBytes : [u8; MESSAGE_LENGTH] = message.as_bytes(); + + if MESSAGE_LENGTH <= 9 { + for i in 0..1 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+1] = messageBytes[i]; + } + } + + if MESSAGE_LENGTH >= 10 & MESSAGE_LENGTH <= 99 { + for i in 0..2 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+2] = messageBytes[i]; + } + } + + if MESSAGE_LENGTH >= 100 { + for i in 0..3 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+3] = messageBytes[i]; + } + } + + assert(MESSAGE_LENGTH < 1000, "Nachrichten, deren Länge drei Ziffern überschreitet, werden nicht unterstützt"); +``` + +Handhaben Sie Nachrichtenlängen bis zu 999 und brechen Sie ab, wenn sie größer ist. Ich habe diesen Code hinzugefügt, obwohl die Nachrichtenlänge eine Konstante ist, weil es die Änderung erleichtert. Auf einem Produktionssystem würden Sie wahrscheinlich einfach davon ausgehen, dass `MESSAGE_LENGTH` sich aus Leistungsgründen nicht ändert. + +```rust + keccak256::keccak256(buffer, HASH_BUFFER_SIZE) +} +``` + +Verwenden Sie die Ethereum-Standardfunktion `keccak256`. + +```rust +fn signatureToAddressAndHash( + message: str, + pubKeyX: [u8; 32], + pubKeyY: [u8; 32], + signature: [u8; 64] + ) -> (Field, Field, Field) // Adresse, erste 16 Bytes des Hash, letzte 16 Bytes des Hash +{ +``` + +Diese Funktion verifiziert die Signatur, was den Nachrichten-Hash erfordert. Es liefert uns dann die Adresse, die sie signiert hat, und den Nachrichten-Hash. Der Nachrichten-Hash wird in zwei `Field`-Werten geliefert, da diese im Rest des Programms einfacher zu verwenden sind als ein Byte-Array. + +Wir müssen zwei `Field`-Werte verwenden, da Feldberechnungen [modulo](https://de.wikipedia.org/wiki/Modular_arithmetic) einer großen Zahl durchgeführt werden, aber diese Zahl ist typischerweise kleiner als 256 Bits (andernfalls wäre es schwierig, diese Berechnungen in der EVM durchzuführen). + +```rust + let hash = hashMessage(message); + + let mut (hash1, hash2) = (0,0); + + for i in 0..16 { + hash1 = hash1*256 + hash[31-i].into(); + hash2 = hash2*256 + hash[15-i].into(); + } +``` + +Spezifizieren Sie `hash1` und `hash2` als veränderliche Variablen und schreiben Sie den Hash Byte für Byte hinein. + +```rust + ( + ecrecover::ecrecover(pubKeyX, pubKeyY, signature, hash), +``` + +Dies ist ähnlich wie [Soliditiys `ecrecover`](https://docs.soliditylang.org/en/v0.8.30/cheatsheet.html#mathematical-and-cryptographic-functions), mit zwei wichtigen Unterschieden: + +- Wenn die Signatur nicht gültig ist, schlägt der Aufruf ein `assert` fehl und das Programm wird abgebrochen. +- Obwohl der öffentliche Schlüssel aus der Signatur und dem Hash wiederhergestellt werden kann, handelt es sich um eine Verarbeitung, die extern erfolgen kann und daher nicht innerhalb des Zero-Knowledge-Proofs durchgeführt werden sollte. Wenn jemand versucht, uns hier zu betrügen, wird die Signaturüberprüfung fehlschlagen. + +```rust + hash1, + hash2 + ) +} + +fn main( + accounts: [Account; ACCOUNT_NUMBER], + message: str, + pubKeyX: [u8; 32], + pubKeyY: [u8; 32], + signature: [u8; 64], + ) -> pub ( + Field, // Hash des alten Konten-Arrays + Field, // Hash des neuen Konten-Arrays + Field, // Erste 16 Bytes des Nachrichten-Hashs + Field, // Letzte 16 Bytes des Nachrichten-Hashs + ) +``` + +Schließlich erreichen wir die `main`-Funktion. Wir müssen beweisen, dass wir eine Transaktion haben, die den Hash der Konten gültig vom alten Wert auf den neuen ändert. Wir müssen auch beweisen, dass sie diesen spezifischen Transaktions-Hash hat, damit die Person, die sie gesendet hat, weiß, dass ihre Transaktion verarbeitet wurde. + +```rust +{ + let mut txn = readTransferTxn(message); +``` + +Wir brauchen `txn`, um veränderbar zu sein, weil wir die Von-Adresse nicht aus der Nachricht, sondern aus der Signatur lesen. + +```rust + let (fromAddress, txnHash1, txnHash2) = signatureToAddressAndHash( + message, + pubKeyX, + pubKeyY, + signature); + + txn.from = fromAddress; + + let newAccounts = apply_transfer_txn(accounts, txn); + + ( + hash_accounts(accounts), + hash_accounts(newAccounts), + txnHash1, + txnHash2 + ) +} +``` + +### Stufe 2 – Hinzufügen eines Servers {#stage-2} + +In der zweiten Stufe fügen wir einen Server hinzu, der Überweisungstransaktionen vom Browser empfängt und implementiert. + +So sehen Sie es in Aktion: + +1. Stoppen Sie Vite, wenn es läuft. + +2. Laden Sie den Branch mit dem Server herunter und stellen Sie sicher, dass Sie alle erforderlichen Module haben. + + ```sh + git checkout 02-add-server + cd client + npm install + cd ../server + npm install + ``` + + Es ist nicht notwendig, den Noir-Code zu kompilieren, es ist derselbe Code, den Sie für Stufe 1 verwendet haben. + +3. Starten Sie den Server. + + ```sh + npm run start + ``` + +4. Führen Sie Vite in einem separaten Kommandozeilenfenster aus, um den Browser-Code bereitzustellen. + + ```sh + cd client + npm run dev + ``` + +5. Navigieren Sie zum Client-Code unter [http://localhost:5173](http://localhost:5173) + +6. Bevor Sie eine Transaktion ausgeben können, müssen Sie die Nonce sowie den Betrag kennen, den Sie senden können. Um diese Informationen zu erhalten, klicken Sie auf **Kontodaten aktualisieren** und signieren Sie die Nachricht. + + Wir haben hier ein Dilemma. Einerseits wollen wir keine Nachricht signieren, die wiederverwendet werden kann (ein [Replay-Angriff](https://de.wikipedia.org/wiki/Replay-Angriff)), weshalb wir überhaupt eine Nonce wollen. Allerdings haben wir noch keine Nonce. Die Lösung besteht darin, eine Nonce zu wählen, die nur einmal verwendet werden kann und die wir bereits auf beiden Seiten haben, wie z. B. die aktuelle Zeit. + + Das Problem bei dieser Lösung ist, dass die Zeit möglicherweise nicht perfekt synchronisiert ist. Stattdessen signieren wir einen Wert, der sich jede Minute ändert. Dies bedeutet, dass unser Verwundbarkeitsfenster für Replay-Angriffe höchstens eine Minute beträgt. In Anbetracht der Tatsache, dass die signierte Anfrage in der Produktion durch TLS geschützt wird und dass die andere Seite des Tunnels – der Server – das Guthaben und die Nonce bereits offenlegen kann (er muss sie kennen, um zu funktionieren), ist dies ein akzeptables Risiko. + +7. Sobald der Browser das Guthaben und die Nonce zurückerhält, zeigt er das Überweisungsformular an. Wählen Sie die Zieladresse und den Betrag aus und klicken Sie auf **Überweisen**. Signieren Sie diese Anfrage. + +8. Um die Überweisung zu sehen, **aktualisieren Sie die Kontodaten** oder schauen Sie in das Fenster, in dem Sie den Server ausführen. Der Server protokolliert den Zustand bei jeder Änderung. + + ``` + ori@CryptoDocGuy:~/x/250911-zk-bank/server$ npm run start + + > server@1.0.0 start + > node --experimental-json-modules index.mjs + + Listening on port 3000 + Txn send 0x90F79bf6EB2c4f870365E785982E1f101E93b906 36000 finney (milliEth) 0 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 64000 (1) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 100000 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 136000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) + Txn send 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 7200 finney (milliEth) 1 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 56800 (2) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 107200 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 136000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) + Txn send 0x90F79bf6EB2c4f870365E785982E1f101E93b906 3000 finney (milliEth) 2 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 53800 (3) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 107200 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 139000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) + ``` + +#### `server/index.mjs` {#server-index-mjs-1} + +[Diese Datei](https://github.com/qbzzt/250911-zk-bank/blob/02-add-server/server/index.mjs) enthält den Serverprozess und interagiert mit dem Noir-Code unter [`main.nr`](https://github.com/qbzzt/250911-zk-bank/blob/02-add-server/server/noir/src/main.nr). Hier ist eine Erklärung der interessanten Teile. + +```js +import { Noir } from '@noir-lang/noir_js' +``` + +Die [noir.js](https://www.npmjs.com/package/@noir-lang/noir_js)-Bibliothek dient als Schnittstelle zwischen JavaScript-Code und Noir-Code. + +```js +const circuit = JSON.parse(await fs.readFile("./noir/target/zkBank.json")) +const noir = new Noir(circuit) +``` + +Laden Sie die arithmetische Schaltung – das kompilierte Noir-Programm, das wir in der vorherigen Stufe erstellt haben – und bereiten Sie sich auf ihre Ausführung vor. + +```js +// Wir stellen Kontoinformationen nur als Antwort auf eine signierte Anfrage zur Verfügung +const accountInformation = async signature => { + const fromAddress = await recoverAddress({ + hash: hashMessage("Get account data " + Math.floor((new Date().getTime())/60000)), + signature + }) +``` + +Um Kontoinformationen bereitzustellen, benötigen wir nur die Signatur. Der Grund dafür ist, dass wir bereits wissen, was die Nachricht sein wird, und daher auch den Nachrichten-Hash. + +```js +const processMessage = async (message, signature) => { +``` + +Verarbeiten Sie eine Nachricht und führen Sie die darin kodierte Transaktion aus. + +```js + // Holen Sie sich den öffentlichen Schlüssel + const pubKey = await recoverPublicKey({ + hash, + signature + }) +``` + +Jetzt, da wir JavaScript auf dem Server ausführen, können wir den öffentlichen Schlüssel dort anstatt auf dem Client abrufen. + +```js + let noirResult + try { + noirResult = await noir.execute({ + message, + signature: signature.slice(2,-2).match(/.{2}/g).map(x => `0x${x}`), + pubKeyX, + pubKeyY, + accounts: Accounts + }) +``` + +`noir.execute` führt das Noir-Programm aus. Die Parameter entsprechen denen, die in [`Prover.toml`](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Prover.toml) angegeben sind. Beachten Sie, dass lange Werte als Array von Hexadezimal-Strings (`["0x60", "0xA7"]`) und nicht als einzelner Hexadezimalwert (`0x60A7`) angegeben werden, wie es Viem tut. + +```js + } catch (err) { + console.log(`Noir error: ${err}`) + throw Error("Invalid transaction, not processed") + } +``` + +Wenn ein Fehler auftritt, fangen Sie ihn ab und leiten Sie eine vereinfachte Version an den Client weiter. + +```js + Accounts[fromAccountNumber].nonce++ + Accounts[fromAccountNumber].balance -= amount + Accounts[toAccountNumber].balance += amount +``` + +Führen Sie die Transaktion aus. Wir haben dies bereits im Noir-Code getan, aber es ist einfacher, es hier erneut zu tun, als das Ergebnis von dort zu extrahieren. + +```js +let Accounts = [ + { + address: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + balance: 5000, + nonce: 0, + }, +``` + +Die ursprüngliche `Accounts`-Struktur. + +### Stufe 3 – Ethereum Smart Contracts {#stage-3} + +1. Stoppen Sie die Server- und Client-Prozesse. + +2. Laden Sie den Branch mit den Smart Contracts herunter und stellen Sie sicher, dass Sie alle erforderlichen Module haben. + + ```sh + git checkout 03-smart-contracts + cd client + npm install + cd ../server + npm install + ``` + +3. Führen Sie `anvil` in einem separaten Kommandozeilenfenster aus. + +4. Generieren Sie den Verifizierungsschlüssel und den Solidity-Verifizierer und kopieren Sie dann den Verifizierer-Code in das Solidity-Projekt. + + ```sh + cd noir + bb write_vk -b ./target/zkBank.json -o ./target --oracle_hash keccak + bb write_solidity_verifier -k ./target/vk -o ./target/Verifier.sol + cp target/Verifier.sol ../../smart-contracts/src + ``` + +5. Gehen Sie zu den Smart Contracts und setzen Sie die Umgebungsvariablen, um die `anvil` Blockchain zu verwenden. + + ```sh + cd ../../smart-contracts + export ETH_RPC_URL=http://localhost:8545 + ETH_PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + ``` + +6. Stellen Sie `Verifier.sol` bereit und speichern Sie die Adresse in einer Umgebungsvariable. + + ```sh + VERIFIER_ADDRESS=`forge create src/Verifier.sol:HonkVerifier --private-key $ETH_PRIVATE_KEY --optimize --broadcast | awk '/Deployed to:/ {print $3}'` + echo $VERIFIER_ADDRESS + ``` + +7. Stellen Sie den `ZkBank`-Vertrag bereit. + + ```sh + ZKBANK_ADDRESS=`forge create ZkBank --private-key $ETH_PRIVATE_KEY --broadcast --constructor-args $VERIFIER_ADDRESS 0x199aa62af8c1d562a6ec96e66347bf3240ab2afb5d022c895e6bf6a5e617167b | awk '/Deployed to:/ {print $3}'` + echo $ZKBANK_ADDRESS + ``` + + Der Wert `0x199..67b` ist der Pederson-Hash des Anfangszustands von `Accounts`. Wenn Sie diesen Anfangszustand in `server/index.mjs` ändern, können Sie eine Transaktion ausführen, um den vom Zero-Knowledge-Proof gemeldeten Anfangs-Hash zu sehen. + +8. Starten Sie den Server. + + ```sh + cd ../server + npm run start + ``` + +9. Führen Sie den Client in einem anderen Befehlszeilenfenster aus. + + ```sh + cd client + npm run dev + ``` + +10. Führen Sie einige Transaktionen aus. + +11. Um zu überprüfen, dass der Zustand onchain geändert wurde, starten Sie den Serverprozess neu. Beachten Sie, dass `ZkBank` keine Transaktionen mehr akzeptiert, da der ursprüngliche Hash-Wert in den Transaktionen vom onchain gespeicherten Hash-Wert abweicht. + + Dies ist die Art von Fehler, die erwartet wird. + + ``` + ori@CryptoDocGuy:~/x/250911-zk-bank/server$ npm run start + + > server@1.0.0 start + > node --experimental-json-modules index.mjs + + Listening on port 3000 + Verification error: ContractFunctionExecutionError: The contract function "processTransaction" reverted with the following reason: + Wrong old state hash + + Contract Call: + address: 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 + function: processTransaction(bytes _proof, bytes32[] _publicInputs) + args: (0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf00000000000000000000000000000000000000000000000b75c020998797da7800000000000000000000000000000000000000000000000 + ``` + +#### `server/index.mjs` {#server-index-mjs-2} + +Die Änderungen in dieser Datei beziehen sich hauptsächlich auf die Erstellung des tatsächlichen Beweises und dessen Einreichung onchain. + +```js +import { exec } from 'child_process' +import util from 'util' + +const execPromise = util.promisify(exec) +``` + +Wir müssen [das Barretenberg-Paket](https://github.com/AztecProtocol/aztec-packages/tree/next/barretenberg) verwenden, um den tatsächlichen Beweis zu erstellen, der onchain gesendet werden soll. Wir können dieses Paket entweder über die Befehlszeilenschnittstelle (`bb`) oder über die [JavaScript-Bibliothek `bb.js`](https://www.npmjs.com/package/@aztec/bb.js) verwenden. Die JavaScript-Bibliothek ist viel langsamer als nativer Code, daher verwenden wir hier [`exec`](https://nodejs.org/api/child_process.html#child_processexeccommand-options-callback), um die Befehlszeile zu nutzen. + +Beachten Sie, dass, wenn Sie sich für die Verwendung von `bb.js` entscheiden, Sie eine Version verwenden müssen, die mit der von Ihnen verwendeten Noir-Version kompatibel ist. Zum Zeitpunkt der Erstellung dieses Artikels verwendet die aktuelle Noir-Version (1.0.0-beta.11) `bb.js` Version 0.87. + +```js +const zkBankAddress = process.env.ZKBANK_ADDRESS || "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" +``` + +Die Adresse hier ist diejenige, die Sie erhalten, wenn Sie mit einem sauberen `anvil` beginnen und den obigen Anweisungen folgen. + +```js +const walletClient = createWalletClient({ + chain: anvil, + transport: http(), + account: privateKeyToAccount("0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6") +}) +``` + +Dieser private Schlüssel ist einer der standardmäßigen, vorfinanzierten Konten in `anvil`. + +```js +const generateProof = async (witness, fileID) => { +``` + +Generieren Sie einen Beweis mit der ausführbaren Datei `bb`. + +```js + const fname = `witness-${fileID}.gz` + await fs.writeFile(fname, witness) +``` + +Schreiben Sie den Witness in eine Datei. + +```js + await execPromise(`bb prove -b ./noir/target/zkBank.json -w ${fname} -o ${fileID} --oracle_hash keccak --output_format fields`) +``` + +Erstellen Sie tatsächlich den Beweis. Dieser Schritt erstellt auch eine Datei mit den öffentlichen Variablen, aber die brauchen wir nicht. Diese Variablen haben wir bereits von `noir.execute` erhalten. + +```js + const proof = "0x" + JSON.parse(await fs.readFile(`./${fileID}/proof_fields.json`)).reduce((a,b) => a+b, "").replace(/0x/g, "") +``` + +Der Beweis ist ein JSON-Array von `Field`-Werten, die jeweils als Hexadezimalwert dargestellt werden. Wir müssen es jedoch in der Transaktion als einen einzigen `bytes`-Wert senden, den Viem durch eine große Hexadezimalzeichenkette darstellt. Hier ändern wir das Format, indem wir alle Werte verketten, alle `0x` entfernen und dann am Ende eines hinzufügen. + +```js + await execPromise(`rm -r ${fname} ${fileID}`) + + return proof +} +``` + +Aufräumen und den Beweis zurückgeben. + +```js +const processMessage = async (message, signature) => { + . + . + . + + const publicFields = noirResult.returnValue.map(x=>'0x' + x.slice(2).padStart(64, "0")) +``` + +Die öffentlichen Felder müssen ein Array von 32-Byte-Werten sein. Da wir jedoch den Transaktions-Hash zwischen zwei `Field`-Werten aufteilen mussten, erscheint er als 16-Byte-Wert. Hier fügen wir Nullen hinzu, damit Viem versteht, dass es sich tatsächlich um 32 Bytes handelt. + +```js + const proof = await generateProof(noirResult.witness, `${fromAddress}-${nonce}`) +``` + +Jede Adresse verwendet jede Nonce nur einmal, sodass wir eine Kombination aus `fromAddress` und `nonce` als eindeutigen Bezeichner für die Witness-Datei und das Ausgabeverzeichnis verwenden können. + +```js + try { + await zkBank.write.processTransaction([ + proof, publicFields]) + } catch (err) { + console.log(`Verification error: ${err}`) + throw Error("Can't verify the transaction onchain") + } + . + . + . +} +``` + +Senden Sie die Transaktion an die Chain. + +#### `smart-contracts/src/ZkBank.sol` {#smart-contracts-src-zkbank-sol} + +Dies ist der Onchain-Code, der die Transaktion empfängt. + +```solidity +// SPDX-License-Identifier: MIT + +pragma solidity >=0.8.21; + +import {HonkVerifier} from "./Verifier.sol"; + +contract ZkBank { + HonkVerifier immutable myVerifier; + bytes32 currentStateHash; + + constructor(address _verifierAddress, bytes32 _initialStateHash) { + currentStateHash = _initialStateHash; + myVerifier = HonkVerifier(_verifierAddress); + } +``` + +Der Onchain-Code muss zwei Variablen nachverfolgen: den Verifizierer (ein separater Vertrag, der von `nargo` erstellt wird) und den aktuellen Zustands-Hash. + +```solidity + event TransactionProcessed( + bytes32 indexed transactionHash, + bytes32 oldStateHash, + bytes32 newStateHash + ); +``` + +Jedes Mal, wenn sich der Zustand ändert, geben wir ein `TransactionProcessed`-Ereignis aus. + +```solidity + function processTransaction( + bytes calldata _proof, + bytes32[] calldata _publicFields + ) public { +``` + +Diese Funktion verarbeitet Transaktionen. Sie erhält den Beweis (als `bytes`) und die öffentlichen Eingaben (als `bytes32`-Array) in dem Format, das der Verifizierer benötigt (um die Onchain-Verarbeitung und damit die Gas-Kosten zu minimieren). + +```solidity + require(_publicInputs[0] == currentStateHash, + "Falscher alter Zustands-Hash"); +``` + +Der Zero-Knowledge-Proof muss beweisen, dass die Transaktion von unserem aktuellen Hash zu einem neuen wechselt. + +```solidity + myVerifier.verify(_proof, _publicFields); +``` + +Rufen Sie den Verifizierer-Vertrag auf, um den Zero-Knowledge-Proof zu verifizieren. Dieser Schritt macht die Transaktion rückgängig, wenn der Zero-Knowledge-Proof falsch ist. + +```solidity + currentStateHash = _publicFields[1]; + + emit TransactionProcessed( + _publicFields[2]<<128 | _publicFields[3], + _publicFields[0], + _publicFields[1] + ); + } +} +``` + +Wenn alles stimmt, aktualisieren Sie den Zustands-Hash auf den neuen Wert und geben Sie ein `TransactionProcessed`-Ereignis aus. + +## Missbrauch durch die zentralisierte Komponente {#abuses} + +Informationssicherheit besteht aus drei Attributen: + +- _Vertraulichkeit_: Benutzer können keine Informationen lesen, für deren Lektüre sie nicht autorisiert sind. +- _Integrität_: Informationen können nur von autorisierten Benutzern auf autorisierte Weise geändert werden. +- _Verfügbarkeit_: Autorisierte Benutzer können das System verwenden. + +Auf diesem System wird die Integrität durch Zero-Knowledge-Proofs gewährleistet. Verfügbarkeit ist viel schwerer zu garantieren, und Vertraulichkeit ist unmöglich, da die Bank das Guthaben jedes Kontos und alle Transaktionen kennen muss. Es gibt keine Möglichkeit, eine Entität, die über Informationen verfügt, daran zu hindern, diese Informationen weiterzugeben. + +Es könnte möglich sein, eine wirklich vertrauliche Bank mit [Stealth-Adressen](https://vitalik.eth.limo/general/2023/01/20/stealth.html) zu erstellen, aber das liegt außerhalb des Rahmens dieses Artikels. + +### Falsche Informationen {#false-info} + +Eine Möglichkeit, wie der Server die Integrität verletzen kann, ist die Bereitstellung falscher Informationen, wenn [Daten angefordert werden](https://github.com/qbzzt/250911-zk-bank/blob/03-smart-contracts/server/index.mjs#L278-L291). + +Um dies zu lösen, können wir ein zweites Noir-Programm schreiben, das die Konten als private Eingabe und die Adresse, für die Informationen angefordert werden, als öffentliche Eingabe erhält. Die Ausgabe sind das Guthaben und die Nonce dieser Adresse sowie der Hash der Konten. + +Natürlich kann dieser Beweis nicht onchain verifiziert werden, da wir keine Nonces und Guthaben onchain veröffentlichen wollen. Er kann jedoch vom Client-Code, der im Browser ausgeführt wird, verifiziert werden. + +### Erzwungene Transaktionen {#forced-txns} + +Der übliche Mechanismus zur Gewährleistung der Verfügbarkeit und zur Verhinderung von Zensur auf L2s sind [erzwungene Transaktionen](https://docs.optimism.io/stack/transactions/forced-transaction). Aber erzwungene Transaktionen lassen sich nicht mit Zero-Knowledge-Proofs kombinieren. Der Server ist die einzige Instanz, die Transaktionen überprüfen kann. + +Wir können `smart-contracts/src/ZkBank.sol` so ändern, dass er erzwungene Transaktionen akzeptiert und den Server daran hindert, den Zustand zu ändern, bis sie verarbeitet sind. Dies eröffnet uns jedoch einen einfachen Denial-of-Service-Angriff. Was ist, wenn eine erzwungene Transaktion ungültig ist und daher unmöglich zu verarbeiten ist? + +Die Lösung ist ein Zero-Knowledge-Proof, dass eine erzwungene Transaktion ungültig ist. Dies gibt dem Server drei Optionen: + +- Verarbeiten Sie die erzwungene Transaktion und stellen Sie einen Zero-Knowledge-Proof bereit, dass sie verarbeitet wurde und den neuen Zustands-Hash. +- Lehnen Sie die erzwungene Transaktion ab und legen Sie dem Vertrag einen Zero-Knowledge-Proof vor, dass die Transaktion ungültig ist (unbekannte Adresse, falsche Nonce oder unzureichendes Guthaben). +- Ignorieren Sie die erzwungene Transaktion. Es gibt keine Möglichkeit, den Server zu zwingen, die Transaktion tatsächlich zu verarbeiten, aber es bedeutet, dass das gesamte System nicht verfügbar ist. + +#### Verfügbarkeitsanleihen {#avail-bonds} + +In einer realen Implementierung gäbe es wahrscheinlich eine Art Profitmotiv, den Server am Laufen zu halten. Wir können diesen Anreiz verstärken, indem der Server eine Verfügbarkeitsanleihe hinterlegt, die jeder verbrennen kann, wenn eine erzwungene Transaktion nicht innerhalb eines bestimmten Zeitraums verarbeitet wird. + +### Schlechter Noir-Code {#bad-noir-code} + +Normalerweise, um das Vertrauen der Leute in einen Smart Contract zu gewinnen, laden wir den Quellcode auf einen [Block-Explorer](https://eth.blockscout.com/address/0x7D16d2c4e96BCFC8f815E15b771aC847EcbDB48b?tab=contract) hoch. Im Falle von Zero-Knowledge-Proofs ist das jedoch unzureichend. + +`Verifier.sol` enthält den Verifizierungsschlüssel, der eine Funktion des Noir-Programms ist. Dieser Schlüssel sagt uns jedoch nicht, was das Noir-Programm war. Um tatsächlich eine vertrauenswürdige Lösung zu haben, müssen Sie das Noir-Programm (und die Version, die es erstellt hat) hochladen. Andernfalls könnten die Zero-Knowledge-Proofs ein anderes Programm widerspiegeln, eines mit einer Hintertür. + +Bis Block-Explorer es uns ermöglichen, Noir-Programme hochzuladen und zu verifizieren, sollten Sie es selbst tun (vorzugsweise auf [IPFS](/developers/tutorials/ipfs-decentralized-ui/)). Dann können versierte Benutzer den Quellcode herunterladen, selbst kompilieren, `Verifier.sol` erstellen und überprüfen, ob er mit dem auf der Chain identisch ist. + +## Fazit {#conclusion} + +Plasma-Anwendungen erfordern eine zentralisierte Komponente als Informationsspeicher. Dies eröffnet potenzielle Schwachstellen, ermöglicht es uns aber im Gegenzug, die Privatsphäre auf eine Weise zu wahren, die auf der Blockchain selbst nicht verfügbar ist. Mit Zero-Knowledge-Proofs können wir die Integrität gewährleisten und es möglicherweise wirtschaftlich vorteilhaft machen, dass der Betreiber der zentralisierten Komponente die Verfügbarkeit aufrechterhält. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). + +## Anerkennungen {#acknowledgements} + +- Josh Crites hat einen Entwurf dieses Artikels gelesen und mir bei einem kniffligen Noir-Problem geholfen. + +Alle verbleibenden Fehler liegen in meiner Verantwortung. diff --git a/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md b/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md index 80de3796183..e676e0a61f6 100644 --- a/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md +++ b/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md @@ -1,15 +1,11 @@ --- -title: Smart Contract aus JavaScript aufrufen -description: So rufen Sie am Beispiel eines Dai-Tokens eine Smart-Contract-Funktion von JavaScript aus auf +title: Aufruf eines Smart Contracts aus JavaScript +description: Wie Sie eine Smart-Contract-Funktion aus JavaScript am Beispiel eines Dai-Tokens aufrufen author: jdourlens -tags: - - "Transaktionen" - - "Frontend" - - "JavaScript" - - "web3.js" +tags: [ "Transaktionen", "Frontend", "JavaScript", "web3.js" ] skill: beginner lang: de -published: 2020-04-19 +published: 19.04.2020 source: EthereumDev sourceUrl: https://ethereumdev.io/calling-a-smart-contract-from-javascript/ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" @@ -23,7 +19,7 @@ Für dieses Beispiel wird ein DAI-Token verwendet. Zu Testzwecken werden wir die ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81 ``` -Für die Interaktoin mit einem Smart Contract benötigen wir seine Adresse und ABI: +Für die Interaktion mit einem Smart Contract benötigen wir seine Adresse und ABI: ```js const ERC20TransferABI = [ @@ -74,9 +70,9 @@ const ERC20TransferABI = [ const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f" ``` -Für dieses Projekt haben wir die komplette ERC20 ABI gestrippt, um nur die `balanceOf`- und `transfer`-Funktion zu behalten. Sie können [die komplette ERC20 ABI allerdings hier finden](https://ethereumdev.io/abi-for-erc20-contract-on-ethereum/). +Für dieses Projekt haben wir die komplette ERC20-ABI auf die Funktionen `balanceOf` und `transfer` reduziert, aber [die vollständige ERC20-ABI finden Sie hier](https://ethereumdev.io/abi-for-erc20-contract-on-ethereum/). -Anschließend müssen wir unseren Smart Contract starten: +Anschließend müssen wir unseren Smart Contract instanziieren: ```js const web3 = new Web3("http://localhost:8545") @@ -87,7 +83,7 @@ const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS) Außerdem richten wir zwei Adressen ein: - diejenige, die die Übertragung erhält und -- diejeige, die wir bereits eingerichtet haben, und die die Übertragung senden wird: +- diejenige, die wir bereits freigeschaltet haben und die sie senden wird: ```js const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81" @@ -98,9 +94,9 @@ Im nächsten Teil rufen wir die Funktion `balanceOf` auf, um die aktuelle Menge ## Aufruf: Wert aus einem Smart Contract lesen {#call-reading-value-from-a-smart-contract} -Das erste Beispiel ruft eine "konstante" Methode auf und führt deren Smart-Contract-Methode im EVM aus, ohne eine Transaktion zu senden. Hierfür lesen wir den ERC20-Saldo einer Adresse aus. [Lesen Sie unseren Artikel über ERC20-Token](/developers/tutorials/understand-the-erc-20-token-smart-contract/). +Das erste Beispiel ruft eine „konstante“ Methode auf und führt deren Smart-Contract-Methode in der EVM aus, ohne eine Transaktion zu senden. Hierfür lesen wir den ERC20-Saldo einer Adresse aus. [Lesen Sie unseren Artikel über ERC20-Token](/developers/tutorials/understand-the-erc-20-token-smart-contract/). -Sie können auf die Methoden eines instanziierten Smart Contracts, für den Sie die ABI bereitgestellt haben, wie folgt zugreifen: `yourContract.methods.methodname`. Durch Verwendung der `Aufruf`-Funktion erhalten Sie das Ergebnis der Ausführung der Funktion. +Sie können auf die Methoden eines instanziierten Smart Contracts, für die Sie die ABI bereitgestellt haben, wie folgt zugreifen: `yourContract.methods.methodname`. Durch die Verwendung der `call`-Funktion erhalten Sie das Ergebnis der Ausführung der Funktion. ```js daiToken.methods.balanceOf(senderAddress).call(function (err, res) { @@ -112,11 +108,11 @@ daiToken.methods.balanceOf(senderAddress).call(function (err, res) { }) ``` -Denken Sie daran, dass DAI ERC20 18 Dezimalstellen hat. Das bedeutet, dass Sie 18 Nullen entfernen müssen, um den richtigen Betrag zu erhalten. uint256 werden als Strings zurückgegeben, da JavaScript keine großen numerischen Werte verarbeiten kann. Wenn Sie nicht sicher sind, [wie Sie mit großen Zahlen in JS umgehen sollen, lesen Sie unser Tutorial über bignumber.js](https://ethereumdev.io/how-to-deal-with-big-numbers-in-javascript/). +Denken Sie daran, dass DAI ERC20 18 Dezimalstellen hat. Das bedeutet, dass Sie 18 Nullen entfernen müssen, um den richtigen Betrag zu erhalten. uint256 werden als Strings zurückgegeben, da JavaScript keine großen numerischen Werte verarbeiten kann. Wenn Sie sich nicht sicher sind, wie Sie mit großen Zahlen in JS umgehen sollen, [lesen Sie unser Tutorial über bignumber.js](https://ethereumdev.io/how-to-deal-with-big-numbers-in-javascript/). -## Senden: Senden einer Transaktion an eine Smart-Contract-Funktion {#send-sending-a-transaction-to-a-smart-contract-function} +## Senden: Eine Transaktion an eine Smart-Contract-Funktion senden {#send-sending-a-transaction-to-a-smart-contract-function} -Für das zweite Beispiel rufen wir die Transferfunktion des DAI-Smart Contracts auf, um 10 DAI an unsere zweite Adresse zu senden. Die Übertragungsfunktion akzeptiert zwei Parameter: die Empfängeradresse und den Betrag des zu übertragenden Tokens: +Im zweiten Beispiel rufen wir die Transfer-Funktion des DAI-Smart-Contracts auf, um 10 DAI an unsere zweite Adresse zu senden. Die Übertragungsfunktion akzeptiert zwei Parameter: die Empfängeradresse und den Betrag der zu übertragenden Token: ```js daiToken.methods @@ -130,6 +126,6 @@ daiToken.methods }) ``` -Die Aufruffunktion gibt den Hash der Transaktion zurück, der in die Blockchain gemined wird. Bei Ethereum sind Transaktions-Hashes vorhersehbar – so können wir den Hash der Transaktion erhalten, bevor sie ausgeführt wird ([lernen Sie hier, wie Hashes berechnet werden](https://ethereum.stackexchange.com/questions/45648/how-to-calculate-the-assigned-txhash-of-a-transaction)). +Die Aufruffunktion gibt den Hash der Transaktion zurück, der in die Blockchain gemined wird. Auf Ethereum sind Transaktions-Hashes vorhersagbar – so können wir den Hash der Transaktion erhalten, bevor sie ausgeführt wird ([hier erfahren Sie, wie Hashes berechnet werden](https://ethereum.stackexchange.com/questions/45648/how-to-calculate-the-assigned-txhash-of-a-transaction)). -Da die Funktion die Transaktion nur an die Blockchain sendet, können wir das Ergebnis erst sehen, wenn es gemined und in die Blockchain aufgenommen wurde. Im nächsten Tutorial werden wir lernen, [wie man auf die Ausführung einer Transaktion auf der Blockchain wartet, indem man ihren Hash kennt](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/). +Da die Funktion die Transaktion nur an die Blockchain sendet, können wir das Ergebnis erst sehen, wenn es gemined und in die Blockchain aufgenommen wurde. Im nächsten Tutorial lernen wir, [wie man anhand des Hashes einer Transaktion darauf wartet, dass sie auf der Blockchain ausgeführt wird](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/). diff --git a/public/content/translations/de/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md b/public/content/translations/de/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md new file mode 100644 index 00000000000..afadddb360d --- /dev/null +++ b/public/content/translations/de/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md @@ -0,0 +1,585 @@ +--- +title: "Erstellen einer Benutzeroberfläche für Ihren Vertrag" +description: Mithilfe moderner Komponenten wie TypeScript, React, Vite und Wagmi werden wir eine moderne, aber minimalistische Benutzeroberfläche durchgehen und lernen, wie man eine Wallet mit der Benutzeroberfläche verbindet, einen Smart Contract aufruft, um Informationen auszulesen, eine Transaktion an einen Smart Contract zu senden und Ereignisse von einem Smart Contract zu überwachen, um Änderungen zu erkennen. +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +tags: [ "typescript", "react", "vite", "wagmi", "Frontend" ] +skill: beginner +published: 01.11.2023 +lang: de +sidebarDepth: 3 +--- + +Sie haben eine Funktion gefunden, die wir im Ethereum-Ökosystem benötigen. Sie haben die Smart Contracts geschrieben, um sie zu implementieren, und vielleicht sogar einen zugehörigen Code, der Offchain ausgeführt wird. Das ist großartig! Leider werden Sie ohne eine Benutzeroberfläche keine Benutzer haben, und als Sie das letzte Mal eine Website geschrieben haben, benutzten die Leute noch Wählmodems und JavaScript war neu. + +Dieser Artikel ist für Sie. Ich gehe davon aus, dass Sie programmieren können und vielleicht ein wenig JavaScript und HTML kennen, aber dass Ihre Kenntnisse im Bereich der Benutzeroberflächen eingerostet und veraltet sind. Gemeinsam werden wir eine einfache, moderne Anwendung durchgehen, damit Sie sehen, wie man das heutzutage macht. + +## Warum ist das wichtig? {#why-important} + +Theoretisch könnten Sie die Leute einfach [Etherscan](https://holesky.etherscan.io/address/0x432d810484add7454ddb3b5311f0ac2e95cecea8#writeContract) oder [Blockscout](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=write_contract) verwenden lassen, um mit Ihren Verträgen zu interagieren. Das wird für die erfahrenen Ethereans großartig sein. Aber wir versuchen, [eine weitere Milliarde Menschen](https://blog.ethereum.org/2021/05/07/ethereum-for-the-next-billion) zu erreichen. Dies wird ohne eine großartige Benutzererfahrung nicht geschehen, und eine benutzerfreundliche Oberfläche ist ein großer Teil davon. + +## Greeter-Anwendung {#greeter-app} + +Es gibt eine Menge Theorie dahinter, wie eine moderne Benutzeroberfläche funktioniert, und [viele gute Seiten](https://react.dev/learn/thinking-in-react), [die es erklären](https://wagmi.sh/core/getting-started). Anstatt die gute Arbeit dieser Seiten zu wiederholen, gehe ich davon aus, dass Sie es vorziehen, durch praktische Anwendung zu lernen und mit einer Anwendung zu beginnen, mit der Sie herumspielen können. Sie brauchen immer noch die Theorie, um Dinge zu erledigen, und wir werden dazu kommen – wir werden einfach Quelldatei für Quelldatei durchgehen und die Dinge besprechen, wenn wir zu ihnen kommen. + +### Installation {#installation} + +1. Fügen Sie bei Bedarf [die Holesky-Blockchain](https://chainlist.org/?search=holesky&testnets=true) zu Ihrer Wallet hinzu und [holen Sie sich Test-ETH](https://www.holeskyfaucet.io/). + +2. Klonen Sie das GitHub-Repository. + + ```sh + git clone https://github.com/qbzzt/20230801-modern-ui.git + ``` + +3. Installieren Sie die erforderlichen Pakete. + + ```sh + cd 20230801-modern-ui + pnpm install + ``` + +4. Starten Sie die Anwendung. + + ```sh + pnpm dev + ``` + +5. Navigieren Sie zu der von der Anwendung angezeigten URL. In den meisten Fällen ist dies [http://localhost:5173/](http://localhost:5173/). + +6. Sie können den Quellcode des Vertrags, eine leicht modifizierte Version von Hardhat's Greeter, [auf einem Blockchain-Explorer](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=contract) sehen. + +### Dateidurchsicht {#file-walk-through} + +#### `index.html` {#index-html} + +Diese Datei ist ein Standard-HTML-Boilerplate mit Ausnahme dieser Zeile, die die Skriptdatei importiert. + +```html + +``` + +#### `src/main.tsx` {#main-tsx} + +Die Dateierweiterung verrät uns, dass es sich bei dieser Datei um eine [React-Komponente](https://www.w3schools.com/react/react_components.asp) handelt, die in [TypeScript](https://www.typescriptlang.org/) geschrieben wurde, einer Erweiterung von JavaScript, die eine [Typüberprüfung](https://en.wikipedia.org/wiki/Type_system#Type_checking) unterstützt. TypeScript wird in JavaScript kompiliert, sodass wir es für die clientseitige Ausführung verwenden können. + +```tsx +import '@rainbow-me/rainbowkit/styles.css' +import { RainbowKitProvider } from '@rainbow-me/rainbowkit' +import * as React from 'react' +import * as ReactDOM from 'react-dom/client' +import { WagmiConfig } from 'wagmi' +import { chains, config } from './wagmi' +``` + +Importieren Sie den benötigten Bibliotheks-Code. + +```tsx +import { App } from './App' +``` + +Importieren Sie die React-Komponente, die die Anwendung implementiert (siehe unten). + +```tsx +ReactDOM.createRoot(document.getElementById('root')!).render( +``` + +Erstellen Sie die Root-React-Komponente. Der Parameter für `render` ist [JSX](https://www.w3schools.com/react/react_jsx.asp), eine Erweiterungssprache, die sowohl HTML als auch JavaScript/TypeScript verwendet. Das Ausrufezeichen hier teilt dem TypeScript-Compiler mit: "Auch wenn nicht verifiziert werden kann, dass `document.getElementById('root')` ein gültiger Parameter für `ReactDOM.createRoot` sein wird, keine Sorge – ich als Entwickler garantiere, dass er vorhanden sein wird". + +```tsx + +``` + +Die Anwendung befindet sich in [einer `React.StrictMode`-Komponente](https://react.dev/reference/react/StrictMode). Diese Komponente weist die React-Bibliothek an, zusätzliche Debugging-Prüfungen einzufügen, was während der Entwicklung nützlich ist. + +```tsx + +``` + +Die Anwendung befindet sich auch in [einer `WagmiConfig`-Komponente](https://wagmi.sh/react/api/WagmiProvider). [Die wagmi (we are going to make it) Bibliothek](https://wagmi.sh/) verbindet die React-UI-Definitionen mit [der viem-Bibliothek](https://viem.sh/) zum Schreiben einer dezentralisierten Ethereum-Anwendung. + +```tsx + +``` + +Und schließlich [eine `RainbowKitProvider`-Komponente](https://www.rainbowkit.com/). Diese Komponente kümmert sich um die Anmeldung und die Kommunikation zwischen der Wallet und der Anwendung. + +```tsx + +``` + +Jetzt können wir die Komponente für die Anwendung haben, die die Benutzeroberfläche tatsächlich implementiert. Das `/>` am Ende der Komponente teilt React mit, dass diese Komponente gemäß dem XML-Standard keine Definitionen in sich enthält. + +```tsx + + + , +) +``` + +Natürlich müssen wir auch die anderen Komponenten schließen. + +#### `src/App.tsx` {#app-tsx} + +```tsx +import { ConnectButton } from '@rainbow-me/rainbowkit' +import { useAccount } from 'wagmi' +import { Greeter } from './components/Greeter' + +export function App() { +``` + +Dies ist die Standardmethode zum Erstellen einer React-Komponente – definieren Sie eine Funktion, die jedes Mal aufgerufen wird, wenn sie gerendert werden muss. Diese Funktion hat typischerweise am Anfang etwas TypeScript- oder JavaScript-Code, gefolgt von einer `return`-Anweisung, die den JSX-Code zurückgibt. + +```tsx + const { isConnected } = useAccount() +``` + +Hier verwenden wir [`useAccount`](https://wagmi.sh/react/api/hooks/useAccount), um zu prüfen, ob wir über eine Wallet mit einer Blockchain verbunden sind oder nicht. + +Konventionsgemäß sind in React Funktionen, die `use...` heißen, [Hooks](https://www.w3schools.com/react/react_hooks.asp), die eine Art von Daten zurückgeben. Wenn Sie solche Hooks verwenden, erhält Ihre Komponente nicht nur die Daten, sondern wenn sich diese Daten ändern, wird die Komponente mit den aktualisierten Informationen neu gerendert. + +```tsx + return ( + <> +``` + +Das JSX einer React-Komponente _muss_ eine Komponente zurückgeben. Wenn wir mehrere Komponenten haben und nichts haben, was sie "natürlich" umschließt, verwenden wir eine leere Komponente (`<> ...` \`), um sie zu einer einzigen Komponente zu machen. + +```tsx +

Greeter

+ +``` + +Wir erhalten [die `ConnectButton`-Komponente](https://www.rainbowkit.com/docs/connect-button) von RainbowKit. Wenn wir nicht verbunden sind, erhalten wir eine `Connect Wallet`-Schaltfläche, die ein modales Fenster öffnet, das Wallets erklärt und Sie auswählen lässt, welche Sie verwenden. Wenn wir verbunden sind, werden die von uns verwendete Blockchain, unsere Kontoadresse und unser ETH-Guthaben angezeigt. Wir können diese Anzeigen verwenden, um das Netzwerk zu wechseln oder die Verbindung zu trennen. + +```tsx + {isConnected && ( +``` + +Wenn wir tatsächliches JavaScript (oder TypeScript, das zu JavaScript kompiliert wird) in ein JSX einfügen müssen, verwenden wir Klammern (`{}`). + +Die Syntax `a && b` ist eine Kurzform für [`a ?` b : a`](https://www.w3schools.com/react/react_es6_ternary.asp). Das heißt, wenn `a`wahr ist, wird es zu`b`ausgewertet, andernfalls zu`a`(was`false`, `0\` usw. sein kann). Dies ist eine einfache Möglichkeit, React mitzuteilen, dass eine Komponente nur dann angezeigt werden soll, wenn eine bestimmte Bedingung erfüllt ist. + +In diesem Fall wollen wir dem Benutzer `Greeter` nur dann anzeigen, wenn der Benutzer mit einer Blockchain verbunden ist. + +```tsx + + )} + + ) +} +``` + +#### `src/components/Greeter.tsx` {#greeter-tsx} + +Diese Datei enthält den größten Teil der UI-Funktionalität. Es enthält Definitionen, die normalerweise in mehreren Dateien wären, aber da dies ein Tutorial ist, ist das Programm so optimiert, dass es beim ersten Mal leicht zu verstehen ist, anstatt auf Leistung oder einfache Wartung. + +```tsx +import { useState, ChangeEventHandler } from 'react' +import { useNetwork, + useReadContract, + usePrepareContractWrite, + useContractWrite, + useContractEvent + } from 'wagmi' +``` + +Wir verwenden diese Bibliotheksfunktionen. Auch hier werden sie unten erklärt, wo sie verwendet werden. + +```tsx +import { AddressType } from 'abitype' +``` + +[Die `abitype`-Bibliothek](https://abitype.dev/) stellt uns TypeScript-Definitionen für verschiedene Ethereum-Datentypen zur Verfügung, wie z. B. [`AddressType`](https://abitype.dev/config#addresstype). + +```tsx +let greeterABI = [ + . + . + . +] as const // greeterABI +``` + +Das ABI für den `Greeter`-Vertrag. +Wenn Sie die Verträge und die Benutzeroberfläche gleichzeitig entwickeln, würden Sie sie normalerweise im selben Repository ablegen und das vom Solidity-Compiler generierte ABI als Datei in Ihrer Anwendung verwenden. Dies ist hier jedoch nicht notwendig, da der Vertrag bereits entwickelt ist und sich nicht ändern wird. + +```tsx +type AddressPerBlockchainType = { + [key: number]: AddressType +} +``` + +TypeScript ist stark typisiert. Wir verwenden diese Definition, um die Adresse anzugeben, in der der `Greeter`-Vertrag auf verschiedenen Ketten bereitgestellt wird. Der Schlüssel ist eine Zahl (die Chain-ID) und der Wert ist ein `AddressType` (eine Adresse). + +```tsx +const contractAddrs: AddressPerBlockchainType = { + // Holesky + 17000: '0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8', + + // Sepolia + 11155111: '0x7143d5c190F048C8d19fe325b748b081903E3BF0' +} +``` + +Die Adresse des Vertrags in den beiden unterstützten Netzwerken: [Holesky](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=contact_code) und [Sepolia](https://eth-sepolia.blockscout.com/address/0x7143d5c190F048C8d19fe325b748b081903E3BF0?tab=contact_code). + +Hinweis: Es gibt tatsächlich eine dritte Definition für Redstone Holesky, die weiter unten erläutert wird. + +```tsx +type ShowObjectAttrsType = { + name: string, + object: any +} +``` + +Dieser Typ wird als Parameter für die `ShowObject`-Komponente verwendet (wird später erklärt). Er enthält den Namen des Objekts und seinen Wert, die zu Debugging-Zwecken angezeigt werden. + +```tsx +type ShowGreetingAttrsType = { + greeting: string | undefined +} +``` + +Zu jedem Zeitpunkt können wir entweder wissen, was die Begrüßung ist (weil wir sie von der Blockchain gelesen haben) oder nicht wissen (weil wir sie noch nicht erhalten haben). Es ist also nützlich, einen Typ zu haben, der entweder ein String oder nichts sein kann. + +##### `Greeter`-Komponente {#greeter-component} + +```tsx +const Greeter = () => { +``` + +Schließlich definieren wir die Komponente. + +```tsx + const { chain } = useNetwork() +``` + +Informationen über die von uns verwendete Chain, bereitgestellt von [wagmi](https://wagmi.sh/react/hooks/useNetwork). +Da es sich um einen Hook (`use...`) handelt, wird die Komponente bei jeder Änderung dieser Information neu gezeichnet. + +```tsx + const greeterAddr = chain && contractAddrs[chain.id] +``` + +Die Adresse des Greeter-Vertrags, die je nach Chain variiert (und `undefined` ist, wenn wir keine Chain-Informationen haben oder uns auf einer Chain ohne diesen Vertrag befinden). + +```tsx + const readResults = useReadContract({ + address: greeterAddr, + abi: greeterABI, + functionName: "greet" , // Keine Argumente + watch: true + }) +``` + +[Der `useReadContract`-Hook](https://wagmi.sh/react/api/hooks/useReadContract) liest Informationen aus einem Vertrag. Sie können genau sehen, welche Informationen es zurückgibt, wenn Sie `readResults` in der Benutzeroberfläche erweitern. In diesem Fall möchten wir, dass es weiter sucht, damit wir informiert werden, wenn sich die Begrüßung ändert. + +**Hinweis:** Wir könnten auf [`setGreeting`-Ereignisse](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=logs) lauschen, um zu wissen, wann sich die Begrüßung ändert, und auf diese Weise aktualisieren. Obwohl dies effizienter sein mag, ist es nicht in allen Fällen anwendbar. Wenn der Benutzer zu einer anderen Kette wechselt, ändert sich auch die Begrüßung, aber diese Änderung wird nicht von einem Ereignis begleitet. Wir könnten einen Teil des Codes haben, der auf Ereignisse lauscht, und einen anderen, um Kettenänderungen zu identifizieren, aber das wäre komplizierter, als nur [den `watch`-Parameter](https://wagmi.sh/react/api/hooks/useReadContract#watch-optional) zu setzen. + +```tsx + const [ newGreeting, setNewGreeting ] = useState("") +``` + +Der [`useState`-Hook](https://www.w3schools.com/react/react_usestate.asp) von React ermöglicht es uns, eine Zustandsvariable anzugeben, deren Wert von einem Rendering der Komponente zum nächsten erhalten bleibt. Der Anfangswert ist der Parameter, in diesem Fall der leere String. + +Der `useState`-Hook gibt eine Liste mit zwei Werten zurück: + +1. Der aktuelle Wert der Zustandsvariable. +2. Eine Funktion, um die Zustandsvariable bei Bedarf zu ändern. Da dies ein Hook ist, wird die Komponente jedes Mal neu gerendert, wenn sie aufgerufen wird. + +In diesem Fall verwenden wir eine Zustandsvariable für die neue Begrüßung, die der Benutzer setzen möchte. + +```tsx + const greetingChange : ChangeEventHandler = (evt) => + setNewGreeting(evt.target.value) +``` + +Dies ist der Ereignis-Handler für den Fall, dass sich das Eingabefeld für die neue Begrüßung ändert. Der Typ [`ChangeEventHandler`](https://react-typescript-cheatsheet.netlify.app/docs/basic/getting-started/forms_and_events/) gibt an, dass dies ein Handler für eine Wertänderung eines HTML-Eingabeelements ist. Der Teil `` wird verwendet, da es sich um einen [generischen Typ](https://www.w3schools.com/typescript/typescript_basic_generics.php) handelt. + +```tsx + const preparedTx = usePrepareContractWrite({ + address: greeterAddr, + abi: greeterABI, + functionName: 'setGreeting', + args: [ newGreeting ] + }) + const workingTx = useContractWrite(preparedTx.config) +``` + +Dies ist der Prozess, um eine Blockchain-Transaktion aus der Client-Perspektive zu übermitteln: + +1. Senden Sie die Transaktion an einen Knoten in der Blockchain unter Verwendung von [`eth_estimateGas`](https://docs.alchemy.com/reference/eth-estimategas). +2. Warten Sie auf eine Antwort vom Knoten. +3. Wenn die Antwort eingegangen ist, bitten Sie den Benutzer, die Transaktion über die Wallet zu signieren. Dieser Schritt _muss_ erfolgen, nachdem die Antwort des Knotens eingegangen ist, da dem Benutzer die Gaskosten der Transaktion vor dem Signieren angezeigt werden. +4. Warten Sie auf die Genehmigung durch den Benutzer. +5. Senden Sie die Transaktion erneut, diesmal mit [`eth_sendRawTransaction`](https://docs.alchemy.com/reference/eth-sendrawtransaction). + +Schritt 2 wird wahrscheinlich eine spürbare Zeit in Anspruch nehmen, während der sich die Benutzer fragen würden, ob ihr Befehl wirklich von der Benutzeroberfläche empfangen wurde und warum sie nicht bereits gebeten werden, die Transaktion zu signieren. Das sorgt für eine schlechte Benutzererfahrung (UX). + +Die Lösung besteht darin, [Prepare-Hooks](https://wagmi.sh/react/prepare-hooks) zu verwenden. Jedes Mal, wenn sich ein Parameter ändert, senden Sie sofort die `eth_estimateGas`-Anfrage an den Knoten. Wenn der Benutzer dann tatsächlich die Transaktion senden möchte (in diesem Fall durch Drücken von **Gruß aktualisieren**), sind die Gaskosten bekannt und der Benutzer kann die Wallet-Seite sofort sehen. + +```tsx + return ( +``` + +Jetzt können wir endlich das eigentliche HTML zur Rückgabe erstellen. + +```tsx + <> +

Greeter

+ { + !readResults.isError && !readResults.isLoading && + + } +
+``` + +Erstellen Sie eine `ShowGreeting`-Komponente (wird unten erklärt), aber nur, wenn die Begrüßung erfolgreich von der Blockchain gelesen wurde. + +```tsx + +``` + +Dies ist das Eingabefeld, in dem der Benutzer eine neue Begrüßung festlegen kann. Jedes Mal, wenn der Benutzer eine Taste drückt, rufen wir `greetingChange` auf, was `setNewGreeting` aufruft. Da `setNewGreeting` aus dem `useState`-Hook stammt, wird die `Greeter`-Komponente erneut gerendert. Dies bedeutet, dass: + +- Wir müssen `value` angeben, um den Wert der neuen Begrüßung beizubehalten, da er sich sonst wieder in den Standardwert, den leeren String, zurückverwandeln würde. +- `usePrepareContractWrite` wird jedes Mal aufgerufen, wenn sich `newGreeting` ändert, was bedeutet, dass es immer das neueste `newGreeting` in der vorbereiteten Transaktion haben wird. + +```tsx + +``` + +Wenn kein `workingTx.write` vorhanden ist, warten wir noch auf Informationen, die zum Senden der Grußaktualisierung erforderlich sind, sodass die Schaltfläche deaktiviert ist. Wenn ein `workingTx.write`-Wert vorhanden ist, ist dies die Funktion, die aufgerufen werden muss, um die Transaktion zu senden. + +```tsx +
+ + + + + ) +} +``` + +Schließlich, um Ihnen zu helfen zu sehen, was wir tun, zeigen wir die drei Objekte, die wir verwenden: + +- `readResults` +- `preparedTx` +- `workingTx` + +##### `ShowGreeting`-Komponente {#showgreeting-component} + +Diese Komponente zeigt + +```tsx +const ShowGreeting = (attrs : ShowGreetingAttrsType) => { +``` + +Eine Komponentenfunktion erhält einen Parameter mit allen Attributen der Komponente. + +```tsx + return {attrs.greeting} +} +``` + +##### `ShowObject`-Komponente {#showobject-component} + +Zu Informationszwecken verwenden wir die `ShowObject`-Komponente, um die wichtigen Objekte anzuzeigen (`readResults` zum Lesen der Begrüßung und `preparedTx` und `workingTx` für von uns erstellte Transaktionen). + +```tsx +const ShowObject = (attrs: ShowObjectAttrsType ) => { + const keys = Object.keys(attrs.object) + const funs = keys.filter(k => typeof attrs.object[k] == "function") + return <> +
+``` + +Wir möchten die Benutzeroberfläche nicht mit allen Informationen überladen. Um sie also ansehen oder schließen zu können, verwenden wir ein [`details`](https://www.w3schools.com/tags/tag_details.asp)-Tag. + +```tsx + {attrs.name} +
+        {JSON.stringify(attrs.object, null, 2)}
+```
+
+Die meisten Felder werden mit [`JSON.stringify`](https://www.w3schools.com/js/js_json_stringify.asp) angezeigt.
+
+```tsx
+      
+ { funs.length > 0 && + <> + Funktionen: +
    +``` + +Die Ausnahme sind Funktionen, die nicht Teil des [JSON-Standards](https://www.json.org/json-en.html) sind und daher separat angezeigt werden müssen. + +```tsx + {funs.map((f, i) => +``` + +Innerhalb von JSX wird der Code in `{` geschweiften Klammern `}` als JavaScript interpretiert. Dann wird der Code innerhalb der `(` runden Klammern `)` wieder als JSX interpretiert. + +```tsx + (
  • {f}
  • ) + )} +``` + +React erfordert, dass Tags im [DOM-Baum](https://www.w3schools.com/js/js_htmldom.asp) eindeutige Bezeichner haben. Dies bedeutet, dass untergeordnete Elemente desselben Tags (in diesem Fall [die ungeordnete Liste](https://www.w3schools.com/tags/tag_ul.asp)) unterschiedliche `key`-Attribute benötigen. + +```tsx +
+ + } +
+ +} +``` + +Beenden Sie die verschiedenen HTML-Tags. + +##### Der abschließende `Export` {#the-final-export} + +```tsx +export { Greeter } +``` + +Die `Greeter`-Komponente ist diejenige, die wir für die Anwendung exportieren müssen. + +#### `src/wagmi.ts` {#wagmi-ts} + +Schließlich befinden sich verschiedene Definitionen in Bezug auf WAGMI in `src/wagmi.ts`. Ich werde hier nicht alles erklären, da das meiste davon Boilerplate ist, den Sie wahrscheinlich nicht ändern müssen. + +Der Code hier ist nicht genau derselbe wie [auf Github](https://github.com/qbzzt/20230801-modern-ui/blob/main/src/wagmi.ts), da wir später im Artikel eine weitere Chain ([Redstone Holesky](https://redstone.xyz/docs/network-info)) hinzufügen. + +```ts +import { getDefaultWallets } from '@rainbow-me/rainbowkit' +import { configureChains, createConfig } from 'wagmi' +import { holesky, sepolia } from 'wagmi/chains' +``` + +Importieren Sie die Blockchains, die die Anwendung unterstützt. Sie können die Liste der unterstützten Chains [im Viem-Github](https://github.com/wagmi-dev/viem/tree/main/src/chains/definitions) sehen. + +```ts +import { publicProvider } from 'wagmi/providers/public' + +const walletConnectProjectId = 'c96e690bb92b6311e8e9b2a6a22df575' +``` + +Um [WalletConnect](https://walletconnect.com/) verwenden zu können, benötigen Sie eine Projekt-ID für Ihre Anwendung. Sie können sie [auf cloud.walletconnect.com](https://cloud.walletconnect.com/sign-in) erhalten. + +```ts +const { chains, publicClient, webSocketPublicClient } = configureChains( + [ holesky, sepolia ], + [ + publicProvider(), + ], +) + +const { connectors } = getDefaultWallets({ + appName: 'My wagmi + RainbowKit App', + chains, + projectId: walletConnectProjectId, +}) + +export const config = createConfig({ + autoConnect: true, + connectors, + publicClient, + webSocketPublicClient, +}) + +export { chains } +``` + +### Eine weitere Blockchain hinzufügen {#add-blockchain} + +Heutzutage gibt es eine Menge [L2-Skalierungslösungen](/layer-2/), und vielleicht möchten Sie einige unterstützen, die Viem noch nicht unterstützt. Dazu ändern Sie `src/wagmi.ts`. Diese Anweisungen erklären, wie man [Redstone Holesky](https://redstone.xyz/docs/network-info) hinzufügt. + +1. Importieren Sie den `defineChain`-Typ aus Viem. + + ```ts + import { defineChain } from 'viem' + ``` + +2. Fügen Sie die Netzwerkdefinition hinzu. + + ```ts + const redstoneHolesky = defineChain({ + id: 17_001, + name: 'Redstone Holesky', + network: 'redstone-holesky', + nativeCurrency: { + decimals: 18, + name: 'Ether', + symbol: 'ETH', + }, + rpcUrls: { + default: { + http: ['https://rpc.holesky.redstone.xyz'], + webSocket: ['wss://rpc.holesky.redstone.xyz/ws'], + }, + public: { + http: ['https://rpc.holesky.redstone.xyz'], + webSocket: ['wss://rpc.holesky.redstone.xyz/ws'], + }, + }, + blockExplorers: { + default: { name: 'Explorer', url: 'https://explorer.holesky.redstone.xyz' }, + }, + }) + ``` + +3. Fügen Sie die neue Chain zum `configureChains`-Aufruf hinzu. + + ```ts + const { chains, publicClient, webSocketPublicClient } = configureChains( + [ holesky, sepolia, redstoneHolesky ], + [ publicProvider(), ], + ) + ``` + +4. Stellen Sie sicher, dass die Anwendung die Adresse für Ihre Verträge im neuen Netzwerk kennt. In diesem Fall ändern wir `src/components/Greeter.tsx`: + + ```ts + const contractAddrs : AddressPerBlockchainType = { + // Holesky + 17000: '0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8', + + // Redstone Holesky + 17001: '0x4919517f82a1B89a32392E1BF72ec827ba9986D3', + + // Sepolia + 11155111: '0x7143d5c190F048C8d19fe325b748b081903E3BF0' + } + ``` + +## Fazit {#conclusion} + +Natürlich ist es Ihnen egal, ob Sie eine Benutzeroberfläche für `Greeter` bereitstellen. Sie möchten eine Benutzeroberfläche für Ihre eigenen Verträge erstellen. Um Ihre eigene Anwendung zu erstellen, führen Sie diese Schritte aus: + +1. Geben Sie an, dass eine Wagmi-Anwendung erstellt werden soll. + + ```sh copy + pnpm create wagmi + ``` + +2. Benennen Sie die Anwendung. + +3. Wählen Sie das **React**-Framework. + +4. Wählen Sie die **Vite**-Variante. + +5. Sie können [Rainbow Kit hinzufügen](https://www.rainbowkit.com/docs/installation#manual-setup). + +Jetzt können Sie loslegen und Ihre Verträge für die ganze Welt nutzbar machen. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). + diff --git a/public/content/translations/de/developers/tutorials/deploying-your-first-smart-contract/index.md b/public/content/translations/de/developers/tutorials/deploying-your-first-smart-contract/index.md new file mode 100644 index 00000000000..02240c82ca7 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/deploying-your-first-smart-contract/index.md @@ -0,0 +1,101 @@ +--- +title: Deinen ersten Smart Contract bereitstellen +description: Eine Einführung in die Bereitstellung deines ersten Smart Contracts in einem Ethereum-Testnetzwerk +author: "jdourlens" +tags: + [ + "intelligente Verträge", + "remix", + "solidity", + "Bereitstellung" + ] +skill: beginner +lang: de +published: 2020-04-03 +source: EthereumDev +sourceUrl: https://ethereumdev.io/deploying-your-first-smart-contract/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +Ich nehme an, du bist genauso aufgeregt wie wir, deinen ersten [Smart Contract](/developers/docs/smart-contracts/) auf der Ethereum-Blockchain [bereitzustellen](/developers/docs/smart-contracts/deploying/) und mit ihm zu interagieren. + +Keine Sorge, da dies unser erster Smart Contract ist, werden wir ihn in einem [lokalen Testnetzwerk](/developers/docs/networks/) bereitstellen, sodass es dich nichts kostet, ihn bereitzustellen und so viel damit zu spielen, wie du möchtest. + +## Schreiben unseres Vertrags {#writing-our-contract} + +Der erste Schritt ist, [Remix zu besuchen](https://remix.ethereum.org/) und eine neue Datei zu erstellen. Füge im oberen linken Teil der Remix-Benutzeroberfläche eine neue Datei hinzu und gib den gewünschten Dateinamen ein. + +![Hinzufügen einer neuen Datei in der Remix-Benutzeroberfläche](./remix.png) + +In die neue Datei fügen wir den folgenden Code ein. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >=0.5.17; + +contract Counter { + + // Öffentliche Variable vom Typ vorzeichenlose Ganzzahl, um die Anzahl der Zählvorgänge zu speichern + uint256 public count = 0; + + // Funktion, die unseren Zähler erhöht + function increment() public { + count += 1; + } + + // Nicht notwendiger Getter, um den Zählwert zu erhalten + function getCount() public view returns (uint256) { + return count; + } + +} +``` + +Wenn du mit dem Programmieren vertraut bist, kannst du leicht erraten, was dieses Programm tut. Hier ist eine Erklärung, Zeile für Zeile: + +- Zeile 4: Wir definieren einen Vertrag mit dem Namen `Counter`. +- Zeile 7: Unser Vertrag speichert eine vorzeichenlose Ganzzahl namens `count`, die bei 0 beginnt. +- Zeile 10: Die erste Funktion ändert den Zustand des Vertrags und erhöht (`increment()`) unsere Variable `count`. +- Zeile 15: Die zweite Funktion ist nur ein Getter, um den Wert der Variable `count` außerhalb des Smart Contracts auslesen zu können. Beachte, dass dies nicht notwendig ist, da wir unsere `count`-Variable als öffentlich (public) definiert haben, sondern nur als Beispiel dient. + +Das ist alles für unseren ersten einfachen Smart Contract. Wie du vielleicht weißt, sieht es aus wie eine Klasse aus OOP-Sprachen (objektorientierte Programmierung) wie Java oder C++. Jetzt ist es an der Zeit, mit unserem Vertrag zu spielen. + +## Bereitstellung unseres Vertrags {#deploying-our-contract} + +Nachdem wir unseren allerersten Smart Contract geschrieben haben, werden wir ihn nun in der Blockchain bereitstellen, um damit spielen zu können. + +[Die Bereitstellung des Smart Contracts in der Blockchain](/developers/docs/smart-contracts/deploying/) ist eigentlich nur das Senden einer Transaktion, die den Code des kompilierten Smart Contracts enthält, ohne einen Empfänger anzugeben. + +Zuerst [kompilieren wir den Vertrag](/developers/docs/smart-contracts/compiling/), indem wir auf das Kompilieren-Symbol auf der linken Seite klicken: + +![Das Kompilieren-Symbol in der Remix-Symbolleiste](./remix-compile-button.png) + +Klicke dann auf die Schaltfläche „Kompilieren“: + +![Die Schaltfläche „Kompilieren“ im Remix-Solidity-Compiler](./remix-compile.png) + +Du kannst die Option „Auto compile“ wählen, damit der Vertrag immer kompiliert wird, wenn du den Inhalt im Texteditor speicherst. + +Navigiere dann zum Bildschirm „Deploy and run transactions“: + +![Das Bereitstellungssymbol in der Remix-Symbolleiste](./remix-deploy.png) + +Sobald du auf dem Bildschirm „Deploy and run transactions“ bist, überprüfe, ob dein Vertragsname erscheint, und klicke auf „Deploy“. Wie du oben auf der Seite sehen kannst, ist die aktuelle Umgebung „JavaScript VM“. Das bedeutet, dass wir unseren Smart Contract in einer lokalen Test-Blockchain bereitstellen und mit ihm interagieren, um schneller und ohne Gebühren testen zu können. + +![Die Schaltfläche „Deploy“ im Remix-Solidity-Compiler](./remix-deploy-button.png) + +Sobald du auf die Schaltfläche „Deploy“ geklickt hast, siehst du deinen Vertrag unten erscheinen. Klicke auf den Pfeil links, um ihn zu erweitern, damit wir den Inhalt unseres Vertrags sehen. Das sind unsere Variable `counter`, unsere Funktion `increment()` und der Getter `getCounter()`. + +Wenn du auf die Schaltfläche `count` oder `getCount` klickst, wird der Inhalt der `count`-Variable des Vertrags abgerufen und angezeigt. Da wir die Funktion `increment` noch nicht aufgerufen haben, sollte 0 angezeigt werden. + +![Die Funktionsschaltfläche im Remix-Solidity-Compiler](./remix-function-button.png) + +Rufen wir nun die Funktion `increment` auf, indem wir auf die Schaltfläche klicken. Du wirst am unteren Rand des Fensters die Protokolle der durchgeführten Transaktionen sehen. Du wirst sehen, dass die Protokolle anders aussehen, wenn du die Schaltfläche zum Abrufen der Daten anstelle der Schaltfläche `increment` drückst. Das liegt daran, dass das Lesen von Daten auf der Blockchain keine Transaktionen (Schreibvorgänge) oder Gebühren erfordert. Denn nur die Änderung des Zustands der Blockchain erfordert eine Transaktion: + +![Ein Transaktionsprotokoll](./transaction-log.png) + +Nachdem du die Schaltfläche `increment` gedrückt hast, die eine Transaktion zum Aufruf unserer `increment()`-Funktion generiert, lesen wir den neu aktualisierten Zustand unseres Smart Contracts, wenn wir wieder auf die Schaltflächen `count` oder `getCount` klicken, wobei die Variable `count` größer als 0 ist. + +![Neu aktualisierter Zustand des Smart Contracts](./updated-state.png) + +Im nächsten Tutorial befassen wir uns damit, [wie du Events zu deinen Smart Contracts hinzufügen kannst](/developers/tutorials/logging-events-smart-contracts/). Die Protokollierung von Events ist eine bequeme Möglichkeit, deinen Smart Contract zu debuggen und zu verstehen, was beim Aufruf einer Funktion passiert. diff --git a/public/content/translations/de/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md b/public/content/translations/de/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md new file mode 100644 index 00000000000..334c9252b32 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md @@ -0,0 +1,372 @@ +--- +title: Wie man eine Dapp auf einem lokalen Multi-Client-Testnet entwickelt und testet +description: Dieser Leitfaden führt Sie zunächst durch die Instanziierung und Konfiguration eines lokalen Multi-Client-Ethereum-Testnets, bevor Sie das Testnet zur Bereitstellung und zum Testen einer Dapp verwenden. +author: "Tedi Mitiku" +tags: + [ + "Clients", + "Nodes", + "intelligente Verträge", + "Komponierbarkeit", + "Konsensebene", + "Ausführungsebene", + "testen" + ] +skill: intermediate +lang: de +published: 2023-04-11 +--- + +## Einführung {#introduction} + +Dieser Leitfaden führt Sie durch den Prozess der Instanziierung eines konfigurierbaren lokalen Ethereum-Testnets, der Bereitstellung eines Smart Contracts und der Verwendung des Testnets, um Tests mit Ihrer Dapp durchzuführen. Dieser Leitfaden richtet sich an Dapp-Entwickler, die ihre Dapps lokal mit verschiedenen Netzwerkkonfigurationen entwickeln und testen möchten, bevor sie sie auf einem Live-Testnet oder dem Mainnet bereitstellen. + +In diesem Leitfaden werden Sie: + +- Ein lokales Ethereum-Testnet mit dem [`eth-network-package`](https://github.com/kurtosis-tech/eth-network-package) unter Verwendung von [Kurtosis](https://www.kurtosis.com/) instanziieren, +- Ihre Hardhat Dapp-Entwicklungsumgebung mit dem lokalen Testnet verbinden, um eine Dapp zu kompilieren, bereitzustellen und zu testen, und +- Das lokale Testnet konfigurieren, einschließlich Parametern wie der Anzahl der Nodes und spezifischen EL/CL-Client-Paarungen, um Entwicklungs- und Test-Workflows für verschiedene Netzwerkkonfigurationen zu ermöglichen. + +### Was ist Kurtosis? {#what-is-kurtosis} + +[Kurtosis](https://www.kurtosis.com/) ist ein zusammensetzbares Build-System, das für die Konfiguration von Multi-Container-Testumgebungen entwickelt wurde. Es ermöglicht Entwicklern insbesondere, reproduzierbare Umgebungen zu erstellen, die eine dynamische Einrichtungslogik erfordern, wie zum Beispiel Blockchain-Testnets. + +In diesem Leitfaden startet das Kurtosis-eth-network-package ein lokales Ethereum-Testnet mit Unterstützung für den [`geth`](https://geth.ethereum.org/) Ausführungsebenen-Client (EL) sowie die [`teku`](https://consensys.io/teku), [`lighthouse`](https://lighthouse.sigmaprime.io/) und [`lodestar`](https://lodestar.chainsafe.io/) Konsensebenen-Clients (CL). Dieses Paket dient als eine konfigurierbare und zusammensetzbare Alternative zu Netzwerken in Frameworks wie Hardhat Network, Ganache und Anvil. Kurtosis bietet Entwicklern mehr Kontrolle und Flexibilität über die von ihnen verwendeten Testnets, was ein Hauptgrund dafür ist, dass die [Ethereum Foundation Kurtosis zum Testen des Merge verwendet hat](https://www.kurtosis.com/blog/testing-the-ethereum-merge) und es weiterhin zum Testen von Netzwerk-Upgrades verwendet. + +## Einrichten von Kurtosis {#setting-up-kurtosis} + +Bevor Sie fortfahren, stellen Sie sicher, dass Sie Folgendes haben: + +- [Die Docker-Engine auf Ihrem lokalen Rechner installiert und gestartet](https://docs.kurtosis.com/install/#i-install--start-docker) +- [Die Kurtosis CLI installiert](https://docs.kurtosis.com/install#ii-install-the-cli) (oder auf die neueste Version aktualisiert, falls Sie die CLI bereits installiert haben) +- [Node.js](https://nodejs.org/en), [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable) und [npx](https://www.npmjs.com/package/npx) installiert (für Ihre Dapp-Umgebung) + +## Ein lokales Ethereum-Testnet instanziieren {#instantiate-testnet} + +Um ein lokales Ethereum-Testnet zu starten, führen Sie Folgendes aus: + +```python +kurtosis --enclave local-eth-testnet run github.com/kurtosis-tech/eth-network-package +``` + +Hinweis: Dieser Befehl benennt Ihr Netzwerk: \"local-eth-testnet\" über das `--enclave`-Flag. + +Kurtosis gibt die Schritte aus, die im Hintergrund durchgeführt werden, während es die Anweisungen interpretiert, validiert und ausführt. Am Ende sollten Sie eine Ausgabe sehen, die der folgenden ähnelt: + +```python +INFO[2023-04-04T18:09:44-04:00] ====================================================== +INFO[2023-04-04T18:09:44-04:00] || Created enclave: local-eth-testnet || +INFO[2023-04-04T18:09:44-04:00] ====================================================== +Name: local-eth-testnet +UUID: 39372d756ae8 +Status: RUNNING +Creation Time: Tue, 04 Apr 2023 18:09:03 EDT + +========================================= Files Artifacts ========================================= +UUID Name +d4085a064230 cl-genesis-data +1c62cb792e4c el-genesis-data +bd60489b73a7 genesis-generation-config-cl +b2e593fe5228 genesis-generation-config-el +d552a54acf78 geth-prefunded-keys +5f7e661eb838 prysm-password +054e7338bb59 validator-keystore-0 + +========================================== User Services ========================================== +UUID Name Ports Status +e20f129ee0c5 cl-client-0-beacon http: 4000/tcp -> RUNNING + metrics: 5054/tcp -> + tcp-discovery: 9000/tcp -> 127.0.0.1:54263 + udp-discovery: 9000/udp -> 127.0.0.1:60470 +a8b6c926cdb4 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:54267 RUNNING + metrics: 5064/tcp -> +d7b802f623e8 el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:54253 RUNNING + rpc: 8545/tcp -> 127.0.0.1:54251 + tcp-discovery: 30303/tcp -> 127.0.0.1:54254 + udp-discovery: 30303/udp -> 127.0.0.1:53834 + ws: 8546/tcp -> 127.0.0.1:54252 +514a829c0a84 prelaunch-data-generator-1680646157905431468 STOPPED +62bd62d0aa7a prelaunch-data-generator-1680646157915424301 STOPPED +05e9619e0e90 prelaunch-data-generator-1680646157922872635 STOPPED + +``` + +Herzlichen Glückwunsch! Sie haben Kurtosis verwendet, um ein lokales Ethereum-Testnet mit einem CL- (`lighthouse`) und einem EL-Client (`geth`) über Docker zu instanziieren. + +### Überprüfung {#review-instantiate-testnet} + +In diesem Abschnitt haben Sie einen Befehl ausgeführt, der Kurtosis anwies, das [remote auf GitHub gehostete `eth-network-package`](https://github.com/kurtosis-tech/eth-network-package) zu verwenden, um ein lokales Ethereum-Testnet innerhalb einer Kurtosis [Enclave](https://docs.kurtosis.com/advanced-concepts/enclaves/) zu starten. Innerhalb Ihrer Enklave finden Sie sowohl \"Datei-Artefakte\" als auch \"Benutzerdienste\". + +Die [Datei-Artefakte](https://docs.kurtosis.com/advanced-concepts/files-artifacts/) in Ihrer Enklave enthalten alle Daten, die generiert und verwendet werden, um die EL- und CL-Clients zu booten. Die Daten wurden mit dem `prelaunch-data-generator`-Dienst erstellt, der aus diesem [Docker-Image](https://github.com/ethpandaops/ethereum-genesis-generator) gebaut wurde + +Benutzerdienste zeigen alle containerisierten Dienste an, die in Ihrer Enklave betrieben werden. Sie werden feststellen, dass ein einzelner Node erstellt wurde, der sowohl einen EL-Client als auch einen CL-Client enthält. + +## Verbinden Sie Ihre Dapp-Entwicklungsumgebung mit dem lokalen Ethereum-Testnet {#connect-your-dapp} + +### Einrichten der Dapp-Entwicklungsumgebung {#set-up-dapp-env} + +Nachdem Sie nun ein laufendes lokales Testnet haben, können Sie Ihre Dapp-Entwicklungsumgebung mit Ihrem lokalen Testnet verbinden. In diesem Leitfaden wird das Hardhat-Framework verwendet, um eine Blackjack-Dapp auf Ihrem lokalen Testnet bereitzustellen. + +Um Ihre Dapp-Entwicklungsumgebung einzurichten, klonen Sie das Repository, das unsere Beispiel-Dapp enthält, und installieren Sie dessen Abhängigkeiten. Führen Sie dazu Folgendes aus: + +```python +git clone https://github.com/kurtosis-tech/awesome-kurtosis.git && cd awesome-kurtosis/smart-contract-example && yarn +``` + +Der hier verwendete Ordner [smart-contract-example](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example) enthält das typische Setup für einen Dapp-Entwickler, der das [Hardhat](https://hardhat.org/)-Framework verwendet: + +- [`contracts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/contracts) enthält einige einfache Smart Contracts für eine Blackjack-Dapp +- [`scripts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/scripts) enthält ein Skript zur Bereitstellung eines Token-Vertrags in Ihrem lokalen Ethereum-Netzwerk +- [`test/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/test) enthält einen einfachen .js-Test für Ihren Token-Vertrag, um zu bestätigen, dass für jeden Spieler in unserer Blackjack-Dapp 1000 gemintet wurden +- [`hardhat.config.ts`](https://github.com/kurtosis-tech/awesome-kurtosis/blob/main/smart-contract-example/hardhat.config.ts) konfiguriert Ihr Hardhat-Setup + +### Hardhat für die Verwendung des lokalen Testnets konfigurieren {#configure-hardhat} + +Nachdem Ihre Dapp-Entwicklungsumgebung eingerichtet ist, verbinden Sie nun Hardhat, um das mit Kurtosis generierte lokale Ethereum-Testnet zu verwenden. Um dies zu erreichen, ersetzen Sie `<$YOUR_PORT>` in der `localnet`-Struktur in Ihrer `hardhat.config.ts`-Konfigurationsdatei mit dem Port der RPC-URI-Ausgabe eines beliebigen `el-client-`-Dienstes. In diesem Beispielfall wäre der Port `64248`. Ihr Port wird ein anderer sein. + +Beispiel in `hardhat.config.ts`: + +```js +localnet: { +url: 'http://127.0.0.1:<$YOUR_PORT>',// TODO: ERSETZEN SIE $YOUR_PORT DURCH DEN PORT EINER NODE-URI, DIE VOM ETH-NETZWERK-KURTOSIS-PAKET ERZEUGT WURDE + +// Dies sind private Schlüssel, die mit vorfinanzierten Testkonten verbunden sind, die vom eth-network-package erstellt wurden +// +accounts: [ + "ef5177cd0b6b21c87db5a0bf35d4084a8a57a9d6a064f86d51ac85f2b873a4e2", + "48fcc39ae27a0e8bf0274021ae6ebd8fe4a0e12623d61464c498900b28feb567", + "7988b3a148716ff800414935b305436493e1f25237a2a03e5eebc343735e2f31", + "b3c409b6b0b3aa5e65ab2dc1930534608239a478106acf6f3d9178e9f9b00b35", + "df9bb6de5d3dc59595bcaa676397d837ff49441d211878c024eabda2cd067c9f", + "7da08f856b5956d40a72968f93396f6acff17193f013e8053f6fbb6c08c194d6", + ], +}, +``` + +Sobald Sie Ihre Datei gespeichert haben, ist Ihre Hardhat Dapp-Entwicklungsumgebung mit Ihrem lokalen Ethereum-Testnet verbunden! Sie können überprüfen, ob Ihr Testnet funktioniert, indem Sie Folgendes ausführen: + +```python +npx hardhat balances --network localnet +``` + +Die Ausgabe sollte etwa so aussehen: + +```python +0x878705ba3f8Bc32FCf7F4CAa1A35E72AF65CF766 has balance 10000000000000000000000000 +0x4E9A3d9D1cd2A2b2371b8b3F489aE72259886f1A has balance 10000000000000000000000000 +0xdF8466f277964Bb7a0FFD819403302C34DCD530A has balance 10000000000000000000000000 +0x5c613e39Fc0Ad91AfDA24587e6f52192d75FBA50 has balance 10000000000000000000000000 +0x375ae6107f8cC4cF34842B71C6F746a362Ad8EAc has balance 10000000000000000000000000 +0x1F6298457C5d76270325B724Da5d1953923a6B88 has balance 10000000000000000000000000 +``` + +Dies bestätigt, dass Hardhat Ihr lokales Testnet verwendet und die vom `eth-network-package` erstellten vorfinanzierten Konten erkennt. + +### Ihre Dapp lokal bereitstellen und testen {#deploy-and-test-dapp} + +Nachdem die Dapp-Entwicklungsumgebung vollständig mit dem lokalen Ethereum-Testnet verbunden ist, können Sie nun Entwicklungs- und Test-Workflows für Ihre Dapp mit dem lokalen Testnet ausführen. + +Um den `ChipToken.sol`-Smart-Contract für lokales Prototyping und Entwicklung zu kompilieren und bereitzustellen, führen Sie Folgendes aus: + +```python +npx hardhat compile +npx hardhat run scripts/deploy.ts --network localnet +``` + +Die Ausgabe sollte etwa so aussehen: + +```python +ChipToken deployed to: 0xAb2A01BC351770D09611Ac80f1DE076D56E0487d +``` + +Führen Sie nun den `simple.js`-Test für Ihre lokale Dapp aus, um zu bestätigen, dass für jeden Spieler in unserer Blackjack-Dapp 1000 gemintet wurden: + +Die Ausgabe sollte etwa so aussehen: + +```python +npx hardhat test --network localnet +``` + +Die Ausgabe sollte etwa so aussehen: + +```python +ChipToken + mint + ✔ sollte 1000 Chips für SPIELER EINS minten + + 1 bestanden (654ms) +``` + +### Überprüfung {#review-dapp-workflows} + +An diesem Punkt haben Sie nun eine Dapp-Entwicklungsumgebung eingerichtet, sie mit einem von Kurtosis erstellten lokalen Ethereum-Netzwerk verbunden und einen einfachen Test für Ihre Dapp kompiliert, bereitgestellt und ausgeführt. + +Lassen Sie uns nun untersuchen, wie Sie das zugrunde liegende Netzwerk für das Testen unserer Dapps unter verschiedenen Netzwerkkonfigurationen konfigurieren können. + +## Konfigurieren des lokalen Ethereum-Testnets {#configure-testnet} + +### Ändern der Client-Konfigurationen und der Anzahl der Nodes {#configure-client-config-and-num-nodes} + +Ihr lokales Ethereum-Testnet kann so konfiguriert werden, dass es verschiedene EL- und CL-Client-Paare sowie eine unterschiedliche Anzahl von Nodes verwendet, je nach Szenario und spezifischer Netzwerkkonfiguration, die Sie entwickeln oder testen möchten. Das bedeutet, dass Sie nach der Einrichtung ein angepasstes lokales Testnet starten und damit dieselben Arbeitsabläufe (Bereitstellung, Tests usw.) ausführen können. unter verschiedenen Netzwerkkonfigurationen, um sicherzustellen, dass alles wie erwartet funktioniert. Um mehr über die anderen Parameter zu erfahren, die Sie ändern können, besuchen Sie diesen Link. + +Probieren Sie es aus! Sie können verschiedene Konfigurationsoptionen über eine JSON-Datei an das `eth-network-package` übergeben. Diese Netzwerkparameter-JSON-Datei stellt die spezifischen Konfigurationen bereit, die Kurtosis zum Einrichten des lokalen Ethereum-Netzwerks verwenden wird. + +Nehmen Sie die Standardkonfigurationsdatei und bearbeiten Sie sie, um drei Nodes mit unterschiedlichen EL/CL-Paaren zu starten: + +- Node 1 mit `geth`/`lighthouse` +- Node 2 mit `geth`/`lodestar` +- Node 3 mit `geth`/`teku` + +Diese Konfiguration erstellt ein heterogenes Netzwerk von Ethereum-Node-Implementierungen zum Testen Ihrer Dapp. Ihre Konfigurationsdatei sollte jetzt so aussehen: + +```yaml +{ + "participants": + [ + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "lighthouse", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null, + }, + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "lodestar", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null, + }, + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "teku", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null, + }, + ], + "network_params": + { + "preregistered_validator_keys_mnemonic": "giant issue aisle success illegal bike spike question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy very lucky have athlete", + "num_validator_keys_per_node": 64, + "network_id": "3151908", + "deposit_contract_address": "0x4242424242424242424242424242424242424242", + "seconds_per_slot": 12, + "genesis_delay": 120, + "capella_fork_epoch": 5, + }, +} +``` + +Jede `participants`-Struktur entspricht einem Node im Netzwerk, sodass 3 `participants`-Strukturen Kurtosis anweisen, 3 Nodes in Ihrem Netzwerk zu starten. Jede `participants`-Struktur ermöglicht es Ihnen, das für diesen spezifischen Node verwendete EL- und CL-Paar anzugeben. + +Die `network_params`-Struktur konfiguriert die Netzwerkeinstellungen, die verwendet werden, um die Genesis-Dateien für jeden Node zu erstellen, sowie andere Einstellungen wie die Sekunden pro Slot des Netzwerks. + +Speichern Sie Ihre bearbeitete Parameterdatei in einem beliebigen Verzeichnis (im folgenden Beispiel wird sie auf dem Desktop gespeichert) und verwenden Sie sie dann, um Ihr Kurtosis-Paket auszuführen, indem Sie Folgendes ausführen: + +```python +kurtosis clean -a && kurtosis run --enclave local-eth-testnet github.com/kurtosis-tech/eth-network-package "$(cat ~/eth-network-params.json)" +``` + +Hinweis: Der Befehl `kurtosis clean -a` wird hier verwendet, um Kurtosis anzuweisen, das alte Testnet und seinen Inhalt zu zerstören, bevor ein neues gestartet wird. + +Auch hier wird Kurtosis eine Weile arbeiten und die einzelnen Schritte ausgeben, die stattfinden. Schließlich sollte die Ausgabe etwa so aussehen: + +```python +Starlark-Code erfolgreich ausgeführt. Keine Ausgabe zurückgegeben. +INFO[2023-04-07T11:43:16-04:00] ========================================================== +INFO[2023-04-07T11:43:16-04:00] || Created enclave: local-eth-testnet || +INFO[2023-04-07T11:43:16-04:00] ========================================================== +Name: local-eth-testnet +UUID: bef8c192008e +Status: RUNNING +Creation Time: Fri, 07 Apr 2023 11:41:58 EDT + +========================================= Files Artifacts ========================================= +UUID Name +cc495a8e364a cl-genesis-data +7033fcdb5471 el-genesis-data +a3aef43fc738 genesis-generation-config-cl +8e968005fc9d genesis-generation-config-el +3182cca9d3cd geth-prefunded-keys +8421166e234f prysm-password +d9e6e8d44d99 validator-keystore-0 +23f5ba517394 validator-keystore-1 +4d28dea40b5c validator-keystore-2 + +========================================== User Services ========================================== +UUID Name Ports Status +485e6fde55ae cl-client-0-beacon http: 4000/tcp -> http://127.0.0.1:65010 RUNNING + metrics: 5054/tcp -> http://127.0.0.1:65011 + tcp-discovery: 9000/tcp -> 127.0.0.1:65012 + udp-discovery: 9000/udp -> 127.0.0.1:54455 +73739bd158b2 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:65016 RUNNING + metrics: 5064/tcp -> http://127.0.0.1:65017 +1b0a233cd011 cl-client-1-beacon http: 4000/tcp -> 127.0.0.1:65021 RUNNING + metrics: 8008/tcp -> 127.0.0.1:65023 + tcp-discovery: 9000/tcp -> 127.0.0.1:65024 + udp-discovery: 9000/udp -> 127.0.0.1:56031 + validator-metrics: 5064/tcp -> 127.0.0.1:65022 +949b8220cd53 cl-client-1-validator http: 4000/tcp -> 127.0.0.1:65028 RUNNING + metrics: 8008/tcp -> 127.0.0.1:65030 + tcp-discovery: 9000/tcp -> 127.0.0.1:65031 + udp-discovery: 9000/udp -> 127.0.0.1:60784 + validator-metrics: 5064/tcp -> 127.0.0.1:65029 +c34417bea5fa cl-client-2 http: 4000/tcp -> 127.0.0.1:65037 RUNNING + metrics: 8008/tcp -> 127.0.0.1:65035 + tcp-discovery: 9000/tcp -> 127.0.0.1:65036 + udp-discovery: 9000/udp -> 127.0.0.1:63581 +e19738e6329d el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:64986 RUNNING + rpc: 8545/tcp -> 127.0.0.1:64988 + tcp-discovery: 30303/tcp -> 127.0.0.1:64987 + udp-discovery: 30303/udp -> 127.0.0.1:55706 + ws: 8546/tcp -> 127.0.0.1:64989 +e904687449d9 el-client-1 engine-rpc: 8551/tcp -> 127.0.0.1:64993 RUNNING + rpc: 8545/tcp -> 127.0.0.1:64995 + tcp-discovery: 30303/tcp -> 127.0.0.1:64994 + udp-discovery: 30303/udp -> 127.0.0.1:58096 + ws: 8546/tcp -> 127.0.0.1:64996 +ad6f401126fa el-client-2 engine-rpc: 8551/tcp -> 127.0.0.1:65003 RUNNING + rpc: 8545/tcp -> 127.0.0.1:65001 + tcp-discovery: 30303/tcp -> 127.0.0.1:65000 + udp-discovery: 30303/udp -> 127.0.0.1:57269 + ws: 8546/tcp -> 127.0.0.1:65002 +12d04a9dbb69 prelaunch-data-generator-1680882122181135513 STOPPED +5b45f9c0504b prelaunch-data-generator-1680882122192182847 STOPPED +3d4aaa75e218 prelaunch-data-generator-1680882122201668972 STOPPED +``` + +Herzlichen Glückwunsch! Sie haben Ihr lokales Testnet erfolgreich so konfiguriert, dass es 3 Nodes anstelle von 1 hat. Um dieselben Arbeitsabläufe wie zuvor mit Ihrer Dapp auszuführen (Bereitstellen und Testen), führen Sie dieselben Operationen wie zuvor durch, indem Sie `<$YOUR_PORT>` in der `localnet`-Struktur Ihrer `hardhat.config.ts`-Konfigurationsdatei durch den Port der RPC-URI-Ausgabe eines beliebigen `el-client-`-Dienstes in Ihrem neuen, 3-Node-lokalen Testnet ersetzen. + +## Fazit {#conclusion} + +Und das war's! Zusammenfassend haben Sie in diesem kurzen Leitfaden: + +- Ein lokales Ethereum-Testnet über Docker mit Kurtosis erstellt +- Ihre lokale Dapp-Entwicklungsumgebung mit dem lokalen Ethereum-Netzwerk verbunden +- Eine Dapp bereitgestellt und einen einfachen Test darauf im lokalen Ethereum-Netzwerk ausgeführt +- Das zugrunde liegende Ethereum-Netzwerk so konfiguriert, dass es 3 Nodes hat + +Wir würden uns freuen, von Ihnen zu hören, was für Sie gut gelaufen ist, was verbessert werden könnte, oder Ihre Fragen zu beantworten. Zögern Sie nicht, uns über [GitHub](https://github.com/kurtosis-tech/kurtosis/issues/new/choose) oder per [E-Mail](mailto:feedback@kurtosistech.com) zu kontaktieren! + +### Weitere Beispiele und Anleitungen {#other-examples-guides} + +Wir empfehlen Ihnen, unseren [Quickstart](https://docs.kurtosis.com/quickstart) (wo Sie eine Postgres-Datenbank und eine API darauf aufbauen) und unsere anderen Beispiele in unserem [awesome-kurtosis Repository](https://github.com/kurtosis-tech/awesome-kurtosis) anzusehen, wo Sie einige großartige Beispiele finden, einschließlich Paketen für: + +- [Starten desselben lokalen Ethereum-Testnets](https://github.com/kurtosis-tech/eth2-package), aber mit zusätzlichen verbundenen Diensten wie einem Transaktions-Spammer (um Transaktionen zu simulieren), einem Fork-Monitor und einer verbundenen Grafana- und Prometheus-Instanz +- Durchführen eines [Sub-Networking-Tests](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/ethereum-network-partition-test) gegen dasselbe lokale Ethereum-Netzwerk diff --git a/public/content/translations/de/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md b/public/content/translations/de/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md new file mode 100644 index 00000000000..351c5e2f29c --- /dev/null +++ b/public/content/translations/de/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md @@ -0,0 +1,144 @@ +--- +title: "Verträge verkleinern, um die Vertragsgrößenbeschränkung zu bekämpfen" +description: Was kannst du tun, um zu verhindern, dass deine Smart Contracts zu groß werden? +author: Markus Waas +lang: de +tags: [ "solidity", "intelligente Verträge", "Speicher" ] +skill: intermediate +published: 2020-06-26 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/max-contract-size +--- + +## Warum gibt es ein Limit? {#why-is-there-a-limit} + +Am [22. November 2016](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon/) wurde mit dem Spurious Dragon Hard-Fork [EIP-170](https://eips.ethereum.org/EIPS/eip-170) ein Größenlimit von 24.576 kB für Smart Contracts eingeführt. Für dich als Solidity-Entwickler bedeutet dies: Wenn du deinem Vertrag immer mehr Funktionalität hinzufügst, wirst du irgendwann das Limit erreichen und beim Deployment folgenden Fehler sehen: + +`Warning: Contract code size exceeds 24576 bytes (a limit introduced in Spurious Dragon). This contract may not be deployable on Mainnet. Consider enabling the optimizer (with a low "runs" value!), turning off revert strings, or using libraries.` + +Dieses Limit wurde eingeführt, um Denial-of-Service-Angriffe (DOS) zu verhindern. Jeder Aufruf eines Vertrags ist in Bezug auf das Gas relativ günstig. Die Auswirkung eines Vertragsaufrufs für Ethereum-Nodes steigt jedoch in Abhängigkeit von der Größe des aufgerufenen Vertragscodes unverhältnismäßig an (Lesen des Codes von der Festplatte, Vorverarbeitung des Codes, Hinzufügen von Daten zum Merkle-Proof). Immer wenn eine Situation vorliegt, in der der Angreifer nur wenige Ressourcen benötigt, um anderen viel Arbeit zu verursachen, besteht die Gefahr von DOS-Angriffen. + +Ursprünglich war dies kein so großes Problem, da eine natürliche Begrenzung der Vertragsgröße das Block-Gaslimit ist. Ein Vertrag muss natürlich innerhalb einer Transaktion bereitgestellt werden, die den gesamten Bytecode des Vertrags enthält. Wenn du nur diese eine Transaktion in einen Block aufnimmst, kannst du das gesamte Gas verbrauchen, aber es ist nicht unendlich. Seit dem [London-Upgrade](/ethereum-forks/#london) kann das Block-Gaslimit je nach Netzwerkauslastung zwischen 15 und 30 Millionen Einheiten variieren. + +Im Folgenden werden wir uns einige Methoden ansehen, geordnet nach ihrer potenziellen Auswirkung. Stell es dir wie beim Abnehmen vor. Die beste Strategie, um das Zielgewicht zu erreichen (in unserem Fall 24 kB), ist, sich zuerst auf die Methoden mit der größten Wirkung zu konzentrieren. In den meisten Fällen reicht eine Ernährungsumstellung aus, um dieses Ziel zu erreichen, aber manchmal braucht man ein bisschen mehr. Dann könntest du etwas Sport (mittlere Auswirkung) oder sogar Nahrungsergänzungsmittel (geringe Auswirkung) hinzufügen. + +## Große Auswirkung {#big-impact} + +### Trenne deine Verträge {#separate-your-contracts} + +Das sollte immer dein erster Ansatz sein. Wie kannst du den Vertrag in mehrere kleinere aufteilen? Im Allgemeinen zwingt dich das, eine gute Architektur für deine Verträge zu entwickeln. Kleinere Verträge sind aus Sicht der Code-Lesbarkeit immer zu bevorzugen. Stell dir beim Aufteilen von Verträgen folgende Fragen: + +- Welche Funktionen gehören zusammen? Jede Gruppe von Funktionen ist möglicherweise in einem eigenen Vertrag am besten aufgehoben. +- Welche Funktionen erfordern nicht das Lesen des Vertragszustands oder nur einer bestimmten Teilmenge des Zustands? +- Kannst du Speicher und Funktionalität trennen? + +### Bibliotheken {#libraries} + +Eine einfache Möglichkeit, den Funktionalitätscode vom Speicher zu trennen, ist die Verwendung einer [Bibliothek](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#libraries). Deklariere die Bibliotheksfunktionen nicht als „internal“, da diese während der Kompilierung direkt [zum Vertrag hinzugefügt](https://ethereum.stackexchange.com/questions/12975/are-internal-functions-in-libraries-not-covered-by-linking) werden. Wenn du aber „public“-Funktionen verwendest, befinden sich diese tatsächlich in einem separaten Bibliotheksvertrag. Erwäge die Verwendung von „[using for](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#using-for)“, um die Nutzung von Bibliotheken komfortabler zu gestalten. + +### Proxys {#proxies} + +Eine fortgeschrittenere Strategie wäre ein Proxysystem. Bibliotheken verwenden im Hintergrund `DELEGATECALL`, was einfach die Funktion eines anderen Vertrags mit dem Zustand des aufrufenden Vertrags ausführt. In [diesem Blogbeitrag](https://hackernoon.com/how-to-make-smart-contracts-upgradable-2612e771d5a2) erfährst du mehr über Proxysysteme. Sie bieten dir mehr Funktionalität, z. B. ermöglichen sie die Upgradefähigkeit, aber sie fügen auch eine Menge Komplexität hinzu. Ich würde sie nicht nur zur Reduzierung der Vertragsgröße hinzufügen, es sei denn, es ist aus irgendeinem Grund deine einzige Option. + +## Mittlere Auswirkung {#medium-impact} + +### Funktionen entfernen {#remove-functions} + +Das sollte selbsterklärend sein. Funktionen vergrößern einen Vertrag erheblich. + +- **External**: Oft fügen wir aus Bequemlichkeitsgründen viele Ansichtsfunktionen hinzu. Das ist völlig in Ordnung, bis du an das Größenlimit stößt. Dann solltest du wirklich darüber nachdenken, alle bis auf die absolut notwendigen zu entfernen. +- **Internal**: Du kannst auch interne/private Funktionen entfernen und den Code einfach inline einfügen, solange die Funktion nur einmal aufgerufen wird. + +### Vermeide zusätzliche Variablen {#avoid-additional-variables} + +```solidity +function get(uint id) returns (address,address) { + MyStruct memory myStruct = myStructs[id]; + return (myStruct.addr1, myStruct.addr2); +} +``` + +```solidity +function get(uint id) returns (address,address) { + return (myStructs[id].addr1, myStructs[id].addr2); +} +``` + +Eine einfache Änderung wie diese macht einen Unterschied von **0,28 kB** aus. Wahrscheinlich findest du viele ähnliche Situationen in deinen Verträgen, und diese können sich wirklich zu erheblichen Mengen summieren. + +### Fehlermeldungen kürzen {#shorten-error-message} + +Lange „revert“-Meldungen und insbesondere viele verschiedene „revert“-Meldungen können den Vertrag aufblähen. Verwende stattdessen kurze Fehlercodes und dekodiere sie in deinem Vertrag. Eine lange Meldung könnte viel kürzer werden: + +```solidity +require(msg.sender == owner, "Nur der Besitzer dieses Vertrags kann diese Funktion aufrufen"); +``` + +```solidity +require(msg.sender == owner, "OW1"); +``` + +### Verwende benutzerdefinierte Fehler anstelle von Fehlermeldungen + +Benutzerdefinierte Fehler wurden in [Solidity 0.8.4](https://blog.soliditylang.org/2021/04/21/custom-errors/) eingeführt. Sie sind eine großartige Möglichkeit, die Größe deiner Verträge zu reduzieren, da sie als Selektoren ABI-kodiert werden (genau wie Funktionen). + +```solidity +error Unauthorized(); + +if (msg.sender != owner) { + revert Unauthorized(); +} +``` + +### Ziehe einen niedrigen „run“-Wert im Optimizer in Betracht {#consider-a-low-run-value-in-the-optimizer} + +Du kannst auch die Optimizer-Einstellungen ändern. Der Standardwert von 200 bedeutet, dass er versucht, den Bytecode so zu optimieren, als ob eine Funktion 200 Mal aufgerufen würde. Wenn du ihn auf 1 änderst, weist du den Optimizer im Grunde an, für den Fall zu optimieren, dass jede Funktion nur einmal ausgeführt wird. Eine für die einmalige Ausführung optimierte Funktion bedeutet, dass sie für die Bereitstellung selbst optimiert ist. Beachte, dass **dies die [Gaskosten](/developers/docs/gas/) für die Ausführung der Funktionen erhöht**, also möchtest du das vielleicht nicht tun. + +## Geringe Auswirkung {#small-impact} + +### Vermeide die Übergabe von Structs an Funktionen {#avoid-passing-structs-to-functions} + +Wenn du den [ABIEncoderV2](https://solidity.readthedocs.io/en/v0.6.10/layout-of-source-files.html#abiencoderv2) verwendest, kann es helfen, keine Structs an eine Funktion zu übergeben. Anstatt den Parameter als Struct zu übergeben, übergib die erforderlichen Parameter direkt. In diesem Beispiel haben wir weitere **0,1 kB** gespart. + +```solidity +function get(uint id) returns (address,address) { + return _get(myStruct); +} + +function _get(MyStruct memory myStruct) private view returns(address,address) { + return (myStruct.addr1, myStruct.addr2); +} +``` + +```solidity +function get(uint id) returns(address,address) { + return _get(myStructs[id].addr1, myStructs[id].addr2); +} + +function _get(address addr1, address addr2) private view returns(address,address) { + return (addr1, addr2); +} +``` + +### Korrekte Sichtbarkeit für Funktionen und Variablen deklarieren {#declare-correct-visibility-for-functions-and-variables} + +- Funktionen oder Variablen, die nur von außen aufgerufen werden? Deklariere sie als `external` anstatt `public`. +- Funktionen oder Variablen, die nur innerhalb des Vertrags aufgerufen werden? Deklariere sie als `private` oder `internal` anstatt `public`. + +### Modifier entfernen {#remove-modifiers} + +Modifier können, insbesondere bei intensiver Nutzung, einen erheblichen Einfluss auf die Vertragsgröße haben. Erwäge, sie zu entfernen und stattdessen Funktionen zu verwenden. + +```solidity +modifier checkStuff() {} + +function doSomething() checkStuff {} +``` + +```solidity +function checkStuff() private {} + +function doSomething() { checkStuff(); } +``` + +Diese Tipps sollten dir helfen, die Vertragsgröße erheblich zu reduzieren. Noch einmal, ich kann nicht genug betonen: Konzentriere dich immer auf die Aufteilung von Verträgen, wenn möglich, um die größte Wirkung zu erzielen. diff --git a/public/content/translations/de/developers/tutorials/eip-1271-smart-contract-signatures/index.md b/public/content/translations/de/developers/tutorials/eip-1271-smart-contract-signatures/index.md new file mode 100644 index 00000000000..699fe68e374 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/eip-1271-smart-contract-signatures/index.md @@ -0,0 +1,129 @@ +--- +title: "EIP-1271: Signieren und Verifizieren von Smart-Contract-Signaturen" +description: Ein Überblick über die Erstellung und Verifizierung von Smart-Contract-Signaturen mit EIP-1271. Wir gehen auch die in Safe (ehemals Gnosis Safe) verwendete EIP-1271-Implementierung durch, um Smart-Contract-Entwicklern ein konkretes Beispiel zu geben, auf dem sie aufbauen können. +author: Nathan H. Leung +lang: de +tags: + [ + "eip-1271", + "Smart Contracts", + "verifizieren", + "Signieren" + ] +skill: intermediate +published: 2023-01-12 +--- + +Der [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271)-Standard ermöglicht es Smart Contracts, Signaturen zu verifizieren. + +In diesem Tutorial geben wir einen Überblick über digitale Signaturen, den Hintergrund von EIP-1271 und die spezifische Implementierung von EIP-1271, die von [Safe](https://safe.global/) (ehemals Gnosis Safe) verwendet wird. Alles in allem kann dies als Ausgangspunkt für die Implementierung von EIP-1271 in Ihren eigenen Contracts dienen. + +## Was ist eine Signatur? + +In diesem Kontext ist eine Signatur (genauer gesagt, eine „digitale Signatur“) eine Nachricht plus eine Art Beweis dafür, dass die Nachricht von einer bestimmten Person/einem bestimmten Absender/einer bestimmten Adresse stammt. + +Eine digitale Signatur könnte zum Beispiel so aussehen: + +1. Nachricht: „Ich möchte mich mit meiner Ethereum-Wallet auf dieser Website anmelden.“ +2. Unterzeichner: Meine Adresse lautet `0x000…` +3. Beweis: Hier ist ein Beweis dafür, dass ich, `0x000…`, diese gesamte Nachricht tatsächlich erstellt habe (dies ist normalerweise etwas Kryptografisches). + +Es ist wichtig zu beachten, dass eine digitale Signatur sowohl eine „Nachricht“ als auch eine „Signatur“ enthält. + +Warum? Wenn Sie mir zum Beispiel einen Vertrag zum Unterschreiben geben würden und ich dann die Unterschriftenseite abschneiden und Ihnen nur meine Unterschriften ohne den Rest des Vertrags zurückgeben würde, wäre der Vertrag nicht gültig. + +Genauso bedeutet eine digitale Signatur ohne eine zugehörige Nachricht nichts! + +## Warum gibt es EIP-1271? + +Um eine digitale Signatur für die Verwendung auf Ethereum-basierten Blockchains zu erstellen, benötigen Sie im Allgemeinen einen geheimen privaten Schlüssel, den niemand sonst kennt. Das ist es, was Ihre Signatur zu Ihrer macht (niemand sonst kann dieselbe Signatur ohne Kenntnis des geheimen Schlüssels erstellen). + +Ihr Ethereum-Konto (d.h. Ihr extern verwaltetes Konto/EOA) hat einen damit verbundenen privaten Schlüssel, und das ist der private Schlüssel, der normalerweise verwendet wird, wenn eine Website oder eine Dapp Sie um eine Signatur bittet (z. B. für „Mit Ethereum anmelden“). + +Eine App kann eine von Ihnen erstellte [Signatur verifizieren](https://www.alchemy.com/docs/how-to-verify-a-message-signature-on-ethereum) und dabei eine Drittanbieter-Bibliothek wie ethers.js verwenden, [ohne Ihren privaten Schlüssel zu kennen](https://en.wikipedia.org/wiki/Public-key_cryptography), und darauf vertrauen, dass _Sie_ derjenige waren, der die Signatur erstellt hat. + +> Tatsächlich können digitale EOA-Signaturen, da sie Public-Key-Kryptografie verwenden, **off-chain** generiert und verifiziert werden! So funktioniert die gaslose DAO-Abstimmung — anstatt die Stimmen on-chain abzugeben, können digitale Signaturen mithilfe kryptografischer Bibliotheken off-chain erstellt und verifiziert werden. + +Während EOA-Konten einen privaten Schlüssel haben, haben Smart-Contract-Konten keinerlei privaten oder geheimen Schlüssel (daher kann „Mit Ethereum anmelden“ usw. nicht nativ mit Smart-Contract-Konten funktionieren). + +Das Problem, das EIP-1271 zu lösen versucht: Wie können wir feststellen, ob eine Smart-Contract-Signatur gültig ist, wenn der Smart Contract kein „Geheimnis“ hat, das er in die Signatur einbauen kann? + +## Wie funktioniert EIP-1271? + +Smart Contracts haben keine privaten Schlüssel, die zum Signieren von Nachrichten verwendet werden können. Wie können wir also feststellen, ob eine Signatur authentisch ist? + +Nun, eine Idee ist, dass wir den Smart Contract einfach _fragen_ können, ob eine Signatur authentisch ist! + +EIP-1271 standardisiert die Idee, einen Smart Contract zu „fragen“, ob eine bestimmte Signatur gültig ist. + +Ein Contract, der EIP-1271 implementiert, muss eine Funktion namens `isValidSignature` haben, die eine Nachricht und eine Signatur entgegennimmt. Der Contract kann dann eine Validierungslogik ausführen (die Spezifikation schreibt hier nichts Bestimmtes vor) und dann einen Wert zurückgeben, der angibt, ob die Signatur gültig ist oder nicht. + +Wenn `isValidSignature` ein gültiges Ergebnis zurückgibt, bedeutet das so viel wie, dass der Contract sagt: „Ja, ich genehmige diese Signatur + Nachricht!“ + +### Schnittstelle + +Hier ist die genaue Schnittstelle in der EIP-1271-Spezifikation (wir werden weiter unten auf den `_hash`-Parameter eingehen, aber stellen Sie ihn sich vorerst als die zu verifizierende Nachricht vor): + +```jsx +pragma solidity ^0.5.0; + +contract ERC1271 { + + // bytes4(keccak256("isValidSignature(bytes32,bytes)") + bytes4 constant internal MAGICVALUE = 0x1626ba7e; + + /** + * @dev Sollte zurückgeben, ob die bereitgestellte Signatur für den bereitgestellten Hash gültig ist + * @param _hash Hash der zu signierenden Daten + * @param _signature Signatur-Byte-Array, das mit _hash verknüpft ist + * + * MUSS den magischen Wert bytes4 0x1626ba7e zurückgeben, wenn die Funktion erfolgreich ist. + * DARF den Zustand NICHT ändern (Verwendung von STATICCALL für solc < 0.5, view-Modifikator für solc > 0.5) + * MUSS externe Aufrufe zulassen + */ + function isValidSignature( + bytes32 _hash, + bytes memory _signature) + public + view + returns (bytes4 magicValue); +} +``` + +## Beispiel für eine EIP-1271-Implementierung: Safe + +Contracts können `isValidSignature` auf viele Arten implementieren — die Spezifikation sagt nicht viel über die genaue Implementierung aus. + +Ein bemerkenswerter Contract, der EIP-1271 implementiert, ist Safe (ehemals Gnosis Safe). + +Im Code von Safe ist `isValidSignature` [so implementiert](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol), dass Signaturen auf [zwei Arten](https://ethereum.stackexchange.com/questions/122635/signing-messages-as-a-gnosis-safe-eip1271-support) erstellt und verifiziert werden können: + +1. On-Chain-Nachrichten + 1. Erstellung: Ein Safe-Besitzer erstellt eine neue Safe-Transaktion, um eine Nachricht zu „signieren“, und übergibt die Nachricht als Daten in die Transaktion. Sobald genügend Besitzer die Transaktion unterzeichnet haben, um den Multisig-Schwellenwert zu erreichen, wird die Transaktion gesendet und ausgeführt. In der Transaktion gibt es eine Safe-Funktion namens (`signMessage(bytes calldata _data)`), die die Nachricht zu einer Liste „genehmigter“ Nachrichten hinzufügt. + 2. Verifizierung: Rufen Sie `isValidSignature` auf dem Safe-Contract auf und übergeben Sie die zu verifizierende Nachricht als Nachrichtenparameter und [einen leeren Wert für den Signaturparameter](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol#L32) (d. h. `0x`). Der Safe wird sehen, dass der Signaturparameter leer ist, und anstatt die Signatur kryptografisch zu verifizieren, wird er einfach prüfen, ob sich die Nachricht auf der Liste der „genehmigten“ Nachrichten befindet. +2. Off-Chain-Nachrichten: + 1. Erstellung: Ein Safe-Besitzer erstellt eine Nachricht off-chain und lässt dann andere Safe-Besitzer die Nachricht einzeln signieren, bis genügend Signaturen vorhanden sind, um den Multisig-Genehmigungsschwellenwert zu erreichen. + 2. Verifizierung: `isValidSignature` aufrufen. Übergeben Sie im Nachrichtenparameter die zu verifizierende Nachricht. Übergeben Sie im Signaturparameter die einzelnen Signaturen jedes Safe-Besitzers aneinandergereiht. Der Safe prüft, ob genügend Signaturen vorhanden sind, um den Schwellenwert zu erreichen, **und** ob jede Signatur gültig ist. Wenn ja, gibt er einen Wert zurück, der eine erfolgreiche Signaturverifizierung anzeigt. + +## Was genau ist der `_hash`-Parameter? Warum nicht die ganze Nachricht übergeben? + +Sie haben vielleicht bemerkt, dass die Funktion `isValidSignature` in der [EIP-1271-Schnittstelle](https://eips.ethereum.org/EIPS/eip-1271) nicht die Nachricht selbst, sondern einen `_hash`-Parameter entgegennimmt. Das bedeutet, dass wir anstelle der vollständigen Nachricht beliebiger Länge an `isValidSignature` einen 32-Byte-Hash der Nachricht (im Allgemeinen keccak256) übergeben. + +Jedes Byte Calldata — d. h. Funktionsparameterdaten, die an eine Smart-Contract-Funktion übergeben werden — [kostet 16 Gas (4 Gas bei einem Null-Byte)](https://eips.ethereum.org/EIPS/eip-2028), sodass viel Gas gespart werden kann, wenn eine Nachricht lang ist. + +### Frühere EIP-1271-Spezifikationen + +Es gibt EIP-1271-Spezifikationen, die eine `isValidSignature`-Funktion mit einem ersten Parameter vom Typ `bytes` (beliebige Länge anstelle einer festen Länge von `bytes32`) und dem Parameternamen `message` haben. Dies ist eine [ältere Version](https://github.com/safe-global/safe-contracts/issues/391#issuecomment-1075427206) des EIP-1271-Standards. + +## Wie sollte EIP-1271 in meinen eigenen Contracts implementiert werden? + +Die Spezifikation ist hier sehr offen. Die Safe-Implementierung hat einige gute Ideen: + +- Sie können EOA-Signaturen vom „Besitzer“ des Contracts als gültig betrachten. +- Sie könnten eine Liste genehmigter Nachrichten speichern und nur diese als gültig betrachten. + +Letztendlich liegt es an Ihnen als Contract-Entwickler! + +## Zusammenfassung + +[EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) ist ein vielseitiger Standard, der es Smart Contracts ermöglicht, Signaturen zu verifizieren. Es öffnet Smart Contracts die Tür, sich mehr wie EOAs zu verhalten – indem es beispielsweise eine Möglichkeit bietet, dass „Mit Ethereum anmelden“ mit Smart Contracts funktioniert – und es kann auf viele Arten implementiert werden (Safe bietet eine nichttriviale und interessante Implementierung, die man in Betracht ziehen sollte). diff --git a/public/content/translations/de/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/de/developers/tutorials/erc-721-vyper-annotated-code/index.md new file mode 100644 index 00000000000..d5b05da914f --- /dev/null +++ b/public/content/translations/de/developers/tutorials/erc-721-vyper-annotated-code/index.md @@ -0,0 +1,715 @@ +--- +title: "Vyper ERC-721 Vertrags-Komplettlösung" +description: Ryuya Nakamuras ERC-721-Vertrag und wie er funktioniert +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +lang: de +tags: [ "vyper", "erc-721", "Python" ] +skill: beginner +published: 2021-04-01 +--- + +## Einführung {#introduction} + +Der [ERC-721](/developers/docs/standards/tokens/erc-721/)-Standard wird verwendet, um das Eigentum an nicht-fungiblen Token (NFT) zu halten. +[ERC-20](/developers/docs/standards/tokens/erc-20/)-Token verhalten sich wie ein Rohstoff, da es keinen Unterschied zwischen den einzelnen Token gibt. +Im Gegensatz dazu sind ERC-721-Token für Vermögenswerte konzipiert, die ähnlich, aber nicht identisch sind, wie zum Beispiel verschiedene Katzen- +Cartoons +oder Titel für verschiedene Immobilien. + +In diesem Artikel analysieren wir [Ryuya Nakamuras ERC-721-Vertrag](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy). +Dieser Vertrag ist in [Vyper](https://vyper.readthedocs.io/en/latest/index.html) geschrieben, einer Python-ähnlichen Vertragssprache, die so konzipiert ist, dass es +schwieriger ist, unsicheren Code zu schreiben, als in Solidity. + +## Der Vertrag {#contract} + +```python +# @dev Implementierung des ERC-721-Standards für nicht-fungible Token. +# @author Ryuya Nakamura (@nrryuya) +# Modifiziert von: https://github.com/vyperlang/vyper/blob/de74722bf2d8718cca46902be165f9fe0e3641dd/examples/tokens/ERC721.vy +``` + +Kommentare in Vyper beginnen, wie in Python, mit einem Hash (`#`) und gehen bis zum Ende der Zeile. Kommentare, die +`@` enthalten, werden von [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) verwendet, um für Menschen lesbare +Dokumentationen zu erstellen. + +```python +from vyper.interfaces import ERC721 + +implements: ERC721 +``` + +Die ERC-721-Schnittstelle ist in die Vyper-Sprache integriert. +[Die Code-Definition können Sie hier einsehen](https://github.com/vyperlang/vyper/blob/master/vyper/builtin_interfaces/ERC721.py). +Die Schnittstellendefinition ist in Python und nicht in Vyper geschrieben, da Schnittstellen nicht nur innerhalb der +Blockchain verwendet werden, sondern auch beim Senden einer Transaktion von einem externen Client an die Blockchain, der in +Python geschrieben sein kann. + +Die erste Zeile importiert die Schnittstelle und die zweite gibt an, dass wir sie hier implementieren. + +### Die ERC721Receiver-Schnittstelle {#receiver-interface} + +```python +# Schnittstelle für den von safeTransferFrom() aufgerufenen Vertrag +interface ERC721Receiver: + def onERC721Received( +``` + +ERC-721 unterstützt zwei Arten von Übertragungen: + +- `transferFrom`, bei dem der Absender eine beliebige Zieladresse angeben kann und die Verantwortung + für die Übertragung beim Absender liegt. Das bedeutet, dass Sie an eine ungültige Adresse übertragen können. In diesem Fall + ist der NFT für immer verloren. +- `safeTransferFrom`, das prüft, ob die Zieladresse ein Vertrag ist. Wenn ja, fragt der ERC-721-Vertrag + den empfangenden Vertrag, ob er den NFT empfangen möchte. + +Um `safeTransferFrom`-Anfragen zu beantworten, muss ein empfangender Vertrag `ERC721Receiver` implementieren. + +```python + _operator: address, + _from: address, +``` + +Die `_from`-Adresse ist der aktuelle Eigentümer des Tokens. Die `_operator`-Adresse ist diejenige, die +die Übertragung angefordert hat (diese beiden können aufgrund von Freigaben unterschiedlich sein). + +```python + _tokenId: uint256, +``` + +ERC-721-Token-IDs sind 256 Bit lang. Typischerweise werden sie durch Hashing einer Beschreibung von dem erstellt, was +der Token darstellt. + +```python + _data: Bytes[1024] +``` + +Die Anfrage kann bis zu 1024 Bytes an Benutzerdaten enthalten. + +```python + ) -> bytes32: view +``` + +Um zu verhindern, dass ein Vertrag versehentlich eine Übertragung akzeptiert, ist der Rückgabewert kein boolescher Wert, +sondern 256 Bit mit einem bestimmten Wert. + +Diese Funktion ist eine `view`, was bedeutet, dass sie den Zustand der Blockchain lesen, aber nicht verändern kann. + +### Ereignisse {#events} + +[Ereignisse](https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e) +werden ausgelöst, um Benutzer und Server außerhalb der Blockchain über Ereignisse zu informieren. Beachten Sie, dass der Inhalt von Ereignissen +für Verträge auf der Blockchain nicht verfügbar ist. + +```python +# @dev Wird ausgelöst, wenn sich der Besitz eines NFTs durch einen beliebigen Mechanismus ändert. Dieses Ereignis wird ausgelöst, wenn NFTs +# erstellt (`from` == 0) und zerstört (`to` == 0) werden. Ausnahme: während der Vertragserstellung kann eine beliebige +# Anzahl von NFTs erstellt und zugewiesen werden, ohne dass ein Transfer ausgelöst wird. Zum Zeitpunkt einer +# Übertragung wird die genehmigte Adresse für diesen NFT (falls vorhanden) auf keine zurückgesetzt. +# @param _from Absender des NFT (wenn die Adresse eine Null-Adresse ist, bedeutet das die Erstellung eines Tokens). +# @param _to Empfänger des NFT (wenn die Adresse eine Null-Adresse ist, bedeutet das die Zerstörung des Tokens). +# @param _tokenId Der NFT, der übertragen wurde. +event Transfer: + sender: indexed(address) + receiver: indexed(address) + tokenId: indexed(uint256) +``` + +Dies ist ähnlich wie beim ERC-20-Transfer-Ereignis, außer dass wir eine `tokenId` anstelle eines Betrags melden. +Niemand besitzt die Adresse Null, daher verwenden wir sie konventionsgemäß, um die Erstellung und Zerstörung von Token zu melden. + +```python +# @dev Dies wird ausgelöst, wenn die genehmigte Adresse für einen NFT geändert oder erneut bestätigt wird. Die Null- +# Adresse zeigt an, dass es keine genehmigte Adresse gibt. Wenn ein Transfer-Ereignis ausgelöst wird, zeigt dies auch an +# , dass die genehmigte Adresse für diesen NFT (falls vorhanden) auf keine zurückgesetzt wird. +# @param _owner Eigentümer des NFT. +# @param _approved Adresse, die wir genehmigen. +# @param _tokenId NFT, den wir genehmigen. +event Approval: + owner: indexed(address) + approved: indexed(address) + tokenId: indexed(uint256) +``` + +Eine ERC-721-Genehmigung ist ähnlich wie eine ERC-20-Freigabe. Eine bestimmte Adresse darf einen bestimmten +Token übertragen. Dies gibt Verträgen einen Mechanismus, um zu reagieren, wenn sie einen Token annehmen. Verträge können nicht +auf Ereignisse lauschen, wenn Sie also nur den Token an sie übertragen, „wissen“ sie nichts davon. Auf diese Weise reicht der +Eigentümer zunächst eine Genehmigung ein und sendet dann eine Anfrage an den Vertrag: „Ich habe Ihnen die Genehmigung erteilt, den Token +X zu übertragen, bitte tun Sie ...“. + +Dies ist eine Designentscheidung, um den ERC-721-Standard dem ERC-20-Standard ähnlich zu machen. Da +ERC-721-Token nicht fungibel sind, kann ein Vertrag auch erkennen, dass er einen bestimmten Token erhalten hat, indem er sich den Besitz des Tokens +ansieht. + +```python +# @dev Dies wird ausgelöst, wenn ein Betreiber für einen Eigentümer aktiviert oder deaktiviert wird. Der Betreiber kann alle NFTs des Eigentümers verwalten. +# +# @param _owner Eigentümer des NFT. +# @param _operator Adresse, für die wir Betreiberrechte festlegen. +# @param _approved Status der Betreiberrechte (true, wenn Betreiberrechte erteilt werden, und false, wenn sie +# widerrufen werden). +event ApprovalForAll: + owner: indexed(address) + operator: indexed(address) + approved: bool +``` + +Manchmal ist es nützlich, einen _Betreiber_ zu haben, der alle Token eines Kontos von einem bestimmten Typ verwalten kann (diejenigen, die von +einem bestimmten Vertrag verwaltet werden), ähnlich wie eine Vollmacht. Zum Beispiel könnte ich einem Vertrag eine solche Vollmacht erteilen, der prüft, ob +ich ihn sechs Monate lang nicht kontaktiert habe, und wenn ja, mein Vermögen an meine Erben verteilt (wenn einer von ihnen danach fragt, können Verträge +nichts tun, ohne durch eine Transaktion aufgerufen zu werden). Bei ERC-20 können wir einem Erbvertrag einfach eine hohe Freigabe erteilen, +aber das funktioniert bei ERC-721 nicht, da die Token nicht fungibel sind. Dies ist das Äquivalent. + +Der `approved`-Wert teilt uns mit, ob das Ereignis eine Genehmigung oder den Widerruf einer Genehmigung betrifft. + +### Zustandsvariablen {#state-vars} + +Diese Variablen enthalten den aktuellen Zustand der Token: welche verfügbar sind und wem sie gehören. Die meisten davon +sind `HashMap`-Objekte, [unidirektionale Zuordnungen, die zwischen zwei Typen bestehen](https://vyper.readthedocs.io/en/latest/types.html#mappings). + +```python +# @dev Zuordnung von der NFT-ID zur Adresse, der sie gehört. +idToOwner: HashMap[uint256, address] + +# @dev Zuordnung von der NFT-ID zur genehmigten Adresse. +idToApprovals: HashMap[uint256, address] +``` + +Benutzer- und Vertragsidentitäten in Ethereum werden durch 160-Bit-Adressen dargestellt. Diese beiden Variablen bilden +Token-IDs auf ihre Eigentümer und diejenigen ab, die für ihre Übertragung genehmigt sind (maximal einer für jeden). In Ethereum +sind nicht initialisierte Daten immer null. Wenn es also keinen Eigentümer oder genehmigten Überträger gibt, ist der Wert für diesen Token +null. + +```python +# @dev Zuordnung von der Eigentümeradresse zur Anzahl seiner Token. +ownerToNFTokenCount: HashMap[address, uint256] +``` + +Diese Variable enthält die Anzahl der Token für jeden Eigentümer. Es gibt keine Zuordnung von Eigentümern zu Token, daher +ist der einzige Weg, die Token zu identifizieren, die einem bestimmten Eigentümer gehören, der Blick zurück in die Ereignishistorie der Blockchain, +um die entsprechenden `Transfer`-Ereignisse zu sehen. Wir können diese Variable verwenden, um zu wissen, wann wir alle NFTs haben und nicht +noch weiter in die Vergangenheit blicken müssen. + +Beachten Sie, dass dieser Algorithmus nur für Benutzeroberflächen und externe Server funktioniert. Code, der auf der Blockchain +selbst läuft, kann vergangene Ereignisse nicht lesen. + +```python +# @dev Zuordnung von der Eigentümeradresse zur Zuordnung von Betreiberadressen. +ownerToOperators: HashMap[address, HashMap[address, bool]] +``` + +Ein Konto kann mehr als einen Betreiber haben. Eine einfache `HashMap` reicht nicht aus, um +sie zu verfolgen, da jeder Schlüssel zu einem einzigen Wert führt. Stattdessen können Sie +`HashMap[address, bool]` als Wert verwenden. Standardmäßig ist der Wert für jede Adresse `False`, was bedeutet, dass sie +kein Betreiber ist. Sie können die Werte bei Bedarf auf `True` setzen. + +```python +# @dev Adresse des Minters, der einen Token prägen kann +minter: address +``` + +Neue Token müssen irgendwie erstellt werden. In diesem Vertrag gibt es eine einzige Entität, die dazu berechtigt ist, der +`minter`. Dies ist zum Beispiel für ein Spiel wahrscheinlich ausreichend. Für andere Zwecke könnte es notwendig sein, +eine kompliziertere Geschäftslogik zu erstellen. + +```python +# @dev Zuordnung der Schnittstellen-ID zu bool, ob sie unterstützt wird oder nicht +supportedInterfaces: HashMap[bytes32, bool] + +# @dev ERC165-Schnittstellen-ID von ERC165 +ERC165_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000001ffc9a7 + +# @dev ERC165-Schnittstellen-ID von ERC721 +ERC721_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000080ac58cd +``` + +[ERC-165](https://eips.ethereum.org/EIPS/eip-165) spezifiziert einen Mechanismus für einen Vertrag, um offenzulegen, wie Anwendungen +mit ihm kommunizieren können und welchen ERCs er entspricht. In diesem Fall entspricht der Vertrag ERC-165 und ERC-721. + +### Funktionen {#functions} + +Dies sind die Funktionen, die ERC-721 tatsächlich implementieren. + +#### Konstruktor {#constructor} + +```python +@external +def __init__(): +``` + +In Vyper, wie in Python, heißt die Konstruktorfunktion `__init__`. + +```python + """ + @dev Vertragskonstruktor. + """ +``` + +In Python und in Vyper können Sie auch einen Kommentar erstellen, indem Sie eine mehrzeilige Zeichenfolge (die mit `"""` beginnt und endet +) angeben und sie in keiner Weise verwenden. Diese Kommentare können auch +[NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) enthalten. + +```python + self.supportedInterfaces[ERC165_INTERFACE_ID] = True + self.supportedInterfaces[ERC721_INTERFACE_ID] = True + self.minter = msg.sender +``` + +Um auf Zustandsvariablen zuzugreifen, verwenden Sie \`self.\`\` (wiederum, wie in Python). + +#### View-Funktionen {#views} + +Dies sind Funktionen, die den Zustand der Blockchain nicht verändern und daher +kostenlos ausgeführt werden können, wenn sie extern aufgerufen werden. Wenn die View-Funktionen von einem Vertrag aufgerufen werden, müssen sie dennoch auf +jedem Node ausgeführt werden und kosten daher Gas. + +```python +@view +@external +``` + +Diese Schlüsselwörter vor einer Funktionsdefinition, die mit einem At-Zeichen (`@`) beginnen, werden als _Dekorationen_ bezeichnet. Sie +geben die Umstände an, unter denen eine Funktion aufgerufen werden kann. + +- `@view` gibt an, dass diese Funktion eine `view` ist. +- `@external` gibt an, dass diese spezielle Funktion durch Transaktionen und von anderen Verträgen aufgerufen werden kann. + +```python +def supportsInterface(_interfaceID: bytes32) -> bool: +``` + +Im Gegensatz zu Python ist Vyper eine [statisch typisierte Sprache](https://wikipedia.org/wiki/Type_system#Static_type_checking). +Sie können keine Variable oder einen Funktionsparameter deklarieren, ohne den [Datentyp](https://vyper.readthedocs.io/en/latest/types.html) anzugeben. In diesem Fall ist der Eingabeparameter `bytes32`, ein 256-Bit-Wert +(256 Bit ist die native Wortgröße der [Ethereum Virtual Machine](/developers/docs/evm/)). Die Ausgabe ist ein boolescher +Wert. Konventionsgemäß beginnen die Namen von Funktionsparametern mit einem Unterstrich (`_`). + +```python + """ + @dev Die Schnittstellenidentifikation ist in ERC-165 spezifiziert. + @param _interfaceID ID der Schnittstelle + """ + return self.supportedInterfaces[_interfaceID] +``` + +Gibt den Wert aus der `self.supportedInterfaces`-HashMap zurück, der im Konstruktor (`__init__`) gesetzt wird. + +```python +### VIEW-FUNKTIONEN ### +``` + +Dies sind die View-Funktionen, die Informationen über die Token für Benutzer und andere Verträge verfügbar machen. + +```python +@view +@external +def balanceOf(_owner: address) -> uint256: + """ + @dev Gibt die Anzahl der NFTs zurück, die `_owner` besitzt. + Löst einen Fehler aus, wenn `_owner` die Null-Adresse ist. NFTs, die der Null-Adresse zugewiesen sind, werden als ungültig betrachtet. + @param _owner Adresse, für die das Guthaben abgefragt werden soll. + """ + assert _owner != ZERO_ADDRESS +``` + +Diese Zeile [stellt sicher](https://vyper.readthedocs.io/en/latest/statements.html#assert), dass `_owner` nicht +Null ist. Wenn doch, gibt es einen Fehler und die Operation wird rückgängig gemacht. + +```python + return self.ownerToNFTokenCount[_owner] + +@view +@external +def ownerOf(_tokenId: uint256) -> address: + """ + @dev Gibt die Adresse des Besitzers des NFT zurück. + Löst einen Fehler aus, wenn `_tokenId` kein gültiger NFT ist. + @param _tokenId Der Bezeichner für einen NFT. + """ + owner: address = self.idToOwner[_tokenId] + # Löst einen Fehler aus, wenn `_tokenId` kein gültiger NFT ist + assert owner != ZERO_ADDRESS + return owner +``` + +In der Ethereum Virtual Machine (EVM) ist jeder Speicher, in dem kein Wert gespeichert ist, null. +Wenn es keinen Token bei `_tokenId` gibt, dann ist der Wert von `self.idToOwner[_tokenId]` null. In diesem +Fall wird die Funktion zurückgesetzt. + +```python +@view +@external +def getApproved(_tokenId: uint256) -> address: + """ + @dev Holt die genehmigte Adresse für einen einzelnen NFT. + Löst einen Fehler aus, wenn `_tokenId` kein gültiger NFT ist. + @param _tokenId ID des NFT, dessen Genehmigung abgefragt werden soll. + """ + # Löst einen Fehler aus, wenn `_tokenId` kein gültiger NFT ist + assert self.idToOwner[_tokenId] != ZERO_ADDRESS + return self.idToApprovals[_tokenId] +``` + +Beachten Sie, dass `getApproved` null zurückgeben _kann_. Wenn der Token gültig ist, gibt er `self.idToApprovals[_tokenId]` zurück. +Wenn es keinen Genehmiger gibt, ist dieser Wert null. + +```python +@view +@external +def isApprovedForAll(_owner: address, _operator: address) -> bool: + """ + @dev Prüft, ob `_operator` ein zugelassener Betreiber für `_owner` ist. + @param _owner Die Adresse, der die NFTs gehören. + @param _operator Die Adresse, die im Namen des Eigentümers handelt. + """ + return (self.ownerToOperators[_owner])[_operator] +``` + +Diese Funktion prüft, ob `_operator` berechtigt ist, alle Token von `_owner` in diesem Vertrag zu verwalten. +Da es mehrere Operatoren geben kann, ist dies eine zweistufige HashMap. + +#### Transfer-Hilfsfunktionen {#transfer-helpers} + +Diese Funktionen implementieren Operationen, die Teil der Übertragung oder Verwaltung von Token sind. + +```python + +### HILFSFUNKTIONEN FÜR DIE ÜBERTRAGUNG ### + +@view +@internal +``` + +Diese Dekoration, `@internal`, bedeutet, dass die Funktion nur von anderen Funktionen innerhalb desselben +Vertrags aus zugänglich ist. Konventionsgemäß beginnen diese Funktionsnamen ebenfalls mit einem Unterstrich (`_`). + +```python +def _isApprovedOrOwner(_spender: address, _tokenId: uint256) -> bool: + """ + @dev Gibt zurück, ob der angegebene Spender eine gegebene Token-ID übertragen kann + @param spender Adresse des abzufragenden Spenders + @param tokenId uint256 ID des zu übertragenden Tokens + @return bool, ob der msg.sender für die angegebene Token-ID genehmigt ist, + ein Betreiber des Eigentümers oder der Eigentümer des Tokens ist + """ + owner: address = self.idToOwner[_tokenId] + spenderIsOwner: bool = owner == _spender + spenderIsApproved: bool = _spender == self.idToApprovals[_tokenId] + spenderIsApprovedForAll: bool = (self.ownerToOperators[owner])[_spender] + return (spenderIsOwner or spenderIsApproved) or spenderIsApprovedForAll +``` + +Es gibt drei Möglichkeiten, wie eine Adresse zur Übertragung eines Tokens berechtigt sein kann: + +1. Die Adresse ist der Eigentümer des Tokens +2. Die Adresse ist für die Ausgabe dieses Tokens zugelassen +3. Die Adresse ist ein Operator für den Eigentümer des Tokens + +Die obige Funktion kann eine `view` sein, da sie den Zustand nicht ändert. Um die Betriebskosten zu senken, sollte jede +Funktion, die eine `view` sein _kann_, auch eine `view` _sein_. + +```python +@internal +def _addTokenTo(_to: address, _tokenId: uint256): + """ + @dev Einen NFT zu einer bestimmten Adresse hinzufügen + Löst einen Fehler aus, wenn `_tokenId` jemandem gehört. + """ + # Löst einen Fehler aus, wenn `_tokenId` jemandem gehört + assert self.idToOwner[_tokenId] == ZERO_ADDRESS + # Den Besitzer wechseln + self.idToOwner[_tokenId] = _to + # Zählverfolgung ändern + self.ownerToNFTokenCount[_to] += 1 + + +@internal +def _removeTokenFrom(_from: address, _tokenId: uint256): + """ + @dev Entfernen eines NFT von einer bestimmten Adresse + Löst einen Fehler aus, wenn `_from` nicht der aktuelle Besitzer ist. + """ + # Löst einen Fehler aus, wenn `_from` nicht der aktuelle Besitzer ist + assert self.idToOwner[_tokenId] == _from + # Den Besitzer wechseln + self.idToOwner[_tokenId] = ZERO_ADDRESS + # Zählverfolgung ändern + self.ownerToNFTokenCount[_from] -= 1 +``` + +Wenn es ein Problem mit einer Übertragung gibt, machen wir den Aufruf rückgängig. + +```python +@internal +def _clearApproval(_owner: address, _tokenId: uint256): + """ + @dev Löschen einer Genehmigung für eine bestimmte Adresse + Löst einen Fehler aus, wenn `_owner` nicht der aktuelle Besitzer ist. + """ + # Löst einen Fehler aus, wenn `_owner` nicht der aktuelle Besitzer ist + assert self.idToOwner[_tokenId] == _owner + if self.idToApprovals[_tokenId] != ZERO_ADDRESS: + # Genehmigungen zurücksetzen + self.idToApprovals[_tokenId] = ZERO_ADDRESS +``` + +Ändern Sie den Wert nur, wenn es nötig ist. Zustandsvariablen leben im Speicher. Das Schreiben in den Speicher ist +eine der teuersten Operationen, die die EVM (Ethereum Virtual Machine) durchführt (in Bezug auf +[Gas](/developers/docs/gas/)). Daher ist es eine gute Idee, dies zu minimieren, denn selbst das Schreiben des +vorhandenen Wertes hat hohe Kosten. + +```python +@internal +def _transferFrom(_from: address, _to: address, _tokenId: uint256, _sender: address): + """ + @dev Führt die Übertragung eines NFT aus. + Löst eine Ausnahme aus, es sei denn, `msg.sender` ist der aktuelle Eigentümer, ein autorisierter Betreiber oder die genehmigte + Adresse für diesen NFT. (HINWEIS: `msg.sender` ist in einer privaten Funktion nicht erlaubt, also `_sender` übergeben.) + Löst eine Ausnahme aus, wenn `_to` die Null-Adresse ist. + Löst eine Ausnahme aus, wenn `_from` nicht der aktuelle Eigentümer ist. + Löst eine Ausnahme aus, wenn `_tokenId` kein gültiger NFT ist. + """ +``` + +Wir haben diese interne Funktion, weil es zwei Möglichkeiten gibt, Token zu übertragen (regulär und sicher), aber +wir wollen nur eine einzige Stelle im Code, an der wir dies tun, um die Prüfung zu erleichtern. + +```python + # Anforderungen prüfen + assert self._isApprovedOrOwner(_sender, _tokenId) + # Löst einen Fehler aus, wenn `_to` die Null-Adresse ist + assert _to != ZERO_ADDRESS + # Genehmigung löschen. Löst einen Fehler aus, wenn `_from` nicht der aktuelle Besitzer ist + self._clearApproval(_from, _tokenId) + # NFT entfernen. Löst einen Fehler aus, wenn `_tokenId` kein gültiger NFT ist + self._removeTokenFrom(_from, _tokenId) + # NFT hinzufügen + self._addTokenTo(_to, _tokenId) + # Die Übertragung protokollieren + log Transfer(_from, _to, _tokenId) +``` + +Um ein Ereignis in Vyper auszulösen, verwenden Sie eine `log`-Anweisung ([siehe hier für weitere Details](https://vyper.readthedocs.io/en/latest/event-logging.html#event-logging)). + +#### Transfer-Funktionen {#transfer-funs} + +```python + +### TRANSFER-FUNKTIONEN ### + +@external +def transferFrom(_from: address, _to: address, _tokenId: uint256): + """ + @dev Löst einen Fehler aus, es sei denn `msg.sender` ist der aktuelle Eigentümer, ein autorisierter Betreiber oder die genehmigte + Adresse für diesen NFT. + Löst einen Fehler aus, wenn `_from` nicht der aktuelle Eigentümer ist. + Löst einen Fehler aus, wenn `_to` die Null-Adresse ist. + Löst einen Fehler aus, wenn `_tokenId` kein gültiger NFT ist. + @notice Der Aufrufer ist dafür verantwortlich zu bestätigen, dass `_to` in der Lage ist, NFTs zu empfangen, andernfalls + können sie dauerhaft verloren gehen. + @param _from Der aktuelle Eigentümer des NFT. + @param _to Der neue Eigentümer. + @param _tokenId Der zu übertragende NFT. + """ + self._transferFrom(_from, _to, _tokenId, msg.sender) +``` + +Mit dieser Funktion können Sie an eine beliebige Adresse übertragen. Sofern die Adresse nicht einem Benutzer oder einem Vertrag gehört, der +weiß, wie man Token überträgt, wird jeder Token, den Sie übertragen, an dieser Adresse hängen bleiben und unbrauchbar sein. + +```python +@external +def safeTransferFrom( + _from: address, + _to: address, + _tokenId: uint256, + _data: Bytes[1024]=b"" + ): + """ + @dev Überträgt das Eigentum an einem NFT von einer Adresse an eine andere. + Löst eine Ausnahme aus, es sei denn `msg.sender` ist der aktuelle Eigentümer, ein autorisierter Betreiber oder die + genehmigte Adresse für diesen NFT. + Löst eine Ausnahme aus, wenn `_from` nicht der aktuelle Eigentümer ist. + Löst eine Ausnahme aus, wenn `_to` die Null-Adresse ist. + Löst eine Ausnahme aus, wenn `_tokenId` kein gültiger NFT ist. + Wenn `_to` ein Smart Contract ist, ruft es `onERC721Received` auf `_to` auf und löst einen Fehler aus, wenn + der Rückgabewert nicht `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` ist. + HINWEIS: bytes4 wird durch bytes32 mit Padding dargestellt + @param _from Der aktuelle Eigentümer des NFT. + @param _to Der neue Eigentümer. + @param _tokenId Der zu übertragende NFT. + @param _data Zusätzliche Daten ohne spezifiziertes Format, die im Aufruf an `_to` gesendet werden. + """ + self._transferFrom(_from, _to, _tokenId, msg.sender) +``` + +Es ist in Ordnung, die Übertragung zuerst durchzuführen, denn wenn es ein Problem gibt, werden wir es sowieso rückgängig machen, +so dass alles, was in dem Aufruf getan wird, abgebrochen wird. + +```python + if _to.is_contract: # prüfen, ob `_to` eine Vertragsadresse ist +``` + +Prüfen Sie zunächst, ob die Adresse ein Vertrag ist (ob sie Code enthält). Wenn nicht, gehen Sie davon aus, dass es sich um eine Benutzeradresse +handelt und der Benutzer den Token verwenden oder übertragen kann. Aber lassen Sie sich nicht +in falscher Sicherheit wiegen. Sie können Token auch mit `safeTransferFrom` verlieren, wenn Sie sie +an eine Adresse übertragen, für die niemand den privaten Schlüssel kennt. + +```python + returnValue: bytes32 = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) +``` + +Rufen Sie den Zielvertrag auf, um zu sehen, ob er ERC-721-Token empfangen kann. + +```python + # Löst einen Fehler aus, wenn das Übertragungsziel ein Vertrag ist, der 'onERC721Received' nicht implementiert + assert returnValue == method_id("onERC721Received(address,address,uint256,bytes)", output_type=bytes32) +``` + +Wenn das Ziel ein Vertrag ist, der aber keine ERC-721-Token akzeptiert (oder der sich entschieden hat, diese +besondere Übertragung nicht zu akzeptieren), wird die Aktion rückgängig gemacht. + +```python +@external +def approve(_approved: address, _tokenId: uint256): + """ + @dev Legt die genehmigte Adresse für einen NFT fest oder bestätigt sie erneut. Die Null-Adresse gibt an, dass es keine genehmigte Adresse gibt. + Löst einen Fehler aus, es sei denn `msg.sender` ist der aktuelle NFT-Eigentümer oder ein autorisierter Betreiber des aktuellen Eigentümers. + Löst einen Fehler aus, wenn `_tokenId` kein gültiger NFT ist. (HINWEIS: Dies ist nicht im EIP geschrieben) + Löst einen Fehler aus, wenn `_approved` der aktuelle Eigentümer ist. (HINWEIS: Dies ist nicht im EIP geschrieben) + @param _approved Adresse, die für die angegebene NFT-ID genehmigt werden soll. + @param _tokenId ID des zu genehmigenden Tokens. + """ + owner: address = self.idToOwner[_tokenId] + # Löst einen Fehler aus, wenn `_tokenId` kein gültiger NFT ist + assert owner != ZERO_ADDRESS + # Löst einen Fehler aus, wenn `_approved` der aktuelle Eigentümer ist + assert _approved != owner +``` + +Wenn Sie konventionsgemäß keinen Genehmiger haben wollen, ernennen Sie die Null-Adresse, nicht sich selbst. + +```python + # Anforderungen prüfen + senderIsOwner: bool = self.idToOwner[_tokenId] == msg.sender + senderIsApprovedForAll: bool = (self.ownerToOperators[owner])[msg.sender] + assert (senderIsOwner or senderIsApprovedForAll) +``` + +Um eine Genehmigung zu erteilen, können Sie entweder der Eigentümer sein oder ein vom Eigentümer autorisierter Betreiber. + +```python + # Die Genehmigung festlegen + self.idToApprovals[_tokenId] = _approved + log Approval(owner, _approved, _tokenId) + + +@external +def setApprovalForAll(_operator: address, _approved: bool): + """ + @dev Aktiviert oder deaktiviert die Genehmigung für einen Dritten ("Betreiber"), alle + Vermögenswerte von `msg.sender` zu verwalten. Es löst auch das ApprovalForAll-Ereignis aus. + Löst einen Fehler aus, wenn `_operator` der `msg.sender` ist. (HINWEIS: Dies ist nicht im EIP geschrieben) + @notice Dies funktioniert auch, wenn der Absender zu diesem Zeitpunkt keine Token besitzt. + @param _operator Adresse, die zum Satz der autorisierten Betreiber hinzugefügt werden soll. + @param _approved True, wenn die Betreiber genehmigt sind, false, um die Genehmigung zu widerrufen. + """ + # Löst einen Fehler aus, wenn `_operator` der `msg.sender` ist + assert _operator != msg.sender + self.ownerToOperators[msg.sender][_operator] = _approved + log ApprovalForAll(msg.sender, _operator, _approved) +``` + +#### Neue Token prägen und bestehende zerstören {#mint-burn} + +Das Konto, das den Vertrag erstellt hat, ist der `minter`, der Superuser, der berechtigt ist, neue +NFTs zu prägen. Jedoch ist es ihm nicht erlaubt, bestehende Token zu verbrennen. Nur der Eigentümer oder eine vom Eigentümer +autorisierte Entität kann dies tun. + +```python +### PRÄGE- & VERBRENNUNGSFUNKTIONEN ### + +@external +def mint(_to: address, _tokenId: uint256) -> bool: +``` + +Diese Funktion gibt immer `True` zurück, denn wenn die Operation fehlschlägt, wird sie rückgängig gemacht. + +```python + """ + @dev Funktion zum Prägen von Token + Löst einen Fehler aus, wenn `msg.sender` nicht der Minter ist. + Löst einen Fehler aus, wenn `_to` die Null-Adresse ist. + Löst einen Fehler aus, wenn `_tokenId` jemandem gehört. + @param _to Die Adresse, die die geprägten Token erhalten wird. + @param _tokenId Die zu prägende Token-ID. + @return Ein boolescher Wert, der angibt, ob die Operation erfolgreich war. + """ + # Löst einen Fehler aus, wenn `msg.sender` nicht der Minter ist + assert msg.sender == self.minter +``` + +Nur der Minter (das Konto, das den ERC-721-Vertrag erstellt hat) kann neue Token prägen. Dies kann in der Zukunft ein +Problem sein, wenn wir die Identität des Minters ändern wollen. In +einem Produktionsvertrag würden Sie wahrscheinlich eine Funktion wollen, die es dem Minter erlaubt, Minter-Privilegien +an jemand anderen zu übertragen. + +```python + # Löst einen Fehler aus, wenn `_to` die Null-Adresse ist + assert _to != ZERO_ADDRESS + # NFT hinzufügen. Löst einen Fehler aus, wenn `_tokenId` jemandem gehört + self._addTokenTo(_to, _tokenId) + log Transfer(ZERO_ADDRESS, _to, _tokenId) + return True +``` + +Konventionsgemäß zählt das Prägen neuer Token als Übertragung von der Adresse Null. + +```python + +@external +def burn(_tokenId: uint256): + """ + @dev Verbrennt einen bestimmten ERC721-Token. + Löst einen Fehler aus, es sei denn `msg.sender` ist der aktuelle Eigentümer, ein autorisierter Betreiber oder die genehmigte + Adresse für diesen NFT. + Löst einen Fehler aus, wenn `_tokenId` kein gültiger NFT ist. + @param _tokenId uint256 ID des zu verbrennenden ERC721-Tokens. + """ + # Anforderungen prüfen + assert self._isApprovedOrOwner(msg.sender, _tokenId) + owner: address = self.idToOwner[_tokenId] + # Löst einen Fehler aus, wenn `_tokenId` kein gültiger NFT ist + assert owner != ZERO_ADDRESS + self._clearApproval(owner, _tokenId) + self._removeTokenFrom(owner, _tokenId) + log Transfer(owner, ZERO_ADDRESS, _tokenId) +``` + +Jeder, der berechtigt ist, einen Token zu übertragen, darf ihn auch verbrennen. Während ein Verbrennen einer Übertragung +an die Null-Adresse gleichkommt, empfängt die Null-Adresse den Token nicht tatsächlich. Dies ermöglicht es uns, +den gesamten Speicher freizugeben, der für den Token verwendet wurde, was die Gaskosten der Transaktion reduzieren kann. + +## Verwendung dieses Vertrags {#using-contract} + +Im Gegensatz zu Solidity hat Vyper keine Vererbung. Dies ist eine bewusste Designentscheidung, um den +Code klarer und damit leichter zu sichern. Um also Ihren eigenen Vyper ERC-721-Vertrag zu erstellen, nehmen Sie diesen +Vertrag und modifizieren Sie ihn, +um die gewünschte Geschäftslogik zu implementieren. + +## Fazit {#conclusion} + +Zur Wiederholung hier einige der wichtigsten Ideen in diesem Vertrag: + +- Um ERC-721-Token mit einer sicheren Übertragung zu empfangen, müssen Verträge die `ERC721Receiver`-Schnittstelle implementieren. +- Auch wenn Sie eine sichere Übertragung verwenden, können Token immer noch stecken bleiben, wenn Sie sie an eine Adresse senden, deren privater Schlüssel + unbekannt ist. +- Wenn es ein Problem mit einer Operation gibt, ist es eine gute Idee, den Aufruf `rückgängig zu machen`, anstatt nur + einen Fehlerwert zurückzugeben. +- ERC-721-Token existieren, wenn sie einen Besitzer haben. +- Es gibt drei Möglichkeiten, zur Übertragung eines NFT autorisiert zu sein. Sie können der Eigentümer sein, für einen bestimmten Token zugelassen sein + oder ein Betreiber für alle Token des Eigentümers sein. +- Vergangene Ereignisse sind nur außerhalb der Blockchain sichtbar. Code, der innerhalb der Blockchain ausgeführt wird, kann sie nicht anzeigen. + +Gehen Sie nun hin und implementieren Sie sichere Vyper-Verträge. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). + diff --git a/public/content/translations/de/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/de/developers/tutorials/erc20-annotated-code/index.md new file mode 100644 index 00000000000..ec47cfb8494 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/erc20-annotated-code/index.md @@ -0,0 +1,930 @@ +--- +title: "ERC-20-Vertrag – exemplarische Vorgehensweise" +description: Was beinhaltet der OpenZeppelin ERC-20-Vertrag und warum ist er da? +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +lang: de +tags: [ "solidity", "Erc-20" ] +skill: beginner +published: 2021-03-09 +--- + +## Einführung {#introduction} + +Eine der häufigsten Anwendungen von Ethereum ist die Schaffung eines handelbaren Tokens durch eine Gruppe, der gewissermaßen ihre eigene Währung darstellt. Diese Token folgen typischerweise einem Standard, +[ERC-20](/developers/docs/standards/tokens/erc-20/). Dieser Standard ermöglicht es, Tools wie Liquiditätspools und Wallets zu entwickeln, die mit allen ERC-20- +Token funktionieren. In diesem Artikel analysieren wir die +[OpenZeppelin Solidity ERC20-Implementierung](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) sowie die +[Interface-Definition](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol). + +Dies ist kommentierter Quellcode. Wenn Sie ERC-20 implementieren möchten, +[lesen Sie dieses Tutorial](https://docs.openzeppelin.com/contracts/2.x/erc20-supply). + +## Die Schnittstelle {#the-interface} + +Der Zweck eines Standards wie ERC-20 besteht darin, eine Vielzahl von Token-Implementierungen zu ermöglichen, die mit anderen Anwendungen wie Wallets und dezentralen Börsen interoperabel sind. Um das zu erreichen, erstellen wir eine +[Schnittstelle](https://www.geeksforgeeks.org/solidity/solidity-basics-of-interface/). Jeder Code, der den Token-Vertrag verwenden muss, kann die gleichen Definitionen in der Schnittstelle verwenden und mit allen Token-Verträgen, die ihn verwenden, kompatibel sein, unabhängig davon, ob es sich um eine Wallet wie +MetaMask, eine Dapp wie etherscan.io oder einen anderen Vertrag wie einen Liquiditätspool handelt. + +![Illustration der ERC-20-Schnittstelle](erc20_interface.png) + +Wenn Sie ein erfahrener Programmierer sind, erinnern Sie sich wahrscheinlich an ähnliche Konstrukte in [Java](https://www.w3schools.com/java/java_interface.asp) +oder sogar in [C-Header-Dateien](https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html). + +Dies ist eine Definition der [ERC-20-Schnittstelle](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) +von OpenZeppelin. Es ist eine Übersetzung des [für Menschen lesbaren Standards](https://eips.ethereum.org/EIPS/eip-20) in Solidity-Code. Natürlich definiert die +Schnittstelle selbst nicht, _wie_ etwas zu tun ist. Dies wird im nachstehenden Vertragsquelltext erläutert. + +  + +```solidity +// SPDX-License-Identifier: MIT +``` + +Solidity-Dateien sollten einen Lizenzbezeichner enthalten. [Die Liste der Lizenzen finden Sie hier](https://spdx.org/licenses/). Wenn Sie eine andere +Lizenz benötigen, erklären Sie dies einfach in den Kommentaren. + +  + +```solidity +pragma solidity >=0.6.0 <0.8.0; +``` + +Die Sprache Solidity entwickelt sich noch immer schnell weiter, und neue Versionen sind möglicherweise nicht mit altem Code kompatibel +([siehe hier](https://docs.soliditylang.org/en/v0.7.0/070-breaking-changes.html)). Daher ist es eine gute Idee, nicht nur eine Mindestversion +der Sprache anzugeben, sondern auch eine Höchstversion, die letzte, mit der Sie den Code getestet haben. + +  + +```solidity +/** + * @dev Schnittstelle des ERC20-Standards, wie im EIP definiert. + */ +``` + +Das `@dev` im Kommentar ist Teil des [NatSpec-Formats](https://docs.soliditylang.org/en/develop/natspec-format.html), das zur Erstellung von +Dokumentation aus dem Quellcode verwendet wird. + +  + +```solidity +interface IERC20 { +``` + +Konventionsgemäß beginnen Schnittstellennamen mit `I`. + +  + +```solidity + /** + * @dev Gibt die Menge der existierenden Token zurück. + */ + function totalSupply() external view returns (uint256); +``` + +Diese Funktion ist `external`, was bedeutet, dass [sie nur von außerhalb des Vertrags aufgerufen werden kann](https://docs.soliditylang.org/en/v0.7.0/cheatsheet.html#index-2). +Sie gibt den Gesamtvorrat an Token im Vertrag zurück. Dieser Wert wird mit dem in Ethereum gebräuchlichsten Typ zurückgegeben, 256 Bit ohne Vorzeichen (256 Bit ist die +native Wortgröße der EVM). Diese Funktion ist auch eine `view`, was bedeutet, dass sie den Zustand nicht ändert, so dass sie auf einem einzelnen Knoten ausgeführt werden kann, anstatt dass sie +auf jedem Knoten in der Blockchain ausgeführt werden muss. Diese Art von Funktion erzeugt keine Transaktion und kostet kein [Gas](/developers/docs/gas/). + +**Hinweis:** Theoretisch könnte es so aussehen, als ob der Ersteller eines Vertrags betrügen könnte, indem er einen geringeren Gesamtvorrat als den tatsächlichen Wert zurückgibt, wodurch jeder Token +wertvoller erscheint, als er tatsächlich ist. Diese Befürchtung ignoriert jedoch die wahre Natur der Blockchain. Alles, was auf der Blockchain geschieht, kann von +jedem Knoten verifiziert werden. Um dies zu erreichen, sind der Maschinencode und der Speicher jedes Vertrags auf jedem Knoten verfügbar. Obwohl Sie nicht verpflichtet sind, den Solidity-Code +für Ihren Vertrag zu veröffentlichen, würde Sie niemand ernst nehmen, wenn Sie nicht den Quellcode und die Version von Solidity, mit der er kompiliert wurde, veröffentlichen, damit er +mit dem von Ihnen bereitgestellten Maschinencode verifiziert werden kann. +Siehe zum Beispiel [diesen Vertrag](https://eth.blockscout.com/address/0xa530F85085C6FE2f866E7FdB716849714a89f4CD?tab=contract). + +  + +```solidity + /** + * @dev Gibt die Menge an Token zurück, die `account` besitzt. + */ + function balanceOf(address account) external view returns (uint256); +``` + +Wie der Name schon sagt, gibt `balanceOf` den Saldo eines Kontos zurück. Ethereum-Konten werden in Solidity mit dem Typ `address` identifiziert, der 160 Bit enthält. +Sie ist ebenfalls `external` und `view`. + +  + +```solidity + /** + * @dev Verschiebt `amount` Token vom Konto des Aufrufers an `recipient`. + * + * Gibt einen booleschen Wert zurück, der angibt, ob die Operation erfolgreich war. + * + * Löst ein {Transfer}-Ereignis aus. + */ + function transfer(address recipient, uint256 amount) external returns (bool); +``` + +Die Funktion `transfer` überträgt Token vom Aufrufer an eine andere Adresse. Dies beinhaltet eine Zustandsänderung, also ist es keine `view`. +Wenn ein Nutzer diese Funktion aufruft, erzeugt das eine Transaktion und kostet Gas. Sie löst auch ein Ereignis, `Transfer`, aus, um alle auf +der Blockchain über das Ereignis zu informieren. + +Die Funktion hat zwei Arten von Ausgaben für zwei verschiedene Arten von Aufrufern: + +- Benutzer, die die Funktion direkt über eine Benutzeroberfläche aufrufen. Typischerweise sendet der Nutzer eine Transaktion + und wartet nicht auf eine Antwort, was unbestimmt lange dauern kann. Der Nutzer kann sehen, was passiert ist, + indem er nach dem Transaktionsbeleg (der durch den Transaktions-Hash identifiziert wird) oder nach dem + `Transfer`-Ereignis sucht. +- Andere Verträge, die die Funktion als Teil einer Gesamttransaktion aufrufen. Diese Verträge erhalten das Ergebnis sofort, + da sie in derselben Transaktion laufen und somit den Rückgabewert der Funktion verwenden können. + +Die gleiche Art von Ausgabe wird von den anderen Funktionen erzeugt, die den Zustand des Vertrags ändern. + +  + +Berechtigungen („Allowances“) erlauben es einem Konto, einige Token auszugeben, die einem anderen Besitzer gehören. +Dies ist z. B. für Verträge nützlich, die als Verkäufer fungieren. Verträge können nicht +auf Ereignisse warten. Wenn also ein Käufer Token direkt an den Verkäufervertrag überweisen würde, +wüsste dieser Vertrag nicht, dass er bezahlt wurde. Stattdessen erlaubt der Käufer dem +Verkäufervertrag, einen bestimmten Betrag auszugeben, und der Verkäufer überweist diesen Betrag. +Dies geschieht über eine Funktion, die der Verkäufervertrag aufruft, sodass der Verkäufervertrag +wissen kann, ob sie erfolgreich war. + +```solidity + /** + * @dev Gibt die verbleibende Anzahl von Token zurück, die `spender` im + * Namen von `owner` über {transferFrom} ausgeben darf. Dieser Wert ist + * standardmäßig null. + * + * Dieser Wert ändert sich, wenn {approve} oder {transferFrom} aufgerufen werden. + */ + function allowance(address owner, address spender) external view returns (uint256); +``` + +Die Funktion `allowance` ermöglicht es jedem, abzufragen, welche Berechtigung eine +Adresse (`owner`) einer anderen Adresse (`spender`) zum Ausgeben erteilt. + +  + +```solidity + /** + * @dev Legt `amount` als die Berechtigung von `spender` über die Token des Aufrufers fest. + * + * Gibt einen booleschen Wert zurück, der angibt, ob die Operation erfolgreich war. + * + * WICHTIG: Beachten Sie, dass das Ändern einer Berechtigung mit dieser Methode das Risiko birgt, + * dass jemand durch eine unglückliche Transaktionsreihenfolge sowohl die alte als auch die neue + * Berechtigung verwenden kann. Eine mögliche Lösung zur Minderung dieser Race-Condition + * besteht darin, zuerst die Berechtigung des Spenders auf 0 zu reduzieren und danach den + * gewünschten Wert festzulegen: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Löst ein {Approval}-Ereignis aus. + */ + function approve(address spender, uint256 amount) external returns (bool); +``` + +Die Funktion `approve` erstellt eine Berechtigung. Lesen Sie unbedingt die Meldung darüber, +wie sie missbraucht werden kann. In Ethereum kontrollieren Sie die Reihenfolge Ihrer eigenen Transaktionen, +aber Sie können nicht die Reihenfolge kontrollieren, in der die Transaktionen anderer Personen ausgeführt werden, +es sei denn, Sie reichen Ihre eigene Transaktion erst ein, wenn Sie sehen, dass +die Transaktion der anderen Seite stattgefunden hat. + +  + +```solidity + /** + * @dev Verschiebt `amount` Token von `sender` zu `recipient` unter Verwendung des + * Berechtigungsmechanismus. `amount` wird dann von der Berechtigung des Aufrufers + * abgezogen. + * + * Gibt einen booleschen Wert zurück, der angibt, ob die Operation erfolgreich war. + * + * Löst ein {Transfer}-Ereignis aus. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); +``` + +Schließlich wird `transferFrom` vom Ausgebenden verwendet, um die Berechtigung tatsächlich zu nutzen. + +  + +```solidity + + /** + * @dev Wird ausgelöst, wenn `value` Token von einem Konto (`from`) auf + * ein anderes (`to`) verschoben werden. + * + * Beachten Sie, dass `value` null sein kann. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Wird ausgelöst, wenn die Berechtigung eines `spender` für einen `owner` durch + * einen Aufruf von {approve} festgelegt wird. `value` ist die neue Berechtigung. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} +``` + +Diese Ereignisse werden ausgelöst, wenn sich der Zustand des ERC-20-Vertrags ändert. + +## Der eigentliche Vertrag {#the-actual-contract} + +Dies ist der eigentliche Vertrag, der den ERC-20-Standard implementiert, +[entnommen von hier](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). +Er ist nicht dafür gedacht, so wie er ist verwendet zu werden, aber Sie können +[davon erben](https://www.tutorialspoint.com/solidity/solidity_inheritance.htm), um ihn zu etwas Nutzbarem zu erweitern. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <0.8.0; +``` + +  + +### Import-Anweisungen {#import-statements} + +Zusätzlich zu den oben genannten Interface-Definitionen importiert die Contract-Definition zwei weitere Dateien: + +```solidity + +import "../../GSN/Context.sol"; +import "./IERC20.sol"; +import "../../math/SafeMath.sol"; +``` + +- `GSN/Context.sol` enthält die Definitionen, die für die Verwendung von [OpenGSN](https://www.opengsn.org/) erforderlich sind, einem System, das es Nutzern ohne Ether + ermöglicht, die Blockchain zu verwenden. Beachten Sie, dass dies eine alte Version ist. Wenn Sie OpenGSN integrieren möchten, + [verwenden Sie dieses Tutorial](https://docs.opengsn.org/javascript-client/tutorial.html). +- [Die SafeMath-Bibliothek](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/), die + arithmetische Über- und Unterläufe für Solidity-Versionen **<0.8.0** verhindert. In Solidity ≥0.8.0 werden arithmetische Operationen bei + Über-/Unterlauf automatisch zurückgesetzt, wodurch SafeMath überflüssig wird. Dieser Vertrag verwendet SafeMath für die Abwärtskompatibilität mit + älteren Compiler-Versionen. + +  + +Dieser Kommentar erklärt den Zweck des Vertrags. + +```solidity +/** + * @dev Implementierung der {IERC20}-Schnittstelle. + * + * Diese Implementierung ist agnostisch gegenüber der Art und Weise, wie Token erstellt werden. Das bedeutet, + * dass ein Versorgungsmechanismus in einem abgeleiteten Vertrag mit {_mint} hinzugefügt werden muss. + * Einen generischen Mechanismus finden Sie unter {ERC20PresetMinterPauser}. + * + * TIPP: Eine detaillierte Beschreibung finden Sie in unserem Leitfaden + * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[Wie + * Versorgungsmechanismen implementiert werden]. + * + * Wir haben die allgemeinen OpenZeppelin-Richtlinien befolgt: Funktionen werden zurückgesetzt, anstatt + * bei einem Fehler `false` zurückzugeben. Dieses Verhalten ist jedoch konventionell + * und steht nicht im Widerspruch zu den Erwartungen von ERC20-Anwendungen. + * + * Zusätzlich wird bei Aufrufen von {transferFrom} ein {Approval}-Ereignis ausgelöst. + * Dies ermöglicht es Anwendungen, die Berechtigung für alle Konten allein + * durch das Abhören dieser Ereignisse zu rekonstruieren. Andere Implementierungen des EIP geben + * diese Ereignisse möglicherweise nicht aus, da dies nicht von der Spezifikation gefordert wird. + * + * Schließlich wurden die nicht standardmäßigen Funktionen {decreaseAllowance} und {increaseAllowance} + * hinzugefügt, um die bekannten Probleme bei der Festlegung von + * Berechtigungen zu entschärfen. Siehe {IERC20-approve}. + */ + +``` + +### Vertragsdefinition {#contract-definition} + +```solidity +contract ERC20 is Context, IERC20 { +``` + +Diese Zeile gibt die Vererbung an, in diesem Fall von `IERC20` von oben und `Context` für OpenGSN. + +  + +```solidity + + using SafeMath for uint256; + +``` + +Diese Zeile hängt die `SafeMath`-Bibliothek an den Typ `uint256` an. Sie können diese Bibliothek +[hier](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol) finden. + +### Variablendefinitionen {#variable-definitions} + +Diese Definitionen legen die Zustandsvariablen des Vertrags fest. Diese Variablen sind `private` deklariert, aber +das bedeutet nur, dass andere Verträge auf der Blockchain sie nicht lesen können. _Es gibt keine +Geheimnisse auf der Blockchain_, die Software auf jedem Knoten hat den Zustand jedes Vertrags +bei jedem Block. Konventionsgemäß werden Zustandsvariablen `_` genannt. + +Die ersten beiden Variablen sind [Mappings](https://www.tutorialspoint.com/solidity/solidity_mappings.htm), +was bedeutet, dass sie sich ungefähr wie [assoziative Arrays](https://wikipedia.org/wiki/Associative_array) verhalten, +außer dass die Schlüssel numerische Werte sind. Speicher wird nur für Einträge zugewiesen, die Werte haben, die sich vom +Standardwert (Null) unterscheiden. + +```solidity + mapping (address => uint256) private _balances; +``` + +Das erste Mapping, `_balances`, enthält Adressen und ihre jeweiligen Saldi dieses Tokens. Um auf +den Saldo zuzugreifen, verwenden Sie diese Syntax: `_balances[
]`. + +  + +```solidity + mapping (address => mapping (address => uint256)) private _allowances; +``` + +Diese Variable, `_allowances`, speichert die zuvor erläuterten Berechtigungen. Der erste Index ist der Besitzer +der Token, und der zweite ist der Vertrag mit der Berechtigung. Um auf den Betrag zuzugreifen, den Adresse A vom Konto von Adresse B +ausgeben kann, verwenden Sie `_allowances[B][A]`. + +  + +```solidity + uint256 private _totalSupply; +``` + +Wie der Name schon sagt, hält diese Variable den Gesamtvorrat an Token nach. + +  + +```solidity + string private _name; + string private _symbol; + uint8 private _decimals; +``` + +Diese drei Variablen werden verwendet, um die Lesbarkeit zu verbessern. Die ersten beiden sind selbsterklärend, aber `_decimals` +ist es nicht. + +Einerseits gibt es bei Ethereum keine Gleitkomma- oder Bruchvariablen. Andererseits +mögen es Menschen, Token teilen zu können. Ein Grund, warum man sich auf Gold als Währung einigte, war, +dass es schwer war, Wechselgeld herauszugeben, wenn jemand eine Ente im Wert einer Kuh kaufen wollte. + +Die Lösung besteht darin, ganze Zahlen zu verfolgen, aber anstelle des echten Tokens einen Bruchteil eines Tokens zu zählen, der +fast wertlos ist. Im Fall von Ether wird der Bruchteil des Tokens „Wei“ genannt, und 10^18 Wei entsprechen einem +ETH. Zum Zeitpunkt der Erstellung dieses Artikels entsprechen 10.000.000.000.000 Wei ungefähr einem US- oder Euro-Cent. + +Anwendungen müssen wissen, wie der Token-Saldo angezeigt wird. Wenn ein Nutzer 3.141.000.000.000.000.000 Wei hat, sind das +3,14 ETH? 31,41 ETH? 3.141 ETH? Im Fall von Ether ist 10^18 Wei zu ETH definiert, aber für Ihren +Token können Sie einen anderen Wert wählen. Wenn die Teilung des Tokens keinen Sinn macht, können Sie einen +`_decimals`-Wert von Null verwenden. Wenn Sie denselben Standard wie ETH verwenden möchten, verwenden Sie den Wert **18**. + +### Der Konstruktor {#the-constructor} + +```solidity + /** + * @dev Setzt die Werte für {name} und {symbol}, initialisiert {decimals} mit + * einem Standardwert von 18. + * + * Um einen anderen Wert für {decimals} zu wählen, verwenden Sie {_setupDecimals}. + * + * Alle drei dieser Werte sind unveränderlich: Sie können nur einmal während + * der Konstruktion festgelegt werden. + */ + constructor (string memory name_, string memory symbol_) public { + // In Solidity ≥0.7.0 ist 'public' implizit und kann weggelassen werden. + + _name = name_; + _symbol = symbol_; + _decimals = 18; + } +``` + +Der Konstruktor wird aufgerufen, wenn der Vertrag zum ersten Mal erstellt wird. Konventionsgemäß werden Funktionsparameter `_` genannt. + +### Benutzeroberflächenfunktionen {#user-interface-functions} + +```solidity + /** + * @dev Gibt den Namen des Tokens zurück. + */ + function name() public view returns (string memory) { + return _name; + } + + /** + * @dev Gibt das Symbol des Tokens zurück, normalerweise eine kürzere Version des + * Namens. + */ + function symbol() public view returns (string memory) { + return _symbol; + } + + /** + * @dev Gibt die Anzahl der Dezimalstellen zurück, die zur Darstellung für den Benutzer verwendet werden. + * Wenn `decimals` beispielsweise `2` ist, sollte ein Saldo von `505` Token + * einem Benutzer als `5,05` (`505 / 10 ** 2`) angezeigt werden. + * + * Token entscheiden sich normalerweise für einen Wert von 18 und ahmen damit die Beziehung zwischen + * Ether und Wei nach. Dies ist der Wert, den {ERC20} verwendet, es sei denn, {_setupDecimals} wird + * aufgerufen. + * + * HINWEIS: Diese Information wird nur zu _Anzeige_-Zwecken verwendet: Sie beeinflusst + * in keiner Weise die Arithmetik des Vertrags, einschließlich + * {IERC20-balanceOf} und {IERC20-transfer}. + */ + function decimals() public view returns (uint8) { + return _decimals; + } +``` + +Diese Funktionen, `name`, `symbol` und `decimals`, helfen Benutzeroberflächen, Ihren Vertrag zu kennen, damit sie ihn richtig anzeigen können. + +Der Rückgabetyp ist `string memory`, was bedeutet, dass eine Zeichenfolge zurückgegeben wird, die im Speicher gespeichert ist. Variablen, wie z. B. +Zeichenketten, können an drei Stellen gespeichert werden: + +| | Lebensdauer | Vertragszugriff | Gaskosten | +| ----------- | ---------------- | --------------- | ---------------------------------------------------------------------------------- | +| Speicher | Funktionsaufruf | Lesen/Schreiben | Zehner oder Hunderter (höher für höhere Lagen) | +| Aufrufdaten | Funktionsaufruf | Nur Lesen | Kann nicht als Rückgabetyp verwendet werden, sondern nur als Funktionsparametertyp | +| Speicherort | Bis zur Änderung | Lesen/Schreiben | Hoch (800 für Lesen, 20.000 für Schreiben) | + +In diesem Fall ist der Speicher die beste Wahl. + +### Token-Informationen lesen {#read-token-information} + +Dies sind Funktionen, die Informationen über den Token liefern, entweder den Gesamtvorrat oder den +Saldo eines Kontos. + +```solidity + /** + * @dev Siehe {IERC20-totalSupply}. + */ + function totalSupply() public view override returns (uint256) { + return _totalSupply; + } +``` + +Die Funktion `totalSupply` gibt den Gesamtvorrat an Token zurück. + +  + +```solidity + /** + * @dev Siehe {IERC20-balanceOf}. + */ + function balanceOf(address account) public view override returns (uint256) { + return _balances[account]; + } +``` + +Lesen Sie den Saldo eines Kontos. Beachten Sie, dass jeder den Kontostand eines anderen abrufen darf. Es hat keinen Sinn, diese Informationen zu verbergen, da sie ohnehin auf jedem Knoten verfügbar sind. _Es gibt keine Geheimnisse in der Blockchain._ + +### Token übertragen {#transfer-tokens} + +```solidity + /** + * @dev Siehe {IERC20-transfer}. + * + * Anforderungen: + * + * - `recipient` darf nicht die Null-Adresse sein. + * - Der Aufrufer muss einen Saldo von mindestens `amount` haben. + */ + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { +``` + +Die Funktion `transfer` wird aufgerufen, um Token vom Konto des Absenders auf ein anderes zu übertragen. Beachten Sie, +dass sie zwar einen booleschen Wert zurückgibt, dieser aber immer **true** ist. Wenn die Übertragung +fehlschlägt, setzt der Vertrag den Aufruf zurück. + +  + +```solidity + _transfer(_msgSender(), recipient, amount); + return true; + } +``` + +Die Funktion `_transfer` erledigt die eigentliche Arbeit. Es handelt sich um eine private Funktion, die nur von +anderen Vertragsfunktionen aufgerufen werden kann. Konventionsgemäß werden private Funktionen wie Zustands- +variablen `_` genannt. + +Normalerweise verwenden wir in Solidity `msg.sender` für den Absender der Nachricht. Das stört jedoch +[OpenGSN](http://opengsn.org/). Wenn wir Transaktionen ohne Ether mit unserem Token zulassen wollen, müssen wir +`_msgSender()` verwenden. Sie gibt `msg.sender` für normale Transaktionen zurück, aber für solche ohne Ether +gibt sie den ursprünglichen Unterzeichner und nicht den Vertrag zurück, der die Nachricht weitergeleitet hat. + +### Berechtigungsfunktionen {#allowance-functions} + +Dies sind die Funktionen, die die Berechtigungsfunktionalität implementieren: `allowance`, `approve`, `transferFrom` +und `_approve`. Zusätzlich geht die OpenZeppelin-Implementierung über den Basisstandard hinaus und enthält einige Funktionen, die die +Sicherheit verbessern: `increaseAllowance` und `decreaseAllowance`. + +#### Die allowance-Funktion {#allowance} + +```solidity + /** + * @dev Siehe {IERC20-allowance}. + */ + function allowance(address owner, address spender) public view virtual override returns (uint256) { + return _allowances[owner][spender]; + } +``` + +Die Funktion `allowance` ermöglicht es jedem, jede Berechtigung zu überprüfen. + +#### Die approve-Funktion {#approve} + +```solidity + /** + * @dev Siehe {IERC20-approve}. + * + * Anforderungen: + * + * - `spender` darf nicht die Null-Adresse sein. + */ + function approve(address spender, uint256 amount) public virtual override returns (bool) { +``` + +Diese Funktion wird aufgerufen, um eine Berechtigung zu erstellen. Sie ähnelt der obigen `transfer`-Funktion: + +- Die Funktion ruft lediglich eine interne Funktion auf (in diesem Fall `_approve`), die die eigentliche Arbeit erledigt. +- Die Funktion gibt entweder `true` zurück (wenn erfolgreich) oder wird zurückgesetzt (wenn nicht). + +  + +```solidity + _approve(_msgSender(), spender, amount); + return true; + } +``` + +Wir verwenden interne Funktionen, um die Anzahl der Stellen, an denen Zustandsänderungen stattfinden, zu minimieren. _Jede_ Funktion, die den +Zustand ändert, stellt ein potenzielles Sicherheitsrisiko dar, das auf Sicherheit geprüft werden muss. Auf diese Weise ist die Wahrscheinlichkeit geringer, dass wir etwas falsch machen. + +#### Die transferFrom-Funktion {#transferFrom} + +Dies ist die Funktion, die ein Ausgebender aufruft, um eine Berechtigung zu nutzen. Dies erfordert zwei Operationen: die Übertragung des ausgegebenen +Betrags und die Reduzierung der Berechtigung um diesen Betrag. + +```solidity + /** + * @dev Siehe {IERC20-transferFrom}. + * + * Löst ein {Approval}-Ereignis aus, das die aktualisierte Berechtigung anzeigt. Dies ist nicht + * vom EIP gefordert. Siehe den Hinweis am Anfang von {ERC20}. + * + * Anforderungen: + * + * - `sender` und `recipient` dürfen nicht die Null-Adresse sein. + * - `sender` muss einen Saldo von mindestens `amount` haben. + * - der Aufrufer muss eine Berechtigung für die Token von `sender` von mindestens + * `amount` haben. + */ + function transferFrom(address sender, address recipient, uint256 amount) public virtual + override returns (bool) { + _transfer(sender, recipient, amount); +``` + +  + +Der Funktionsaufruf `a.sub(b, "message")` tut zwei Dinge. Erstens berechnet er `a-b`, was die neue Berechtigung ist. +Zweitens prüft er, ob dieses Ergebnis nicht negativ ist. Wenn es negativ ist, wird der Aufruf mit der angegebenen Nachricht zurückgesetzt. Beachten Sie, dass bei einem Zurücksetzen eines Aufrufs jede zuvor während dieses Aufrufs durchgeführte Verarbeitung ignoriert wird, sodass wir den +`_transfer` nicht rückgängig machen müssen. + +```solidity + _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, + "ERC20: transfer amount exceeds allowance")); + return true; + } +``` + +#### Sicherheitserweiterungen von OpenZeppelin {#openzeppelin-safety-additions} + +Es ist gefährlich, eine Berechtigung, die nicht Null ist, auf einen anderen Wert ungleich Null zu setzen, +da Sie nur die Reihenfolge Ihrer eigenen Transaktionen kontrollieren, nicht die von jemand anderem. Stellen Sie sich vor, +Sie haben zwei Nutzer, Alice, die naiv ist, und Bill, der unehrlich ist. Alice möchte eine Dienstleistung von +Bill, von der sie glaubt, dass sie fünf Token kostet – also gibt sie Bill eine Berechtigung von fünf Token. + +Dann ändert sich etwas und Bills Preis steigt auf zehn Token. Alice, die den Dienst immer noch will, +sendet eine Transaktion, die Bills Berechtigung auf zehn setzt. Sobald Bill diese neue Transaktion +im Transaktionspool sieht, sendet er eine Transaktion, die Alices fünf Token ausgibt und einen viel +höheren Gaspreis hat, damit sie schneller gemint wird. Auf diese Weise kann Bill zuerst fünf Token ausgeben und dann, +sobald Alices neue Berechtigung gemint wurde, zehn weitere ausgeben, für einen Gesamtpreis von fünfzehn Token, mehr als +Alice autorisieren wollte. Diese Technik wird +[Front-Running](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/#front-running) genannt + +| Alice-Transaktion | Alice-Nonce | Bill-Transaktion | Bill-Nonce | Bills Berechtigung | Bills Gesamteinkommen von Alice | +| ------------------------------------ | ----------- | ------------------------------------------------ | ---------- | ------------------ | ------------------------------- | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | +| approve(Bill, 10) | 11 | | | 10 | 5 | +| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 15 | + +Um dieses Problem zu vermeiden, ermöglichen es diese beiden Funktionen (`increaseAllowance` und `decreaseAllowance`), die +Berechtigung um einen bestimmten Betrag zu ändern. Wenn Bill also bereits fünf Token ausgegeben hat, wird er nur +noch fünf weitere ausgeben können. Je nach Zeitplan gibt es zwei Möglichkeiten, wie dies funktionieren kann, die beide damit enden, dass Bill nur zehn Token erhält: + +A: + +| Alice-Transaktion | Alice-Nonce | Bill-Transaktion | Bill-Nonce | Bills Berechtigung | Bills Gesamteinkommen von Alice | +| --------------------------------------------- | ----------: | ----------------------------------------------- | ---------: | -----------------: | ------------------------------- | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | +| increaseAllowance(Bill, 5) | 11 | | | 0+5 = 5 | 5 | +| | | transferFrom(Alice, Bill, 5) | 10,124 | 0 | 10 | + +B: + +| Alice-Transaktion | Alice-Nonce | Bill-Transaktion | Bill-Nonce | Bills Berechtigung | Bills Gesamteinkommen von Alice | +| --------------------------------------------- | ----------: | ------------------------------------------------ | ---------: | -----------------: | ------------------------------: | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| increaseAllowance(Bill, 5) | 11 | | | 5+5 = 10 | 0 | +| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 10 | + +```solidity + /** + * @dev Erhöht atomar die dem `spender` vom Aufrufer gewährte Berechtigung. + * + * Dies ist eine Alternative zu {approve}, die als Milderung für + * in {IERC20-approve} beschriebene Probleme verwendet werden kann. + * + * Löst ein {Approval}-Ereignis aus, das die aktualisierte Berechtigung anzeigt. + * + * Anforderungen: + * + * - `spender` darf nicht die Null-Adresse sein. + */ + function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); + return true; + } +``` + +Die Funktion `a.add(b)` ist eine sichere Addition. In dem unwahrscheinlichen Fall, dass `a`+`b`>=`2^256` ist, findet kein Umbruch +statt, wie es bei der normalen Addition der Fall ist. + +```solidity + + /** + * @dev Verringert atomar die dem `spender` vom Aufrufer gewährte Berechtigung. + * + * Dies ist eine Alternative zu {approve}, die als Milderung für + * in {IERC20-approve} beschriebene Probleme verwendet werden kann. + * + * Löst ein {Approval}-Ereignis aus, das die aktualisierte Berechtigung anzeigt. + * + * Anforderungen: + * + * - `spender` darf nicht die Null-Adresse sein. + * - `spender` muss eine Berechtigung für den Aufrufer von mindestens + * `subtractedValue` haben. + */ + function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, + "ERC20: decreased allowance below zero")); + return true; + } +``` + +### Funktionen, die Token-Informationen ändern {#functions-that-modify-token-information} + +Dies sind die vier Funktionen, die die eigentliche Arbeit erledigen: `_transfer`, `_mint`, `_burn` und `_approve`. + +#### Die _transfer-Funktion {#_transfer} + +```solidity + /** + * @dev Verschiebt `amount` Token von `sender` zu `recipient`. + * + * Diese interne Funktion ist äquivalent zu {transfer} und kann verwendet werden, + * um z. B. automatische Token-Gebühren, Slashing-Mechanismen usw. zu implementieren. + * + * Löst ein {Transfer}-Ereignis aus. + * + * Anforderungen: + * + * - `sender` darf nicht die Null-Adresse sein. + * - `recipient` darf nicht die Null-Adresse sein. + * - `sender` muss einen Saldo von mindestens `amount` haben. + */ + function _transfer(address sender, address recipient, uint256 amount) internal virtual { +``` + +Diese Funktion, `_transfer`, überträgt Token von einem Konto auf ein anderes. Sie wird sowohl von +`transfer` (für Übertragungen vom eigenen Konto des Absenders) als auch von `transferFrom` (zur Verwendung von Berechtigungen +zur Übertragung vom Konto eines anderen) aufgerufen. + +  + +```solidity + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); +``` + +Niemand besitzt tatsächlich die Adresse Null in Ethereum (d. h., niemand kennt einen privaten Schlüssel, dessen zugehöriger öffentlicher Schlüssel +in die Null-Adresse umgewandelt wird). Wenn Leute diese Adresse verwenden, handelt es sich normalerweise um einen Softwarefehler – daher +schlagen wir fehl, wenn die Null-Adresse als Absender oder Empfänger verwendet wird. + +  + +```solidity + _beforeTokenTransfer(sender, recipient, amount); + +``` + +Es gibt zwei Möglichkeiten, diesen Vertrag zu verwenden: + +1. Verwenden Sie ihn als Vorlage für Ihren eigenen Code +2. [Erben Sie davon](https://www.bitdegree.org/learn/solidity-inheritance) und überschreiben Sie nur die Funktionen, die Sie ändern müssen + +Die zweite Methode ist viel besser, da der OpenZeppelin ERC-20-Code bereits geprüft wurde und als sicher gilt. Wenn Sie Vererbung verwenden, +ist es klar, welche Funktionen Sie ändern, und um Ihrem Vertrag zu vertrauen, müssen die Leute nur diese spezifischen Funktionen prüfen. + +Es ist oft nützlich, eine Funktion jedes Mal auszuführen, wenn Token den Besitzer wechseln. `_transfer` ist jedoch eine sehr wichtige Funktion und es ist +möglich, sie unsicher zu schreiben (siehe unten), daher ist es am besten, sie nicht zu überschreiben. Die Lösung ist `_beforeTokenTransfer`, eine +[Hook-Funktion](https://wikipedia.org/wiki/Hooking). Sie können diese Funktion überschreiben, und sie wird bei jeder Übertragung aufgerufen. + +  + +```solidity + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); +``` + +Dies sind die Zeilen, die die Übertragung tatsächlich durchführen. Beachten Sie, dass **nichts** zwischen ihnen steht und dass wir den +übertragenen Betrag vom Absender abziehen, bevor wir ihn dem Empfänger hinzufügen. Dies ist wichtig, denn wenn es in der Mitte einen +Aufruf an einen anderen Vertrag gäbe, hätte dieser genutzt werden können, um diesen Vertrag zu betrügen. Auf diese Weise ist die Übertragung +atomar, nichts kann in der Mitte davon passieren. + +  + +```solidity + emit Transfer(sender, recipient, amount); + } +``` + +Schließlich wird ein `Transfer`-Ereignis ausgelöst. Ereignisse sind für Smart Contracts nicht zugänglich, aber Code, der außerhalb der Blockchain +ausgeführt wird, kann auf Ereignisse lauschen und darauf reagieren. Zum Beispiel kann eine Wallet nachverfolgen, wann der Besitzer mehr Token erhält. + +#### Die _mint- und _burn-Funktionen {#_mint-and-_burn} + +Diese beiden Funktionen (`_mint` und `_burn`) ändern den Gesamtvorrat an Token. +Sie sind intern und es gibt keine Funktion, die sie in diesem Vertrag aufruft, +sie sind also nur nützlich, wenn Sie von dem Vertrag erben und Ihre eigene +Logik hinzufügen, um zu entscheiden, unter welchen Bedingungen neue Token gemint oder bestehende +gebrannt werden. + +**HINWEIS:** Jeder ERC-20-Token hat seine eigene Geschäftslogik, die die Token-Verwaltung vorschreibt. +Ein Vertrag mit festem Angebot könnte beispielsweise nur `_mint` +im Konstruktor aufrufen und niemals `_burn`. Ein Vertrag, der Token verkauft, +ruft `_mint` auf, wenn er bezahlt wird, und ruft vermutlich irgendwann `_burn` auf, +um eine galoppierende Inflation zu vermeiden. + +```solidity + /** @dev Erstellt `amount` Token und weist sie `account` zu, wodurch der + * Gesamtvorrat erhöht wird. + * + * Löst ein {Transfer}-Ereignis aus, bei dem `from` auf die Null-Adresse gesetzt ist. + * + * Anforderungen: + * + * - `to` darf nicht die Null-Adresse sein. + */ + function _mint(address account, uint256 amount) internal virtual { + require(account != address(0), "ERC20: mint to the zero address"); + _beforeTokenTransfer(address(0), account, amount); + _totalSupply = _totalSupply.add(amount); + _balances[account] = _balances[account].add(amount); + emit Transfer(address(0), account, amount); + } +``` + +Stellen Sie sicher, dass `_totalSupply` aktualisiert wird, wenn sich die Gesamtzahl der Token ändert. + +  + +```solidity + /** + * @dev Zerstört `amount` Token von `account` und reduziert so den + * Gesamtvorrat. + * + * Löst ein {Transfer}-Ereignis aus, bei dem `to` auf die Null-Adresse gesetzt ist. + * + * Anforderungen: + * + * - `account` darf nicht die Null-Adresse sein. + * - `account` muss mindestens `amount` Token besitzen. + */ + function _burn(address account, uint256 amount) internal virtual { + require(account != address(0), "ERC20: burn from the zero address"); + + _beforeTokenTransfer(account, address(0), amount); + + _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); + _totalSupply = _totalSupply.sub(amount); + emit Transfer(account, address(0), amount); + } +``` + +Die Funktion `_burn` ist fast identisch mit `_mint`, außer dass sie in die andere Richtung geht. + +#### Die _approve-Funktion {#_approve} + +Dies ist die Funktion, die tatsächlich Berechtigungen festlegt. Beachten Sie, dass es einem Besitzer erlaubt, eine +Berechtigung anzugeben, die höher ist als der aktuelle Saldo des Besitzers. Das ist in Ordnung, da der Saldo zum Zeitpunkt der +Übertragung überprüft wird, wo er sich von dem Saldo unterscheiden kann, der bei der Erstellung der Berechtigung +vorhanden war. + +```solidity + /** + * @dev Legt `amount` als die Berechtigung von `spender` über die Token des `owner` fest. + * + * Diese interne Funktion ist äquivalent zu `approve` und kann verwendet werden, + * um z. B. automatische Berechtigungen für bestimmte Subsysteme festzulegen. + * + * Löst ein {Approval}-Ereignis aus. + * + * Anforderungen: + * + * - `owner` darf nicht die Null-Adresse sein. + * - `spender` darf nicht die Null-Adresse sein. + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + + _allowances[owner][spender] = amount; +``` + +  + +Lösen Sie ein `Approval`-Ereignis aus. Je nachdem, wie die Anwendung geschrieben ist, kann der Vertrag des Ausgebenden über die +Genehmigung entweder vom Eigentümer oder von einem Server, der auf diese Ereignisse lauscht, informiert werden. + +```solidity + emit Approval(owner, spender, amount); + } + +``` + +### Die Dezimalvariable ändern {#modify-the-decimals-variable} + +```solidity + + + /** + * @dev Setzt {decimals} auf einen anderen Wert als den Standardwert 18. + * + * WARNUNG: Diese Funktion sollte nur vom Konstruktor aufgerufen werden. Die meisten + * Anwendungen, die mit Token-Verträgen interagieren, erwarten nicht, + * dass sich {decimals} jemals ändert, und könnten bei einer Änderung falsch funktionieren. + */ + function _setupDecimals(uint8 decimals_) internal { + _decimals = decimals_; + } +``` + +Diese Funktion ändert die Variable `_decimals`, die verwendet wird, um Benutzeroberflächen mitzuteilen, wie der Betrag zu interpretieren ist. +Sie sollten sie vom Konstruktor aus aufrufen. Es wäre unehrlich, sie zu einem späteren Zeitpunkt aufzurufen, und Anwendungen +sind nicht darauf ausgelegt, damit umzugehen. + +### Hooks {#hooks} + +```solidity + + /** + * @dev Hook, der vor jeder Übertragung von Token aufgerufen wird. Dies schließt + * Minting und Burning ein. + * + * Aufrufbedingungen: + * + * - Wenn `from` und `to` beide nicht null sind, wird `amount` der Token von `from` + * an `to` übertragen. + * - Wenn `from` null ist, werden `amount` Token für `to` gemint. + * - Wenn `to` null ist, wird `amount` der Token von `from` verbrannt. + * - `from` und `to` sind niemals beide null. + * + * Um mehr über Hooks zu erfahren, gehen Sie zu xref:ROOT:extending-contracts.adoc#using-hooks[Verwendung von Hooks]. + */ + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } +} +``` + +Dies ist die Hook-Funktion, die bei Übertragungen aufgerufen wird. Sie ist hier leer, aber wenn Sie möchten, +dass sie etwas tut, überschreiben Sie sie einfach. + +## Fazit {#conclusion} + +Zur Wiederholung, hier sind einige der wichtigsten Ideen in diesem Vertrag (meiner Meinung nach, Ihre kann abweichen): + +- _Es gibt keine Geheimnisse in der Blockchain_. Alle Informationen, auf die ein Smart Contract zugreifen kann, + sind der ganzen Welt zugänglich. +- Sie können die Reihenfolge Ihrer eigenen Transaktionen kontrollieren, aber nicht, wann die Transaktionen anderer Personen + stattfinden. Dies ist der Grund, warum das Ändern einer Berechtigung gefährlich sein kann, da es dem + Ausgebenden ermöglicht, die Summe beider Berechtigungen auszugeben. +- Werte vom Typ `uint256` haben einen Überlauf. Mit anderen Worten: _0-1=2^256-1_. Wenn das kein erwünschtes + Verhalten ist, müssen Sie es überprüfen (oder die SafeMath-Bibliothek verwenden, die das für Sie tut). Beachten Sie, dass sich dies in + [Solidity 0.8.0](https://docs.soliditylang.org/en/breaking/080-breaking-changes.html) geändert hat. +- Führen Sie alle Zustandsänderungen eines bestimmten Typs an einem bestimmten Ort durch, da dies die Prüfung erleichtert. + Dies ist der Grund, warum wir zum Beispiel `_approve` haben, das von `approve`, `transferFrom`, + `increaseAllowance` und `decreaseAllowance` aufgerufen wird +- Zustandsänderungen sollten atomar sein, ohne dass eine andere Aktion in ihrer Mitte stattfindet (wie Sie + in `_transfer` sehen können). Dies liegt daran, dass Sie während der Zustandsänderung einen inkonsistenten Zustand haben. Zum Beispiel + gibt es zwischen dem Zeitpunkt, an dem Sie vom Saldo des Absenders abziehen, und dem Zeitpunkt, an dem Sie dem Saldo des + Empfängers hinzufügen, weniger Token, als es sein sollten. Dies könnte potenziell missbraucht werden, wenn + Operationen zwischen ihnen stattfinden, insbesondere Aufrufe an einen anderen Vertrag. + +Jetzt, da Sie gesehen haben, wie der OpenZeppelin ERC-20-Vertrag geschrieben ist und insbesondere, wie er +sicherer gemacht wurde, können Sie Ihre eigenen sicheren Verträge und Anwendungen schreiben. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). diff --git a/public/content/translations/de/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/de/developers/tutorials/erc20-with-safety-rails/index.md new file mode 100644 index 00000000000..1f76a93c690 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/erc20-with-safety-rails/index.md @@ -0,0 +1,217 @@ +--- +title: ERC-20 mit Sicherheitsvorkehrungen +description: Wie man Leuten helfen kann, dumme Fehler zu vermeiden +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +lang: de +tags: [ "Erc-20" ] +skill: beginner +published: 2022-08-15 +--- + +## Einführung {#introduction} + +Einer der großen Vorteile von Ethereum ist, dass es keine zentrale Instanz gibt, die Ihre Transaktionen ändern oder rückgängig machen kann. Eines der großen Probleme bei Ethereum ist, dass es keine zentrale Instanz gibt, die die Macht hat, Benutzerfehler oder illegale Transaktionen rückgängig zu machen. In diesem Artikel erfahren Sie mehr über einige der häufigsten Fehler, die Benutzer mit [ERC-20](/developers/docs/standards/tokens/erc-20/)-Token machen, sowie darüber, wie Sie ERC-20-Verträge erstellen, die den Benutzern helfen, diese Fehler zu vermeiden, oder die einer zentralen Instanz eine gewisse Macht geben (zum Beispiel das Einfrieren von Konten). + +Beachten Sie, dass wir zwar den [OpenZeppelin ERC-20-Token-Vertrag](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20) verwenden werden, dieser Artikel ihn aber nicht im Detail erklärt. Sie können diese Informationen [hier](/developers/tutorials/erc20-annotated-code) finden. + +Wenn Sie den vollständigen Quellcode sehen möchten: + +1. Öffnen Sie die [Remix IDE](https://remix.ethereum.org/). +2. Klicken Sie auf das GitHub-Klon-Symbol (![clone github icon](icon-clone.png)). +3. Klonen Sie das GitHub-Repository `https://github.com/qbzzt/20220815-erc20-safety-rails`. +4. Öffnen Sie **contracts > erc20-safety-rails.sol**. + +## Einen ERC-20-Vertrag erstellen {#creating-an-erc-20-contract} + +Bevor wir die Sicherheitsfunktionalität hinzufügen können, benötigen wir einen ERC-20-Vertrag. In diesem Artikel verwenden wir [den OpenZeppelin Contracts Wizard](https://docs.openzeppelin.com/contracts/5.x/wizard). Öffnen Sie es in einem anderen Browser und befolgen Sie diese Anweisungen: + +1. Wählen Sie **ERC20** aus. + +2. Geben Sie diese Einstellungen ein: + + | Parameter | Wert | + | ------------------ | ------------------------------- | + | Name | SafetyRailsToken | + | Symbol | SAFE | + | Premint | 1000 | + | Eigenschaften | Keine (None) | + | Zugriffskontrolle | Ownable | + | Aktualisierbarkeit | Keine (None) | + +3. Scrollen Sie nach oben und klicken Sie auf **In Remix öffnen** (für Remix) oder auf **Herunterladen**, um eine andere Umgebung zu verwenden. Ich gehe davon aus, dass Sie Remix verwenden. Wenn Sie etwas anderes verwenden, nehmen Sie einfach die entsprechenden Änderungen vor. + +4. Wir haben jetzt einen voll funktionsfähigen ERC-20-Vertrag. Sie können `.deps` > `npm` erweitern, um den importierten Code zu sehen. + +5. Kompilieren, deployen und spielen Sie mit dem Vertrag, um zu sehen, dass er als ERC-20-Vertrag funktioniert. Wenn Sie lernen müssen, wie man Remix benutzt, [verwenden Sie dieses Tutorial](https://remix.ethereum.org/?#activate=udapp,solidity,LearnEth). + +## Häufige Fehler {#common-mistakes} + +### Die Fehler {#the-mistakes} + +Benutzer senden manchmal Token an die falsche Adresse. Wir können zwar nicht ihre Gedanken lesen, um zu wissen, was sie vorhatten, aber es gibt zwei Fehlertypen, die häufig vorkommen und leicht zu erkennen sind: + +1. Senden der Token an die eigene Adresse des Vertrags. Zum Beispiel hat [Optimisms OP-Token](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c) in weniger als zwei Monaten [über 120.000](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000042) OP-Token angesammelt. Dies stellt ein beträchtliches Vermögen dar, das die Leute vermutlich einfach verloren haben. + +2. Senden der Token an eine leere Adresse, die weder einem [externen Konto](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) noch einem [Smart Contract](/developers/docs/smart-contracts) entspricht. Obwohl ich keine Statistiken darüber habe, wie oft dies vorkommt, [hätte ein Vorfall 20.000.000 Token kosten können](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595). + +### Verhindern von Überweisungen {#preventing-transfers} + +Der OpenZeppelin ERC-20-Vertrag enthält [einen Hook, `_beforeTokenTransfer`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368), der aufgerufen wird, bevor ein Token übertragen wird. Standardmäßig tut dieser Hook nichts, aber wir können unsere eigene Funktionalität daran hängen, wie z. B. Prüfungen, die zurücksetzen, wenn es ein Problem gibt. + +Um den Hook zu verwenden, fügen Sie diese Funktion nach dem Konstruktor hinzu: + +```solidity + function _beforeTokenTransfer(address from, address to, uint256 amount) + internal virtual + override(ERC20) + { + super._beforeTokenTransfer(from, to, amount); + } +``` + +Einige Teile dieser Funktion sind vielleicht neu für Sie, wenn Sie mit Solidity nicht sehr vertraut sind: + +```solidity + internal virtual +``` + +Das Schlüsselwort `virtual` bedeutet, dass, so wie wir die Funktionalität von `ERC20` geerbt und diese Funktion überschrieben haben, andere Verträge von uns erben und diese Funktion überschreiben können. + +```solidity + override(ERC20) +``` + +Wir müssen explizit angeben, dass wir die ERC20-Token-Definition von `_beforeTokenTransfer` [überschreiben](https://docs.soliditylang.org/en/v0.8.15/contracts.html#function-overriding). Im Allgemeinen sind explizite Definitionen aus Sicherheitssicht viel besser als implizite – man kann nicht vergessen, dass man etwas getan hat, wenn es direkt vor einem liegt. Das ist auch der Grund, warum wir angeben müssen, welche `_beforeTokenTransfer`-Funktion der Superklasse wir überschreiben. + +```solidity + super._beforeTokenTransfer(from, to, amount); +``` + +Diese Zeile ruft die `_beforeTokenTransfer`-Funktion des Vertrags oder der Verträge auf, von denen wir geerbt haben und die sie besitzen. In diesem Fall ist das nur `ERC20`, `Ownable` hat diesen Hook nicht. Auch wenn `ERC20._beforeTokenTransfer` derzeit nichts tut, rufen wir es auf, für den Fall, dass in Zukunft Funktionalität hinzugefügt wird (und wir uns dann entscheiden, den Vertrag neu zu deployen, da sich Verträge nach dem Deployment nicht ändern). + +### Kodierung der Anforderungen {#coding-the-requirements} + +Wir wollen der Funktion diese Anforderungen hinzufügen: + +- Die `to`-Adresse darf nicht `address(this)` sein, die Adresse des ERC-20-Vertrags selbst. +- Die `to`-Adresse darf nicht leer sein, sie muss entweder: + - Ein externes Konto (EOA). Wir können nicht direkt prüfen, ob eine Adresse ein EOA ist, aber wir können den ETH-Saldo einer Adresse prüfen. EOAs haben fast immer einen Saldo, auch wenn sie nicht mehr verwendet werden – es ist schwierig, sie bis auf den letzten Wei zu leeren. + - Ein Smart Contract. Zu testen, ob eine Adresse ein Smart Contract ist, ist etwas schwieriger. Es gibt einen Opcode, der die externe Codelänge prüft, namens [`EXTCODESIZE`](https://www.evm.codes/#3b), aber er ist in Solidity nicht direkt verfügbar. Wir müssen dafür [Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html) verwenden, was EVM-Assembly ist. Es gibt andere Werte, die wir von Solidity verwenden könnten ([`
.code` und `
.codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)), aber sie kosten mehr. + +Gehen wir den neuen Code Zeile für Zeile durch: + +```solidity + require(to != address(this), "Token können nicht an die Vertragsadresse gesendet werden"); +``` + +Dies ist die erste Anforderung: Prüfen, dass `to` und `this(address)` nicht dasselbe sind. + +```solidity + bool isToContract; + assembly { + isToContract := gt(extcodesize(to), 0) + } +``` + +So prüfen wir, ob eine Adresse ein Vertrag ist. Wir können die Ausgabe nicht direkt von Yul empfangen, also definieren wir stattdessen eine Variable, die das Ergebnis enthält (in diesem Fall `isToContract`). Yul funktioniert so, dass jeder Opcode als eine Funktion betrachtet wird. Zuerst rufen wir also [`EXTCODESIZE`](https://www.evm.codes/#3b) auf, um die Vertragsgröße zu erhalten, und verwenden dann [`GT`](https://www.evm.codes/#11), um zu prüfen, ob sie nicht Null ist (wir haben es mit vorzeichenlosen Ganzzahlen zu tun, also kann sie natürlich nicht negativ sein). Wir schreiben dann das Ergebnis in `isToContract`. + +```solidity + require(to.balance != 0 || isToContract, "Token können nicht an eine leere Adresse gesendet werden"); +``` + +Und schließlich haben wir die eigentliche Prüfung auf leere Adressen. + +## Administrativer Zugriff {#admin-access} + +Manchmal ist es nützlich, einen Administrator zu haben, der Fehler rückgängig machen kann. Um das Missbrauchspotenzial zu verringern, kann dieser Administrator ein [Multisig](https://blog.logrocket.com/security-choices-multi-signature-wallets/) sein, sodass mehrere Personen einer Aktion zustimmen müssen. In diesem Artikel werden wir zwei administrative Funktionen haben: + +1. Einfrieren und Freigeben von Konten. Dies kann nützlich sein, zum Beispiel, wenn ein Konto kompromittiert sein könnte. +2. Asset-Bereinigung. + + Manchmal senden Betrüger betrügerische Token an den Vertrag des echten Tokens, um an Legitimität zu gewinnen. Zum Beispiel, [sehen Sie hier](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe?tab=holders). Der legitime ERC-20-Vertrag ist [0x4200....0042](https://optimism.blockscout.com/token/0x4200000000000000000000000000000000000042). Der Betrug, der vorgibt, er zu sein, ist [0x234....bbe](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe). + + Es ist auch möglich, dass Leute versehentlich legitime ERC-20-Token an unseren Vertrag senden, was ein weiterer Grund ist, eine Möglichkeit zu haben, sie herauszuholen. + +OpenZeppelin bietet zwei Mechanismen, um administrativen Zugriff zu ermöglichen: + +- [`Ownable`](https://docs.openzeppelin.com/contracts/5.x/access-control#ownership-and-ownable)-Verträge haben einen einzigen Besitzer. Funktionen, die den `onlyOwner`-[Modifikator](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) haben, können nur von diesem Besitzer aufgerufen werden. Besitzer können das Eigentum an jemand anderen übertragen oder vollständig darauf verzichten. Die Rechte aller anderen Konten sind typischerweise identisch. +- [`AccessControl`](https://docs.openzeppelin.com/contracts/5.x/access-control#role-based-access-control)-Verträge haben eine [rollenbasierte Zugriffskontrolle (RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control). + +Der Einfachheit halber verwenden wir in diesem Artikel `Ownable`. + +### Einfrieren und Auftauen von Verträgen {#freezing-and-thawing-contracts} + +Das Einfrieren und Auftauen von Verträgen erfordert mehrere Änderungen: + +- Ein [Mapping](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) von Adressen zu [Booleans](https://en.wikipedia.org/wiki/Boolean_data_type), um zu verfolgen, welche Adressen eingefroren sind. Alle Werte sind anfangs Null, was bei booleschen Werten als falsch interpretiert wird. Das ist, was wir wollen, denn standardmäßig sind Konten nicht eingefroren. + + ```solidity + mapping(address => bool) public frozenAccounts; + ``` + +- [Ereignisse](https://www.tutorialspoint.com/solidity/solidity_events.htm), um alle Interessierten zu informieren, wenn ein Konto eingefroren oder aufgetaut wird. Technisch gesehen sind Ereignisse für diese Aktionen nicht erforderlich, aber es hilft Offchain-Code, auf diese Ereignisse zu lauschen und zu wissen, was passiert. Es gilt als guter Stil, wenn ein Smart Contract sie ausgibt, wenn etwas passiert, das für jemand anderen relevant sein könnte. + + Die Ereignisse sind indiziert, so dass es möglich sein wird, nach allen Zeitpunkten zu suchen, an denen ein Konto eingefroren oder aufgetaut wurde. + + ```solidity + // Wenn Konten eingefroren oder aufgetaut werden + event AccountFrozen(address indexed _addr); + event AccountThawed(address indexed _addr); + ``` + +- Funktionen zum Einfrieren und Auftauen von Konten. Diese beiden Funktionen sind fast identisch, also werden wir nur die Einfrierfunktion durchgehen. + + ```solidity + function freezeAccount(address addr) + public + onlyOwner + ``` + + Funktionen, die als [`public`](https://www.tutorialspoint.com/solidity/solidity_contracts.htm) markiert sind, können von anderen Smart Contracts oder direkt durch eine Transaktion aufgerufen werden. + + ```solidity + { + require(!frozenAccounts[addr], "Konto bereits eingefroren"); + frozenAccounts[addr] = true; + emit AccountFrozen(addr); + } // freezeAccount + ``` + + Wenn das Konto bereits eingefroren ist, wird die Transaktion zurückgesetzt (revert). Andernfalls wird es eingefroren und ein Ereignis per `emit` ausgegeben. + +- Ändern Sie `_beforeTokenTransfer`, um zu verhindern, dass Geld von einem eingefrorenen Konto bewegt wird. Beachten Sie, dass Geld weiterhin auf das eingefrorene Konto überwiesen werden kann. + + ```solidity + require(!frozenAccounts[from], "Das Konto ist eingefroren"); + ``` + +### Asset-Bereinigung {#asset-cleanup} + +Um ERC-20-Token freizugeben, die von diesem Vertrag gehalten werden, müssen wir eine Funktion auf dem Token-Vertrag aufrufen, zu dem sie gehören, entweder [`transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer) oder [`approve`](https://eips.ethereum.org/EIPS/eip-20#approve). Es hat keinen Sinn, in diesem Fall Gas für Freigaben (allowances) zu verschwenden, wir können genauso gut direkt übertragen. + +```solidity + function cleanupERC20( + address erc20, + address dest + ) + public + onlyOwner + { + IERC20 token = IERC20(erc20); +``` + +Dies ist die Syntax, um ein Objekt für einen Vertrag zu erstellen, wenn wir die Adresse erhalten. Wir können dies tun, weil wir die Definition für ERC20-Token als Teil des Quellcodes haben (siehe Zeile 4), und diese Datei enthält [die Definition für IERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol), die Schnittstelle für einen OpenZeppelin ERC-20-Vertrag. + +```solidity + uint balance = token.balanceOf(address(this)); + token.transfer(dest, balance); + } +``` + +Dies ist eine Bereinigungsfunktion, also wollen wir vermutlich keine Token übrig lassen. Anstatt den Saldo manuell vom Benutzer abzurufen, können wir den Prozess auch automatisieren. + +## Fazit {#conclusion} + +Dies ist keine perfekte Lösung – es gibt keine perfekte Lösung für das Problem \"Benutzer hat einen Fehler gemacht\". Die Verwendung dieser Art von Überprüfungen kann jedoch zumindest einige Fehler verhindern. Die Möglichkeit, Konten einzufrieren, ist zwar gefährlich, kann aber genutzt werden, um den Schaden bestimmter Hacks zu begrenzen, indem dem Hacker die gestohlenen Gelder verweigert werden. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). diff --git a/public/content/translations/de/developers/tutorials/ethereum-for-web2-auth/index.md b/public/content/translations/de/developers/tutorials/ethereum-for-web2-auth/index.md new file mode 100644 index 00000000000..0778a28d7dd --- /dev/null +++ b/public/content/translations/de/developers/tutorials/ethereum-for-web2-auth/index.md @@ -0,0 +1,886 @@ +--- +title: Verwendung von Ethereum für die Web2-Authentifizierung +description: Nach der Lektüre dieses Tutorials kann ein Entwickler die Ethereum-Anmeldung (Web3) in die SAML-Anmeldung integrieren, einen in Web2 verwendeten Standard zur Bereitstellung von Single Sign-On und anderen damit verbundenen Diensten. Dies ermöglicht die Authentifizierung des Zugriffs auf Web2-Ressourcen durch Ethereum-Signaturen, wobei die Benutzerattribute aus Attestierungen stammen. +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +tags: [ "web2", "authentifizierung", "eas" ] +skill: beginner +lang: de +published: 2025-04-30 +--- + +## Einführung + +[SAML](https://www.onelogin.com/learn/saml) ist ein in Web2 verwendeter Standard, der es einem [Identitätsanbieter (IdP)](https://en.wikipedia.org/wiki/Identity_provider#SAML_identity_provider) ermöglicht, Benutzerinformationen für [Dienstanbieter (SP)](https://en.wikipedia.org/wiki/Service_provider_\(SAML\)) bereitzustellen. + +In diesem Tutorial lernen Sie, wie Sie Ethereum-Signaturen in SAML integrieren, damit Benutzer ihre Ethereum-Wallets zur Authentifizierung bei Web2-Diensten verwenden können, die Ethereum noch nicht nativ unterstützen. + +Beachten Sie, dass dieses Tutorial für zwei verschiedene Zielgruppen geschrieben wurde: + +- Ethereum-Leute, die Ethereum verstehen und SAML lernen müssen +- Web2-Leute, die SAML und die Web2-Authentifizierung verstehen und Ethereum lernen müssen + +Daher wird es eine Menge Einführungsmaterial enthalten, das Sie bereits kennen. Sie können es gerne überspringen. + +### SAML für Ethereum-Leute + +SAML ist ein zentralisiertes Protokoll. Ein Dienstanbieter (SP) akzeptiert nur dann Zusicherungen (z. B. „Dies ist mein Benutzer John, er sollte die Berechtigungen haben, A, B und C zu tun“) von einem Identitätsanbieter (IdP), wenn er eine bereits bestehende Vertrauensbeziehung entweder zu diesem oder zu der [Zertifizierungsstelle](https://www.ssl.com/article/what-is-a-certificate-authority-ca/) hat, die das Zertifikat dieses IdP unterzeichnet hat. + +Der SP kann beispielsweise ein Reisebüro sein, das Reisedienstleistungen für Unternehmen anbietet, und der IdP kann die interne Website eines Unternehmens sein. Wenn Mitarbeiter eine Geschäftsreise buchen müssen, schickt das Reisebüro sie zur Authentifizierung an das Unternehmen, bevor es sie tatsächlich die Reise buchen lässt. + +![Schritt-für-Schritt-SAML-Prozess](./fig-01-saml.png) + +Auf diese Weise verhandeln die drei Entitäten, der Browser, der SP und der IdP, über den Zugriff. Der SP muss im Voraus nichts über den Benutzer wissen, der den Browser verwendet, sondern nur dem IdP vertrauen. + +### Ethereum für SAML-Leute + +Ethereum ist ein dezentralisiertes System. + +![Ethereum-Anmeldung](./fig-02-eth-logon.png) + +Benutzer haben einen privaten Schlüssel (in der Regel in einer Browser-Erweiterung). Aus dem privaten Schlüssel können Sie einen öffentlichen Schlüssel und daraus eine 20-Byte-Adresse ableiten. Wenn sich Benutzer in einem System anmelden müssen, werden sie aufgefordert, eine Nachricht mit einer Nonce (einem einmalig verwendbaren Wert) zu signieren. Der Server kann überprüfen, ob die Signatur von dieser Adresse erstellt wurde. + +![Zusätzliche Daten aus Attestierungen erhalten](./fig-03-eas-data.png) + +Die Signatur verifiziert nur die Ethereum-Adresse. Um andere Benutzerattribute zu erhalten, verwenden Sie normalerweise [Attestierungen](https://attest.org/). Eine Attestierung hat normalerweise diese Felder: + +- **Attestierer**, die Adresse, die die Attestierung vorgenommen hat +- **Empfänger**, die Adresse, für die die Attestierung gilt +- **Daten**, die zu bescheinigenden Daten, wie Name, Berechtigungen usw. +- **Schema**, die ID des Schemas, das zur Interpretation der Daten verwendet wird. + +Aufgrund der dezentralen Natur von Ethereum kann jeder Benutzer Attestierungen erstellen. Die Identität des Attestierers ist wichtig, um zu bestimmen, welche Attestierungen wir als zuverlässig betrachten. + +## Einrichtung + +Der erste Schritt besteht darin, einen SAML-SP und einen SAML-IdP zu haben, die miteinander kommunizieren. + +1. Laden Sie die Software herunter. Die Beispielsoftware für diesen Artikel ist [auf GitHub](https://github.com/qbzzt/250420-saml-ethereum) verfügbar. Verschiedene Phasen werden in verschiedenen Branches gespeichert, für diese Phase benötigen Sie `saml-only` + + ```sh + git clone https://github.com/qbzzt/250420-saml-ethereum -b saml-only + cd 250420-saml-ethereum + pnpm install + ``` + +2. Erstellen Sie Schlüssel mit selbstsignierten Zertifikaten. Das bedeutet, dass der Schlüssel seine eigene Zertifizierungsstelle ist und manuell beim Dienstanbieter importiert werden muss. Weitere Informationen finden Sie in den [OpenSSL-Dokumenten](https://docs.openssl.org/master/man1/openssl-req/). + + ```sh + mkdir keys + cd keys + openssl req -new -x509 -days 365 -nodes -sha256 -out saml-sp.crt -keyout saml-sp.pem -subj /CN=sp/ + openssl req -new -x509 -days 365 -nodes -sha256 -out saml-idp.crt -keyout saml-idp.pem -subj /CN=idp/ + cd .. + ``` + +3. Starten Sie die Server (sowohl SP als auch IdP) + + ```sh + pnpm start + ``` + +4. Navigieren Sie zum SP unter der URL [http://localhost:3000/](http://localhost:3000/) und klicken Sie auf die Schaltfläche, um zum IdP (Port 3001) weitergeleitet zu werden. + +5. Geben Sie dem IdP Ihre E-Mail-Adresse und klicken Sie auf **Beim Dienstanbieter anmelden**. Sehen Sie, dass Sie zum Dienstanbieter (Port 3000) zurückgeleitet werden und dass dieser Sie anhand Ihrer E-Mail-Adresse erkennt. + +### Detaillierte Erklärung + +Folgendes geschieht Schritt für Schritt: + +![Normale SAML-Anmeldung ohne Ethereum](./fig-04-saml-no-eth.png) + +#### src/config.mts + +Diese Datei enthält die Konfiguration sowohl für den Identitätsanbieter als auch für den Dienstanbieter. Normalerweise wären dies zwei verschiedene Entitäten, aber hier können wir der Einfachheit halber Code gemeinsam nutzen. + +```typescript +const fs = await import("fs") + +const protocol="http" +``` + +Im Moment testen wir nur, daher ist die Verwendung von HTTP in Ordnung. + +```typescript +export const spCert = fs.readFileSync("keys/saml-sp.crt").toString() +export const idpCert = fs.readFileSync("keys/saml-idp.crt").toString() +``` + +Lesen Sie die öffentlichen Schlüssel, die normalerweise beiden Komponenten zur Verfügung stehen (und denen entweder direkt vertraut wird oder die von einer vertrauenswürdigen Zertifizierungsstelle signiert sind). + +```typescript +export const spPort = 3000 +export const spHostname = "localhost" +export const spDir = "sp" + +export const idpPort = 3001 +export const idpHostname = "localhost" +export const idpDir = "idp" + +export const spUrl = `${protocol}://${spHostname}:${spPort}/${spDir}` +export const idpUrl = `${protocol}://${idpHostname}:${idpPort}/${idpDir}` +``` + +Die URLs für beide Komponenten. + +```typescript +export const spPublicData = { +``` + +Die öffentlichen Daten für den Dienstanbieter. + +```typescript + entityID: `${spUrl}/metadata`, +``` + +Konventionell ist in SAML die `entityID` die URL, unter der die Metadaten der Entität verfügbar sind. Diese Metadaten entsprechen den hier vorliegenden öffentlichen Daten, außer dass sie in XML-Form vorliegen. + +```typescript + wantAssertionsSigned: true, + authnRequestsSigned: false, + signingCert: spCert, + allowCreate: true, + assertionConsumerService: [{ + Binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', + Location: `${spUrl}/assertion`, + }] + } +``` + +Die wichtigste Definition für unsere Zwecke ist der `assertionConsumerServer`. Das bedeutet, dass wir, um etwas gegenüber dem Dienstanbieter zu behaupten (z. B. „Der Benutzer, der Ihnen diese Informationen sendet, ist jemand@example.com“), einen [HTTP-POST](https://www.w3schools.com/tags/ref_httpmethods.asp) an die URL `http://localhost:3000/sp/assertion` verwenden müssen. + +```typescript +export const idpPublicData = { + entityID: `${idpUrl}/metadata`, + signingCert: idpCert, + wantAuthnRequestsSigned: false, + singleSignOnService: [{ + Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", + Location: `${idpUrl}/login` + }], + singleLogoutService: [{ + Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", + Location: `${idpUrl}/logout` + }], + } +``` + +Die öffentlichen Daten für den Identitätsanbieter sind ähnlich. Es gibt an, dass Sie zum Anmelden eines Benutzers einen POST an `http://localhost:3001/idp/login` und zum Abmelden eines Benutzers einen POST an `http://localhost:3001/idp/logout` senden. + +#### src/sp.mts + +Dies ist der Code, der einen Dienstanbieter implementiert. + +```typescript +import * as config from "./config.mts" +const fs = await import("fs") +const saml = await import("samlify") +``` + +Wir verwenden die Bibliothek [`samlify`](https://www.npmjs.com/package/samlify), um SAML zu implementieren. + +```typescript +import * as validator from "@authenio/samlify-node-xmllint" +saml.setSchemaValidator(validator) +``` + +Die `samlify`-Bibliothek erwartet ein Paket, das validiert, dass das XML korrekt ist, mit dem erwarteten öffentlichen Schlüssel signiert ist usw. Wir verwenden [`@authenio/samlify-node-xmllint`](https://www.npmjs.com/package/@authenio/samlify-node-xmllint) für diesen Zweck. + +```typescript +const express = (await import("express")).default +const spRouter = express.Router() +const app = express() +``` + +Ein [`express`](https://expressjs.com/)-[`Router`](https://expressjs.com/en/5x/api.html#router) ist eine „Mini-Website“, die innerhalb einer Website eingebunden werden kann. In diesem Fall verwenden wir ihn, um alle Definitionen des Dienstanbieters zusammenzufassen. + +```typescript +const spPrivateKey = fs.readFileSync("keys/saml-sp.pem").toString() + +const sp = saml.ServiceProvider({ + privateKey: spPrivateKey, + ...config.spPublicData +}) +``` + +Die Eigendarstellung des Dienstanbieters besteht aus allen öffentlichen Daten und dem privaten Schlüssel, den er zum Signieren von Informationen verwendet. + +```typescript +const idp = saml.IdentityProvider(config.idpPublicData); +``` + +Die öffentlichen Daten enthalten alles, was der Dienstanbieter über den Identitätsanbieter wissen muss. + +```typescript +spRouter.get(`/metadata`, + (req, res) => res.header("Content-Type", "text/xml").send(sp.getMetadata()) +) +``` + +Um die Interoperabilität mit anderen SAML-Komponenten zu ermöglichen, sollten Dienst- und Identitätsanbieter ihre öffentlichen Daten (die Metadaten) im XML-Format unter `/metadata` zur Verfügung stellen. + +```typescript +spRouter.post(`/assertion`, +``` + +Dies ist die Seite, auf die der Browser zugreift, um sich zu identifizieren. Die Zusicherung enthält die Benutzerkennung (hier verwenden wir die E-Mail-Adresse) und kann zusätzliche Attribute enthalten. Dies ist der Handler für Schritt 7 im obigen Sequenzdiagramm. + +```typescript + async (req, res) => { + // console.log(`SAML response:\n${Buffer.from(req.body.SAMLResponse, 'base64').toString('utf-8')}) +``` + +Sie können den auskommentierten Befehl verwenden, um die in der Zusicherung bereitgestellten XML-Daten zu sehen. Sie ist [Base64-kodiert](https://en.wikipedia.org/wiki/Base64). + +```typescript + try { + const loginResponse = await sp.parseLoginResponse(idp, 'post', req); +``` + +Analysieren Sie die Anmeldeanforderung vom Identitätsserver. + +```typescript + res.send(` + + +

Hallo ${loginResponse.extract.nameID}

+ + + `) + res.send(); +``` + +Senden Sie eine HTML-Antwort, nur um dem Benutzer zu zeigen, dass wir die Anmeldung erhalten haben. + +```typescript + } catch (err) { + console.error('Fehler bei der Verarbeitung der SAML-Antwort:', err); + res.status(400).send('SAML-Authentifizierung fehlgeschlagen'); + } + } +) +``` + +Informieren Sie den Benutzer im Falle eines Fehlers. + +```typescript +spRouter.get('/login', +``` + +Erstellen Sie eine Anmeldeanforderung, wenn der Browser versucht, diese Seite aufzurufen. Dies ist der Handler für Schritt 1 im obigen Sequenzdiagramm. + +```typescript + async (req, res) => { + const loginRequest = await sp.createLoginRequest(idp, "post") +``` + +Holen Sie sich die Informationen, um eine Anmeldeanforderung zu posten. + +```typescript + res.send(` + + + +``` + +Diese Seite sendet das Formular (siehe unten) automatisch ab. Auf diese Weise muss der Benutzer nichts tun, um weitergeleitet zu werden. Dies ist Schritt 2 im obigen Sequenzdiagramm. + +```typescript +
+``` + +Posten Sie an `loginRequest.entityEndpoint` (die URL des Endpunkts des Identitätsanbieters). + +```typescript + +``` + +Der Eingabename ist `loginRequest.type` (`SAMLRequest`). Der Inhalt für dieses Feld ist `loginRequest.context`, was wiederum XML ist, das Base64-kodiert ist. + +```typescript +
+ + + `) + } +) + +app.use(express.urlencoded({extended: true})) +``` + +[Diese Middleware](https://expressjs.com/en/5x/api.html#express.urlencoded) liest den Body der [HTTP-Anfrage](https://www.tutorialspoint.com/http/http_requests.htm). Standardmäßig ignoriert Express ihn, da die meisten Anfragen ihn nicht benötigen. Wir brauchen ihn, weil POST den Body verwendet. + +```typescript +app.use(`/${config.spDir}`, spRouter) +``` + +Binden Sie den Router im Verzeichnis des Dienstanbieters (`/sp`) ein. + +```typescript +app.get("/", (req, res) => { + res.send(` + + + + + + `) +}) +``` + +Wenn ein Browser versucht, das Stammverzeichnis aufzurufen, stellen Sie ihm einen Link zur Anmeldeseite zur Verfügung. + +```typescript +app.listen(config.spPort, () => { + console.log(`Dienstanbieter läuft auf http://${config.spHostname}:${config.spPort}`) +}) +``` + +Hören Sie mit dieser Express-Anwendung auf den `spPort`. + +#### src/idp.mts + +Dies ist der Identitätsanbieter. Er ist dem Dienstanbieter sehr ähnlich, die folgenden Erklärungen beziehen sich auf die Teile, die sich unterscheiden. + +```typescript +const xmlParser = new (await import("fast-xml-parser")).XMLParser( + { + ignoreAttributes: false, // Attribute beibehalten + attributeNamePrefix: "@_", // Präfix für Attribute + } +) +``` + +Wir müssen die XML-Anforderung, die wir vom Dienstanbieter erhalten, lesen und verstehen. + +```typescript +const getLoginPage = requestId => ` +``` + +Diese Funktion erstellt die Seite mit dem automatisch übermittelten Formular, das in Schritt 4 des obigen Sequenzdiagramms zurückgegeben wird. + +```typescript + + + Anmeldeseite + + +

Anmeldeseite

+
+ + E-Mail-Adresse: +
+ +``` + +Es gibt zwei Felder, die wir an den Dienstanbieter senden: + +1. Die `requestId`, auf die wir antworten. +2. Die Benutzerkennung (wir verwenden vorerst die E-Mail-Adresse, die der Benutzer angibt). + +```typescript +
+ + + +const idpRouter = express.Router() + +idpRouter.post("/loginSubmitted", async (req, res) => { + const loginResponse = await idp.createLoginResponse( +``` + +Dies ist der Handler für Schritt 5 des obigen Sequenzdiagramms. [`idp.createLoginResponse`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L73-L125) erstellt die Anmeldeantwort. + +```typescript + sp, + { + authnContextClassRef: 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport', + audience: sp.entityID, +``` + +Die Zielgruppe ist der Dienstanbieter. + +```typescript + extract: { + request: { + id: req.body.requestId + } + }, +``` + +Aus der Anfrage extrahierte Informationen. Der einzige Parameter, der uns in der Anfrage interessiert, ist die requestId, die es dem Dienstanbieter ermöglicht, Anfragen und deren Antworten zuzuordnen. + +```typescript + signingKey: { privateKey: idpPrivateKey, publicKey: config.idpCert } // Signierung sicherstellen +``` + +Wir benötigen `signingKey`, um die Daten zum Signieren der Antwort zu haben. Der Dienstanbieter vertraut keinen unsignierten Anfragen. + +```typescript + }, + "post", + { + email: req.body.email +``` + +Dies ist das Feld mit den Benutzerinformationen, die wir an den Dienstanbieter zurücksenden. + +```typescript + } + ); + + res.send(` + + + + +
+ +
+ + + `) +}) +``` + +Verwenden Sie erneut ein automatisch übermitteltes Formular. Dies ist Schritt 6 im obigen Sequenzdiagramm. + +```typescript + +// IdP-Endpunkt für Anmeldeanforderungen +idpRouter.post(`/login`, +``` + +Dies ist der Endpunkt, der eine Anmeldeanforderung vom Dienstanbieter empfängt. Dies ist der Handler für Schritt 3 des obigen Sequenzdiagramms. + +```typescript + async (req, res) => { + try { + // Workaround, weil ich parseLoginRequest nicht zum Laufen bringen konnte. + // const loginRequest = await idp.parseLoginRequest(sp, 'post', req) + const samlRequest = xmlParser.parse(Buffer.from(req.body.SAMLRequest, 'base64').toString('utf-8')) + res.send(getLoginPage(samlRequest["samlp:AuthnRequest"]["@_ID"])) +``` + +Wir sollten [`idp.parseLoginRequest`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L127-L144) verwenden können, um die ID der Authentifizierungsanforderung zu lesen. Ich konnte es jedoch nicht zum Laufen bringen und es war nicht wert, viel Zeit damit zu verbringen, also verwende ich einfach einen [allgemeinen XML-Parser](https://www.npmjs.com/package/fast-xml-parser). Die Information, die wir benötigen, ist das `ID`-Attribut innerhalb des ``-Tags, das sich auf der obersten Ebene des XML befindet. + +## Verwendung von Ethereum-Signaturen + +Nachdem wir nun eine Benutzeridentität an den Dienstanbieter senden können, besteht der nächste Schritt darin, die Benutzeridentität auf vertrauenswürdige Weise zu erhalten. Viem ermöglicht es uns, die Wallet einfach nach der Benutzeradresse zu fragen, aber das bedeutet, den Browser nach den Informationen zu fragen. Wir kontrollieren den Browser nicht, daher können wir der Antwort, die wir von ihm erhalten, nicht automatisch vertrauen. + +Stattdessen wird der IdP dem Browser eine zu signierende Zeichenfolge senden. Wenn die Wallet im Browser diese Zeichenfolge signiert, bedeutet dies, dass es sich wirklich um diese Adresse handelt (d. h. sie kennt den privaten Schlüssel, der der Adresse entspricht). + +Um dies in Aktion zu sehen, stoppen Sie den vorhandenen IdP und SP und führen Sie diese Befehle aus: + +```sh +git checkout eth-signatures +pnpm install +pnpm start +``` + +Navigieren Sie dann [zum SP](http://localhost:3000) und folgen Sie den Anweisungen. + +Beachten Sie, dass wir an dieser Stelle nicht wissen, wie wir die E-Mail-Adresse aus der Ethereum-Adresse erhalten, also melden wir stattdessen `@bad.email.address` an den SP. + +### Detaillierte Erklärung + +Die Änderungen befinden sich in den Schritten 4-5 des vorherigen Diagramms. + +![SAML mit einer Ethereum-Signatur](./fig-05-saml-w-signature.png) + +Die einzige Datei, die wir geändert haben, ist `idp.mts`. Hier sind die geänderten Teile. + +```typescript +import { v4 as uuidv4 } from 'uuid' +import { verifyMessage } from 'viem' +``` + +Wir benötigen diese beiden zusätzlichen Bibliotheken. Wir verwenden [`uuid`](https://www.npmjs.com/package/uuid), um den [Nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce)-Wert zu erstellen. Der Wert selbst spielt keine Rolle, nur die Tatsache, dass er nur einmal verwendet wird. + +Die Bibliothek [`viem`](https://viem.sh/) ermöglicht es uns, Ethereum-Definitionen zu verwenden. Hier benötigen wir sie, um zu überprüfen, ob die Signatur tatsächlich gültig ist. + +```typescript +const loginPrompt = "Um auf den Dienstanbieter zuzugreifen, signieren Sie diese Nonce: " +``` + +Die Wallet bittet den Benutzer um die Erlaubnis, die Nachricht zu signieren. Eine Nachricht, die nur eine Nonce ist, könnte Benutzer verwirren, daher fügen wir diese Aufforderung hinzu. + +```typescript +// requestIDs hier aufbewahren +let nonces = {} +``` + +Wir benötigen die Anfrageinformationen, um darauf antworten zu können. Wir könnten sie mit der Anfrage (Schritt 4) senden und sie zurückerhalten (Schritt 5). Wir können jedoch den Informationen, die wir vom Browser erhalten, nicht vertrauen, da dieser unter der Kontrolle eines potenziell feindseligen Benutzers steht. Daher ist es besser, sie hier mit der Nonce als Schlüssel zu speichern. + +Beachten Sie, dass wir dies der Einfachheit halber hier als Variable tun. Dies hat jedoch mehrere Nachteile: + +- Wir sind anfällig für einen Denial-of-Service-Angriff. Ein böswilliger Benutzer könnte versuchen, sich mehrmals anzumelden und so unseren Speicher zu füllen. +- Wenn der IdP-Prozess neu gestartet werden muss, verlieren wir die vorhandenen Werte. +- Wir können keinen Lastenausgleich über mehrere Prozesse durchführen, da jeder seine eigene Variable hätte. + +Auf einem Produktionssystem würden wir eine Datenbank verwenden und eine Art Ablaufmechanismus implementieren. + +```typescript +const getSignaturePage = requestId => { + const nonce = uuidv4() + nonces[nonce] = requestId +``` + +Erstellen Sie eine Nonce und speichern Sie die `requestId` für die zukünftige Verwendung. + +```typescript + return ` + + + + + +

Bitte signieren

+ +
+ + + +` +} +``` + +Der Rest ist nur Standard-HTML. + +```typescript +idpRouter.get("/signature/:nonce/:account/:signature", async (req, res) => { +``` + +Dies ist der Handler für Schritt 5 im Sequenzdiagramm. + +```typescript + const requestId = nonces[req.params.nonce] + if (requestId === undefined) { + res.send("Schlechte Nonce") + return ; + } + + nonces[req.params.nonce] = undefined +``` + +Holen Sie sich die Anfrage-ID und löschen Sie die Nonce aus den `nonces`, um sicherzustellen, dass sie nicht wiederverwendet werden kann. + +```typescript + try { +``` + +Da es so viele Möglichkeiten gibt, wie die Signatur ungültig sein kann, umschließen wir dies in einem `try ...` `catch`-Block, um alle geworfenen Fehler abzufangen. + +```typescript + const validSignature = await verifyMessage({ + address: req.params.account, + message: `${loginPrompt}${req.params.nonce}`, + signature: req.params.signature + }) +``` + +Verwenden Sie [`verifyMessage`](https://viem.sh/docs/actions/public/verifyMessage#verifymessage), um Schritt 5.5 im Sequenzdiagramm zu implementieren. + +```typescript + if (!validSignature) + throw("Schlechte Signatur") + } catch (err) { + res.send("Fehler:" + err) + return ; + } +``` + +Der Rest des Handlers ist äquivalent zu dem, was wir zuvor im `/loginSubmitted`-Handler getan haben, mit Ausnahme einer kleinen Änderung. + +```typescript + const loginResponse = await idp.createLoginResponse( + . + . + . + { + email: req.params.account + "@bad.email.address" + } + ); +``` + +Wir haben nicht die tatsächliche E-Mail-Adresse (wir werden sie im nächsten Abschnitt erhalten), also geben wir vorerst die Ethereum-Adresse zurück und kennzeichnen sie deutlich als keine E-Mail-Adresse. + +```typescript +// IdP-Endpunkt für Anmeldeanforderungen +idpRouter.post(`/login`, + async (req, res) => { + try { + // Workaround, weil ich parseLoginRequest nicht zum Laufen bringen konnte. + // const loginRequest = await idp.parseLoginRequest(sp, 'post', req) + const samlRequest = xmlParser.parse(Buffer.from(req.body.SAMLRequest, 'base64').toString('utf-8')) + res.send(getSignaturePage(samlRequest["samlp:AuthnRequest"]["@_ID"])) + } catch (err) { + console.error('Fehler bei der Verarbeitung der SAML-Antwort:', err); + res.status(400).send('SAML-Authentifizierung fehlgeschlagen'); + } + } +) +``` + +Verwenden Sie jetzt anstelle von `getLoginPage` `getSignaturePage` im Handler für Schritt 3. + +## Abrufen der E-Mail-Adresse + +Der nächste Schritt ist das Abrufen der E-Mail-Adresse, der vom Dienstanbieter angeforderten Kennung. Dazu verwenden wir den [Ethereum Attestation Service (EAS)](https://attest.org/). + +Der einfachste Weg, Attestierungen zu erhalten, ist die Verwendung der [GraphQL-API](https://docs.attest.org/docs/developer-tools/api). Wir verwenden diese Abfrage: + +``` +query GetAttestationsByRecipient { + attestations( + where: { + recipient: { equals: "${getAddress(ethAddr)}" } + schemaId: { equals: "0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977" } + } + take: 1 + ) { + data + id + attester + } +} +``` + +Diese [`schemaId`](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977) enthält nur eine E-Mail-Adresse. Diese Abfrage fragt nach Attestierungen dieses Schemas. Das Subjekt der Attestierung wird als `Empfänger` bezeichnet. Es ist immer eine Ethereum-Adresse. + +Warnung: Die Art und Weise, wie wir hier Attestierungen erhalten, hat zwei Sicherheitsprobleme. + +- Wir greifen auf den API-Endpunkt `https://optimism.easscan.org/graphql` zu, der eine zentralisierte Komponente ist. Wir können das `id`-Attribut erhalten und dann eine On-Chain-Abfrage durchführen, um zu überprüfen, ob eine Attestierung echt ist, aber der API-Endpunkt kann immer noch Attestierungen zensieren, indem er uns nicht darüber informiert. + + Dieses Problem ist nicht unlösbar, wir könnten unseren eigenen GraphQL-Endpunkt betreiben und die Attestierungen aus den Chain-Logs abrufen, aber das ist für unsere Zwecke übertrieben. + +- Wir schauen nicht auf die Identität des Attestierers. Jeder kann uns falsche Informationen liefern. In einer realen Implementierung hätten wir eine Reihe vertrauenswürdiger Attestierer und würden nur deren Attestierungen betrachten. + +Um dies in Aktion zu sehen, stoppen Sie den vorhandenen IdP und SP und führen Sie diese Befehle aus: + +```sh +git checkout email-address +pnpm install +pnpm start +``` + +Geben Sie dann Ihre E-Mail-Adresse an. Sie haben zwei Möglichkeiten, dies zu tun: + +- Importieren Sie eine Wallet mit einem privaten Schlüssel und verwenden Sie den privaten Testschlüssel `0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80`. + +- Fügen Sie eine Attestierung für Ihre eigene E-Mail-Adresse hinzu: + + 1. Navigieren Sie zu [dem Schema im Attestierungs-Explorer](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977). + + 2. Klicken Sie auf **Mit Schema attestieren**. + + 3. Geben Sie Ihre Ethereum-Adresse als Empfänger und Ihre E-Mail-Adresse als E-Mail-Adresse ein und wählen Sie **On-Chain**. Klicken Sie dann auf **Attestierung erstellen**. + + 4. Genehmigen Sie die Transaktion in Ihrer Wallet. Sie benötigen etwas ETH auf der [Optimism Blockchain](https://app.optimism.io/bridge/deposit), um für Gas zu bezahlen. + +So oder so, navigieren Sie danach zu [http://localhost:3000](http://localhost:3000) und folgen Sie den Anweisungen. Wenn Sie den privaten Testschlüssel importiert haben, lautet die E-Mail, die Sie erhalten, `test_addr_0@example.com`. Wenn Sie Ihre eigene Adresse verwendet haben, sollte es das sein, was Sie attestiert haben. + +### Detaillierte Erklärung + +![Von der Ethereum-Adresse zur E-Mail gelangen](./fig-06-saml-sig-n-email.png) + +Die neuen Schritte sind die GraphQL-Kommunikation, Schritte 5.6 und 5.7. + +Auch hier sind die geänderten Teile von `idp.mts`. + +```typescript +import { GraphQLClient } from 'graphql-request' +import { SchemaEncoder } from '@ethereum-attestation-service/eas-sdk' +``` + +Importieren Sie die Bibliotheken, die wir benötigen. + +```typescript +const graphqlEndpointUrl = "https://optimism.easscan.org/graphql" +``` + +Es gibt [einen separaten Endpunkt für jede Blockchain](https://docs.attest.org/docs/developer-tools/api). + +```typescript +const graphqlClient = new GraphQLClient(graphqlEndpointUrl, { fetch }) +``` + +Erstellen Sie einen neuen `GraphQLClient`-Client, den wir zur Abfrage des Endpunkts verwenden können. + +```typescript +const graphqlSchema = 'string emailAddress' +const graphqlEncoder = new SchemaEncoder(graphqlSchema) +``` + +GraphQL gibt uns nur ein undurchsichtiges Datenobjekt mit Bytes. Um es zu verstehen, benötigen wir das Schema. + +```typescript +const ethereumAddressToEmail = async ethAddr => { +``` + +Eine Funktion, um von einer Ethereum-Adresse zu einer E-Mail-Adresse zu gelangen. + +```typescript + const query = ` + query GetAttestationsByRecipient { +``` + +Dies ist eine GraphQL-Abfrage. + +```typescript + Attestierungen( +``` + +Wir suchen nach Attestierungen. + +```typescript + where: { + recipient: { equals: "${getAddress(ethAddr)}" } + schemaId: { equals: "0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977" } + } +``` + +Die Attestierungen, die wir wollen, sind diejenigen in unserem Schema, bei denen der Empfänger `getAddress(ethAddr)` ist. Die Funktion [`getAddress`](https://viem.sh/docs/utilities/getAddress#getaddress) stellt sicher, dass unsere Adresse die korrekte [Prüfsumme](https://github.com/ethereum/ercs/blob/master/ERCS/erc-55.md) hat. Dies ist notwendig, da bei GraphQL die Groß- und Kleinschreibung beachtet wird. "0xBAD060A7", "0xBad060A7" und "0xbad060a7" sind verschiedene Werte. + +```typescript + take: 1 +``` + +Unabhängig davon, wie viele Attestierungen wir finden, wollen wir nur die erste. + +```typescript + ) { + data + id + attester + } + }` +``` + +Die Felder, die wir empfangen wollen. + +- `attester`: Die Adresse, die die Attestierung eingereicht hat. Normalerweise wird dies verwendet, um zu entscheiden, ob der Attestierung vertraut werden soll oder nicht. +- `id`: Die Attestierungs-ID. Sie können diesen Wert verwenden, um [die Attestierung On-Chain zu lesen](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000021?tab=read_proxy&source_address=0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088#0xa3112a64) und zu überprüfen, ob die Informationen aus der GraphQL-Abfrage korrekt sind. +- `data`: Die Schemadaten (in diesem Fall die E-Mail-Adresse). + +```typescript + const queryResult = await graphqlClient.request(query) + + if (queryResult.attestations.length == 0) + return "no_address@available.is" +``` + +Wenn keine Attestierung vorhanden ist, geben Sie einen Wert zurück, der offensichtlich falsch ist, aber für den Dienstanbieter gültig erscheinen würde. + +```typescript + const attestationDataFields = graphqlEncoder.decodeData(queryResult.attestations[0].data) + return attestationDataFields[0].value.value +} +``` + +Wenn ein Wert vorhanden ist, verwenden Sie `decodeData`, um die Daten zu dekodieren. Wir benötigen nicht die Metadaten, die es bereitstellt, sondern nur den Wert selbst. + +```typescript + const loginResponse = await idp.createLoginResponse( + sp, + { + . + . + . + }, + "post", + { + email: await ethereumAddressToEmail(req.params.account) + } + ); +``` + +Verwenden Sie die neue Funktion, um die E-Mail-Adresse abzurufen. + +## Was ist mit der Dezentralisierung? + +In dieser Konfiguration können sich Benutzer nicht als jemand ausgeben, der sie nicht sind, solange wir uns auf vertrauenswürdige Attestierer für die Zuordnung von Ethereum- zu E-Mail-Adressen verlassen. Unser Identitätsanbieter ist jedoch immer noch eine zentralisierte Komponente. Wer den privaten Schlüssel des Identitätsanbieters besitzt, kann falsche Informationen an den Dienstanbieter senden. + +Es könnte eine Lösung geben, die [Mehrparteienberechnung (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) verwendet. Ich hoffe, in einem zukünftigen Tutorial darüber zu schreiben. + +## Zusammenfassung + +Die Einführung eines Anmeldestandards wie Ethereum-Signaturen steht vor einem Henne-Ei-Problem. Dienstanbieter wollen den größtmöglichen Markt ansprechen. Benutzer möchten auf Dienste zugreifen können, ohne sich Gedanken über die Unterstützung ihres Anmeldestandards machen zu müssen. +Die Erstellung von Adaptern, wie z. B. einem Ethereum-IdP, kann uns helfen, diese Hürde zu überwinden. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). diff --git a/public/content/translations/de/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md b/public/content/translations/de/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md new file mode 100644 index 00000000000..8396f5b36e0 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md @@ -0,0 +1,156 @@ +--- +title: Erste Schritte in der Ethereum-Entwicklung +description: "Dies ist ein Leitfaden für Einsteiger in die Ethereum-Entwicklung. Wir führen dich vom Einrichten eines API-Endpunkts über eine Befehlszeilenanforderung bis hin zum Schreiben deines ersten Web3-Skripts! Es sind keine Vorkenntnisse in der Blockchain-Entwicklung erforderlich!" +author: "Elan Halpern" +tags: + [ + "javascript", + "ethers.js", + "Nodes", + "Abfragen", + "Alchemy" + ] +skill: beginner +lang: de +published: 2020-10-30 +source: Mittel +sourceUrl: https://medium.com/alchemy-api/getting-started-with-ethereum-development-using-alchemy-c3d6a45c567f +--- + +![Logos von Ethereum und Alchemy](./ethereum-alchemy.png) + +Dies ist ein Anfängerleitfaden für den Einstieg in die Ethereum-Entwicklung. Für dieses Tutorial verwenden wir [Alchemy](https://alchemyapi.io/), die führende Blockchain-Entwicklerplattform, die Millionen von Nutzern von 70 % der Top-Blockchain-Apps wie Maker, 0x, MyEtherWallet, Dharma und Kyber antreibt. Alchemy gibt uns Zugriff auf einen API-Endpunkt auf der Ethereum-Chain, damit wir Transaktionen lesen und schreiben können. + +Wir zeigen dir alle Schritte von der Anmeldung bei Alchemy bis hin zum Schreiben deines ersten Web3-Skripts! Es sind keine Vorkenntnisse in der Blockchain-Entwicklung erforderlich! + +## 1. Registriere dich für ein kostenloses Alchemy-Konto {#sign-up-for-a-free-alchemy-account} + +Ein Konto bei Alchemy zu erstellen ist einfach, [registriere dich hier kostenlos](https://auth.alchemy.com/). + +## 2. Erstelle eine Alchemy-App {#create-an-alchemy-app} + +Um mit der Ethereum-Chain zu kommunizieren und die Produkte von Alchemy zu nutzen, benötigst du einen API-Schlüssel, um deine Anfragen zu authentifizieren. + +Du kannst [API-Schlüssel über das Dashboard erstellen](https://dashboard.alchemy.com/). Um einen neuen Schlüssel zu erstellen, navigiere zu „App erstellen“, wie unten gezeigt: + +Besonderer Dank an [_ShapeShift_](https://shapeshift.com/), _dass wir ihr Dashboard zeigen dürfen!_ + +![Alchemy-Dashboard](./alchemy-dashboard.png) + +Fülle die Details unter „App erstellen“ aus, um deinen neuen Schlüssel zu erhalten. Hier kannst du auch Apps sehen, die du zuvor erstellt hast, und solche, die von deinem Team erstellt wurden. Bestehende Schlüssel rufst du ab, indem du bei einer beliebigen App auf „Schlüssel anzeigen“ klickst. + +![Screenshot der App-Erstellung mit Alchemy](./create-app.png) + +Du kannst auch bestehende API-Schlüssel abrufen, indem du mit der Maus über „Apps“ fährst und eine auswählst. Hier kannst du den „Schlüssel anzeigen“ sowie die „App bearbeiten“, um bestimmte Domains auf die Whitelist zu setzen, mehrere Entwicklertools anzuzeigen und Analysen einzusehen. + +![Gif, das zeigt, wie ein Nutzer API-Schlüssel abruft](./pull-api-keys.gif) + +## 3. Eine Anfrage über die Befehlszeile stellen {#make-a-request-from-the-command-line} + +Interagiere mit der Ethereum-Blockchain über Alchemy mithilfe von JSON-RPC und curl. + +Für manuelle Anfragen empfehlen wir die Interaktion mit `JSON-RPC` über `POST`-Anfragen. Übergebe einfach den Header `Content-Type: application/json` und deine Anfrage als `POST`-Body mit den folgenden Feldern: + +- `jsonrpc`: Die JSON-RPC-Version – derzeit wird nur `2.0` unterstützt. +- `method`: Die ETH-API-Methode. [Siehe API-Referenz.](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc) +- `params`: Eine Liste von Parametern, die an die Methode übergeben werden. +- `id`: Die ID deiner Anfrage. Wird mit der Antwort zurückgegeben, damit du verfolgen kannst, zu welcher Anfrage eine Antwort gehört. + +Hier ist ein Beispiel, das du in der Befehlszeile ausführen kannst, um den aktuellen Gaspreis abzurufen: + +```bash +curl https://eth-mainnet.alchemyapi.io/v2/demo \ +-X POST \ +-H "Content-Type: application/json" \ +-d '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}' +``` + +_**HINWEIS:** Ersetze [https://eth-mainnet.alchemyapi.io/v2/demo](https://eth-mainnet.alchemyapi.io/jsonrpc/demo) durch deinen eigenen API-Schlüssel `https://eth-mainnet.alchemyapi.io/v2/**your-api-key`._ + +**Ergebnisse:** + +```json +{ "id": 73,"jsonrpc": "2.0","result": "0x09184e72a000" // 10000000000000 } +``` + +## 4. Richte deinen Web3-Client ein {#set-up-your-web3-client} + +**Wenn du bereits einen Client hast,** ändere die URL deines aktuellen Node Providers in eine Alchemy-URL mit deinem API-Schlüssel: `"https://eth-mainnet.alchemyapi.io/v2/your-api-key"` + +**_HINWEIS:_** Die folgenden Skripte müssen in einem **Node-Kontext** ausgeführt oder **in einer Datei gespeichert werden**, nicht über die Befehlszeile. Wenn du Node oder npm noch nicht installiert hast, sieh dir diese kurze [Einrichtungsanleitung für Macs](https://app.gitbook.com/@alchemyapi/s/alchemy/guides/alchemy-for-macs) an. + +Es gibt eine Vielzahl von [Web3-Bibliotheken](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries), die du mit Alchemy integrieren kannst. Wir empfehlen jedoch [Alchemy Web3](https://docs.alchemy.com/reference/api-overview) zu verwenden, einen Drop-in-Ersatz für web3.js, der für die nahtlose Zusammenarbeit mit Alchemy entwickelt und konfiguriert wurde. Dies bietet mehrere Vorteile, wie z. B. automatische Wiederholungsversuche und eine robuste WebSocket-Unterstützung. + +Um AlchemyWeb3.js zu installieren, **navigiere zu deinem Projektverzeichnis** und führe aus: + +**Mit Yarn:** + +``` +yarn add @alch/alchemy-web3 +``` + +**Mit NPM:** + +``` +npm install @alch/alchemy-web3 +``` + +Um mit der Knoten-Infrastruktur von Alchemy zu interagieren, führe dies in NodeJS aus oder füge es zu einer JavaScript-Datei hinzu: + +```js +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3( + "https://eth-mainnet.alchemyapi.io/v2/your-api-key" +) +``` + +## 5. Schreibe dein erstes Web3-Skript! {#write-your-first-web3-script} + +Machen wir uns nun mit ein wenig Web3-Programmierung die Hände schmutzig und schreiben ein einfaches Skript, das die neueste Blocknummer aus dem Ethereum Mainnet ausgibt. + +**1. Wenn du es noch nicht getan hast, erstelle in deinem Terminal ein neues Projektverzeichnis und wechsle mit cd hinein:** + +``` +mkdir web3-example +cd web3-example +``` + +**2. Installiere die Alchemy Web3 (oder eine andere Web3) Abhängigkeit in deinem Projekt, falls du dies noch nicht getan hast:** + +``` +npm install @alch/alchemy-web3 +``` + +**3. Erstelle eine Datei namens `index.js` und füge den folgenden Inhalt hinzu:** + +> Du solltest `demo` schlussendlich durch deinen Alchemy HTTP-API-Schlüssel ersetzen. + +```js +async function main() { + const { createAlchemyWeb3 } = require("@alch/alchemy-web3") + const web3 = createAlchemyWeb3("https://eth-mainnet.alchemyapi.io/v2/demo") + const blockNumber = await web3.eth.getBlockNumber() + console.log("Die letzte Blocknummer ist " + blockNumber) +} +main() +``` + +Noch nicht mit async/await vertraut? Sieh dir diesen [Medium-Beitrag](https://medium.com/better-programming/understanding-async-await-in-javascript-1d81bb079b2c) an. + +**4. Führe es mit node in deinem Terminal aus** + +``` +node index.js +``` + +**5. Du solltest jetzt die neueste Blocknummer in deiner Konsole ausgegeben sehen!** + +``` +Die letzte Blocknummer ist 11043912 +``` + +**Woo!** Glückwunsch! Du hast soeben dein erstes Web3-Skript mit Alchemy geschrieben 🎉\*\* + +Du weißt nicht, was du als Nächstes tun sollst? Versuche, deinen ersten Smart Contract bereitzustellen und versuche dich an der Solidity-Programmierung in unserem [Hello World Smart Contract Guide](https://www.alchemy.com/docs/hello-world-smart-contract), oder teste dein Dashboard-Wissen mit der [Dashboard Demo App](https://docs.alchemyapi.io/tutorials/demo-app)! + +_[Registriere dich kostenlos bei Alchemy](https://auth.alchemy.com/), sieh dir unsere [Dokumentation](https://www.alchemy.com/docs/) an und folge uns für die neuesten Nachrichten auf [Twitter](https://twitter.com/AlchemyPlatform)_. diff --git a/public/content/translations/de/developers/tutorials/guide-to-smart-contract-security-tools/index.md b/public/content/translations/de/developers/tutorials/guide-to-smart-contract-security-tools/index.md new file mode 100644 index 00000000000..32c6770712e --- /dev/null +++ b/public/content/translations/de/developers/tutorials/guide-to-smart-contract-security-tools/index.md @@ -0,0 +1,102 @@ +--- +title: Ein Leitfaden für Smart-Contract-Sicherheitstools +description: Ein Überblick über drei verschiedene Test- und Programmanalysetechniken +author: "Spuren von bits" +lang: de +tags: [ "solidity", "intelligente Verträge", "Sicherheit" ] +skill: intermediate +published: 07.09.2020 +source: Aufbau sicherer Verträge +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis +--- + +Wir werden drei verschiedene Test- und Programmanalysetechniken verwenden: + +- **Statische Analyse mit [Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/).** Alle Pfade des Programms werden gleichzeitig durch verschiedene Programmdarstellungen (z. B. Kontrollflussgraph) angenähert und analysiert. +- **Fuzzing mit [Echidna](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/).** Der Code wird mit einer pseudozufälligen Generierung von Transaktionen ausgeführt. Der Fuzzer versucht, eine Folge von Transaktionen zu finden, die eine bestimmte Eigenschaft verletzen. +- **Symbolische Ausführung mit [Manticore](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/).** Eine formale Verifikationstechnik, die jeden Ausführungspfad in eine mathematische Formel übersetzt, anhand derer Einschränkungen überprüft werden können. + +Jede Technik hat ihre Vor- und Nachteile und ist in [bestimmten Fällen](#determining-security-properties) nützlich: + +| Technik | Werkzeug | Verwendung | Geschwindigkeit | Übersehene Fehler | Fehlalarme | +| ---------------------- | --------- | ---------------------------------------------------- | --------------- | ----------------- | ---------- | +| Statische Analyse | Slither | CLI & Skripte | Sekunden | moderat | gering | +| Fuzzing | Echidna | Solidity-Eigenschaften | Minuten | gering | keine | +| Symbolische Ausführung | Manticore | Solidity-Eigenschaften & Skripte | Stunden | keine\* | keine | + +- wenn alle Pfade ohne Zeitüberschreitung untersucht werden + +**Slither** analysiert Verträge innerhalb von Sekunden, allerdings kann eine statische Analyse zu Fehlalarmen führen und ist für komplexe Prüfungen (z. B. arithmetische Prüfungen) weniger geeignet. Führe Slither über die API aus, um per Knopfdruck auf integrierte Detektoren zuzugreifen, oder über die API für benutzerdefinierte Prüfungen. + +**Echidna** muss einige Minuten lang laufen und erzeugt nur echte Positiv-Ergebnisse. Echidna überprüft vom Benutzer bereitgestellte Sicherheitseigenschaften, die in Solidity geschrieben sind. Es können Fehler übersehen werden, da es auf einer zufälligen Untersuchung basiert. + +**Manticore** führt die "tiefgreifendste" Analyse durch. Wie Echidna verifiziert auch Manticore vom Benutzer bereitgestellte Eigenschaften. Die Ausführung dauert länger, aber es kann die Gültigkeit einer Eigenschaft beweisen und meldet keine Fehlalarme. + +## Empfohlener Arbeitsablauf {#suggested-workflow} + +Beginne mit den integrierten Detektoren von Slither, um sicherzustellen, dass jetzt und in Zukunft keine einfachen Fehler vorhanden sind. Verwende Slither, um Eigenschaften im Zusammenhang mit Vererbung, Variablenabhängigkeiten und strukturellen Problemen zu überprüfen. Wenn die Codebasis wächst, verwende Echidna, um komplexere Eigenschaften des Zustandsautomaten zu testen. Greife erneut auf Slither zurück, um benutzerdefinierte Prüfungen für Schutzmaßnahmen zu entwickeln, die in Solidity nicht verfügbar sind, wie z. B. den Schutz vor dem Überschreiben einer Funktion. Verwende schließlich Manticore, um eine gezielte Überprüfung kritischer Sicherheitseigenschaften durchzuführen, z. B. arithmetische Operationen. + +- Verwende die CLI von Slither, um häufige Probleme zu finden. +- Verwende Echidna, um übergeordnete Sicherheitseigenschaften deines Vertrags zu testen. +- Verwende Slither, um benutzerdefinierte statische Prüfungen zu schreiben. +- Verwende Manticore, wenn du eine tiefgehende Absicherung kritischer Sicherheitseigenschaften wünschst. + +**Ein Hinweis zu Unit-Tests**. Unit-Tests sind notwendig, um qualitativ hochwertige Software zu erstellen. Diese Techniken sind jedoch nicht am besten geeignet, um Sicherheitslücken zu finden. Sie werden typischerweise verwendet, um das positive Verhalten von Code zu testen (d. h. der Code funktioniert im normalen Kontext wie erwartet), während Sicherheitslücken eher in Grenzfällen auftreten, die die Entwickler nicht bedacht haben. In unserer Untersuchung von Dutzenden von Smart-Contract-Sicherheitsüberprüfungen hatte die [Unit-Test-Abdeckung keine Auswirkung auf die Anzahl oder den Schweregrad der Sicherheitslücken](https://blog.trailofbits.com/2019/08/08/246-findings-from-our-smart-contract-audits-an-executive-summary/), die wir im Code unserer Kunden fanden. + +## Bestimmung von Sicherheitseigenschaften {#determining-security-properties} + +Um deinen Code effektiv zu testen und zu verifizieren, musst du die Bereiche identifizieren, die Aufmerksamkeit erfordern. Da deine für die Sicherheit aufgewendeten Ressourcen begrenzt sind, ist es wichtig, die schwachen oder hochwertigen Teile deiner Codebasis zu bestimmen, um deinen Aufwand zu optimieren. Bedrohungsmodellierung kann dabei helfen. Ziehe Folgendes in Betracht: + +- [Rapid Risk Assessments](https://infosec.mozilla.org/guidelines/risk/rapid_risk_assessment.html) (unser bevorzugter Ansatz bei Zeitmangel) +- [Guide to Data-Centric System Threat Modeling](https://csrc.nist.gov/pubs/sp/800/154/ipd) (alias NIST 800-154) +- [Shostack Threat Modeling](https://www.amazon.com/Threat-Modeling-Designing-Adam-Shostack/dp/1118809998) +- [STRIDE](https://wikipedia.org/wiki/STRIDE_\(security\)) / [DREAD](https://wikipedia.org/wiki/DREAD_\(risk_assessment_model\)) +- [PASTA](https://wikipedia.org/wiki/Threat_model#P.A.S.T.A.) +- [Verwendung von Assertions](https://blog.regehr.org/archives/1091) + +### Komponenten {#components} + +Wenn du weißt, was du überprüfen willst, hilft dir das auch bei der Auswahl des richtigen Tools. + +Die allgemeinen Bereiche, die für Smart Contracts häufig relevant sind, umfassen: + +- **Zustandsautomat.** Die meisten Verträge lassen sich als Zustandsautomat darstellen. Überlege zu prüfen, ob (1) kein ungültiger Zustand erreicht werden kann, (2) ein gültiger Zustand erreicht werden kann und (3) kein Zustand den Vertrag blockiert. + + - Echidna und Manticore sind die zu bevorzugenden Tools, um die Spezifikationen von Zustandsautomaten zu testen. + +- **Zugriffskontrollen.** Wenn dein System privilegierte Benutzer hat (z. B. einen Eigentümer, Controller, ...) musst du sicherstellen, dass (1) jeder Benutzer nur die autorisierten Aktionen durchführen kann und (2) kein Benutzer Aktionen eines privilegierteren Benutzers blockieren kann. + + - Slither, Echidna und Manticore können korrekte Zugriffskontrollen überprüfen. Slither kann zum Beispiel überprüfen, dass nur bei Funktionen auf der Whitelist der onlyOwner-Modifikator fehlt. Echidna und Manticore sind für komplexere Zugriffskontrollen nützlich, z. B. für eine Berechtigung, die nur erteilt wird, wenn der Vertrag einen bestimmten Zustand erreicht. + +- **Arithmetische Operationen.** Die Überprüfung der Korrektheit der arithmetischen Operationen ist entscheidend. Die durchgängige Verwendung von `SafeMath` ist ein guter Schritt, um Über- und Unterläufe zu verhindern. Dennoch musst du andere arithmetische Fehler berücksichtigen, einschließlich Rundungsfehler und Fehler, die den Vertrag blockieren. + + - Manticore ist hier die beste Wahl. Echidna kann verwendet werden, wenn die Arithmetik außerhalb des Bereichs des SMT-Solvers liegt. + +- **Korrektheit der Vererbung.** Solidity-Verträge stützen sich stark auf Mehrfachvererbung. Fehler wie eine überschattende Funktion, bei der ein `super`-Aufruf fehlt, und eine falsch interpretierte c3-Linearisierungsreihenfolge können leicht entstehen. + + - Slither ist das Tool, um die Erkennung dieser Probleme sicherzustellen. + +- **Externe Interaktionen.** Verträge interagieren miteinander, und einigen externen Verträgen sollte man nicht vertrauen. Wenn dein Vertrag zum Beispiel von externen Orakeln abhängt, bleibt er dann sicher, wenn die Hälfte der verfügbaren Orakel kompromittiert ist? + + - Manticore und Echidna sind die beste Wahl, um externe Interaktionen mit deinen Verträgen zu testen. Manticore verfügt über einen eingebauten Mechanismus, um externe Verträge zu stubben. + +- **Standardkonformität.** Ethereum-Standards (z. B. ERC20) weisen in ihrer Entwurfsgeschichte immer wieder Fehler auf. Sei dir der Einschränkungen des Standards bewusst, auf dem du aufbaust. + - Slither, Echidna und Manticore helfen dir dabei, Abweichungen von einem bestimmten Standard zu erkennen. + +### Spickzettel zur Werkzeugauswahl {#tool-selection-cheatsheet} + +| Komponente | Tools | Beispiele | +| ------------------------- | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Zustandsautomat | Echidna, Manticore | | +| Zugriffskontrolle | Slither, Echidna, Manticore | [Slither-Übung 2](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise2.md), [Echidna-Übung 2](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-2.md) | +| Arithmetische Operationen | Manticore, Echidna | [Echidna-Übung 1](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-1.md), [Manticore-Übungen 1 - 3](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore/exercises) | +| Korrektheit der Vererbung | Slither | [Slither-Übung 1](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise1.md) | +| Externe Interaktionen | Manticore, Echidna | | +| Standardkonformität | Slither, Echidna, Manticore | [`slither-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) | + +Je nach deinen Zielen müssen auch andere Bereiche überprüft werden, aber diese grob umrissenen Schwerpunktbereiche sind ein guter Anfang für jedes Smart-Contract-System. + +Unsere öffentlichen Audits enthalten Beispiele für verifizierte oder getestete Eigenschaften. Lies die Abschnitte `Automated Testing and Verification` der folgenden Berichte, um dir Sicherheitseigenschaften aus der Praxis anzusehen: + +- [0x](https://github.com/trailofbits/publications/blob/master/reviews/0x-protocol.pdf) +- [Balancer](https://github.com/trailofbits/publications/blob/master/reviews/BalancerCore.pdf) diff --git a/public/content/translations/de/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/de/developers/tutorials/hello-world-smart-contract-fullstack/index.md new file mode 100644 index 00000000000..82a4f3c33ff --- /dev/null +++ b/public/content/translations/de/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -0,0 +1,1543 @@ +--- +title: Hello World Smart-Contract für Einsteiger – Fullstack +description: Einführungstutorial zum Schreiben und Bereitstellen eines einfachen Smart Contracts auf Ethereum. +author: "nstrike2" +tags: + [ + "solidity", + "Hardhat", + "Alchemy", + "intelligente Verträge", + "Bereitstellung", + "Block-Explorer", + "Frontend", + "Transaktionen" + ] +skill: beginner +lang: de +published: 2021-10-25 +--- + +Dieser Leitfaden ist für Sie, wenn Sie neu in der Blockchain-Entwicklung sind und nicht wissen, wo Sie anfangen sollen oder wie Sie Smart Contracts bereitstellen und mit ihnen interagieren können. Wir werden die Erstellung und Bereitstellung eines einfachen Smart Contracts im Goerli-Testnet unter Verwendung von [MetaMask](https://metamask.io), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org) und [Alchemy](https://alchemy.com/eth) durchgehen. + +Sie benötigen ein Alchemy-Konto, um dieses Tutorial abzuschließen. [Registrieren Sie sich für ein kostenloses Konto](https://www.alchemy.com/). + +Wenn Sie zu irgendeinem Zeitpunkt Fragen haben, können Sie sich gerne im [Alchemy Discord](https://discord.gg/gWuC7zB) melden! + +## Teil 1 – Erstellen und Bereitstellen Ihres Smart Contracts mit Hardhat {#part-1} + +### Verbindung mit dem Ethereum-Netzwerk herstellen {#connect-to-the-ethereum-network} + +Es gibt viele Möglichkeiten, Anfragen an die Ethereum-Chain zu stellen. Der Einfachheit halber verwenden wir ein kostenloses Konto bei Alchemy, einer Blockchain-Entwicklerplattform und API, die es uns ermöglicht, mit der Ethereum-Chain zu kommunizieren, ohne selbst einen Node betreiben zu müssen. Alchemy verfügt auch über Entwickler-Tools für Monitoring und Analytik; wir werden diese in diesem Tutorial nutzen, um zu verstehen, was bei der Bereitstellung unseres Smart Contracts „unter der Haube“ passiert. + +### Erstellen Sie Ihre App und Ihren API-Schlüssel {#create-your-app-and-api-key} + +Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel generieren, indem Sie eine App erstellen. Damit können Sie Anfragen an das Goerli-Testnet stellen. Wenn Sie mit Testnets nicht vertraut sind, können Sie [Alchemys Leitfaden zur Auswahl eines Netzwerks](https://www.alchemy.com/docs/choosing-a-web3-network) lesen. + +Suchen Sie auf dem Alchemy-Dashboard das Dropdown-Menü **Apps** in der Navigationsleiste und klicken Sie auf **App erstellen**. + +![Hallo Welt App erstellen](./hello-world-create-app.png) + +Geben Sie Ihrer App den Namen „_Hello World_“ und schreiben Sie eine kurze Beschreibung. Wählen Sie **Staging** als Ihre Umgebung und **Goerli** als Ihr Netzwerk. + +![App-Ansicht erstellen Hallo Welt](./create-app-view-hello-world.png) + +_Hinweis: Wählen Sie unbedingt **Goerli** aus, sonst funktioniert dieses Tutorial nicht._ + +Klicken Sie auf **App erstellen**. Ihre App wird in der folgenden Tabelle angezeigt. + +### Ein Ethereum-Konto erstellen {#create-an-ethereum-account} + +Sie benötigen ein Ethereum-Konto, um Transaktionen zu senden und zu empfangen. Wir verwenden MetaMask, eine virtuelle Wallet im Browser, mit der Benutzer ihre Ethereum-Kontoadresse verwalten können. + +Sie können MetaMask [hier](https://metamask.io/download) kostenlos herunterladen und ein Konto erstellen. Wenn Sie ein Konto erstellen oder bereits eines haben, stellen Sie sicher, dass Sie oben rechts zum „Goerli Test Network“ wechseln (damit wir nicht mit echtem Geld arbeiten). + +### Schritt 4: Ether von einem Faucet hinzufügen {#step-4-add-ether-from-a-faucet} + +Um Ihren Smart Contract im Testnet bereitzustellen, benötigen Sie einige Fake-ETH. Um ETH im Goerli-Netzwerk zu erhalten, gehen Sie zu einem Goerli-Faucet und geben Sie Ihre Goerli-Kontoadresse ein. Beachten Sie, dass Goerli-Faucets in letzter Zeit etwas unzuverlässig sein können – auf der [Seite der Testnets](/developers/docs/networks/#goerli) finden Sie eine Liste mit Optionen, die Sie ausprobieren können: + +_Hinweis: Aufgrund von Netzwerküberlastung kann dies eine Weile dauern._ +\`\` + +### Schritt 5: Überprüfen Sie Ihr Guthaben {#step-5-check-your-balance} + +Um zu überprüfen, ob sich die ETH in Ihrer Wallet befinden, stellen wir eine [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)-Anfrage mit dem [Composer-Tool von Alchemy](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Das gibt den ETH-Betrag in unserem Wallet wieder. Um mehr zu erfahren, sehen Sie sich [Alchemys kurzes Tutorial zur Verwendung des Composer-Tools](https://youtu.be/r6sjRxBZJuU) an. + +Geben Sie Ihre MetaMask-Kontoadresse ein und klicken Sie auf **Anfrage senden**. Sie sehen eine Antwort, die wie der folgende Codeausschnitt aussieht. + +```json +{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" } +``` + +> _HINWEIS: Dieses Ergebnis ist in wei, nicht in ETH, angegeben._ Wei ist die kleinste Einheit von Ether._ + +Puh! Unser Falschgeld ist da. + +### Schritt 6: Initialisieren unseres Projekts {#step-6-initialize-our-project} + +Zunächst müssen wir einen Ordner für unser Projekt erstellen. Navigieren Sie zu Ihrer Kommandozeile und geben Sie Folgendes ein. + +``` +mkdir hello-world +cd hello-world +``` + +Da wir uns nun in unserem Projektordner befinden, verwenden wir `npm init`, um das Projekt zu initialisieren. + +> Wenn Sie npm noch nicht installiert haben, befolgen Sie [diese Anweisungen zur Installation von Node.js und npm](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm). + +Für den Zweck dieses Tutorials spielt es keine Rolle, wie Sie die Initialisierungsfragen beantworten. Hier ist, wie wir es als Referenz gemacht haben: + +``` +package name: (hello-world) +version: (1.0.0) +description: hallo Welt Smart Contract +entry point: (index.js) +test command: +git repository: +keywords: +author: +license: (ISC) + +About to write to /Users/.../.../.../hello-world/package.json: + +{ + "name": "hello-world", + "version": "1.0.0", + "description": "hallo Welt Smart Contract", + "main": "index.js", + "scripts": { + "test": "echo \"Fehler: kein Test angegeben\" && exit 1" + }, + "author": "", + "license": "ISC" +} +``` + +Bestätigen Sie die package.json und schon kann es losgehen! + +### Schritt 7: Hardhat herunterladen {#step-7-download-hardhat} + +Hardhat ist eine Entwicklungsumgebung zum Kompilieren, Bereitstellen, Testen und Debuggen Ihrer Ethereum-Software. Es hilft Entwicklern Smart Contracts und dApps lokal zu erstellen, bevor diese auf der Live-Chain bereitgestellt werden. + +Führen Sie in unserem `hello-world`-Projekt Folgendes aus: + +``` +npm install --save-dev hardhat +``` + +Weitere Details zu den [Installationsanweisungen](https://hardhat.org/getting-started/#overview) finden Sie auf dieser Seite. + +### Schritt 8: Hardhat-Projekt erstellen {#step-8-create-hardhat-project} + +Führen Sie im Projektordner `hello-world` Folgendes aus: + +``` +npx hardhat +``` + +Sie sollten dann eine Willkommensnachricht sehen und die Möglichkeit haben, auszuwählen, wie Sie fortfahren möchten. Wählen Sie "create an empty hardhat.config.js" (Leere hardhat.config.js erstellen) aus: + +``` +888 888 888 888 888 +888 888 888 888 888 +888 888 888 888 888 +8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 +888 888 "88b 888P" d88" 888 888 "88b "88b 888 +888 888 .d888888 888 888 888 888 888 .d888888 888 +888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. +888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 + +👷 Welcome to Hardhat v2.0.11 👷‍ + +What do you want to do? … +Create a sample project +❯ Create an empty hardhat.config.js +Quit +``` + +Dadurch wird eine `hardhat.config.js`-Datei im Projekt generiert. Wir werden dies später im Tutorial verwenden, um das Setup für unser Projekt festzulegen. + +### Schritt 9: Projektordner hinzufügen {#step-9-add-project-folders} + +Um das Projekt zu organisieren, erstellen wir zwei neue Ordner. Navigieren Sie in der Kommandozeile zum Stammverzeichnis Ihres `hello-world`-Projekts und geben Sie ein: + +``` +mkdir contracts +mkdir scripts +``` + +- `contracts/` ist der Ort, an dem wir unsere `Hello-World-Smart-Contract`-Codedatei aufbewahren. +- `scripts/` ist der Ort, an dem wir Skripte zur Bereitstellung und Interaktion mit unserem Vertrag aufbewahren. + +### Schritt 10: Schreiben unseres Vertrags {#step-10-write-our-contract} + +Sie fragen sich vielleicht, wann wir anfangen, Code zu schreiben? Es ist soweit! + +Öffnen Sie das hello-world-Projekt in Ihrem bevorzugten Editor. Smart Contracts werden meistens in Solidity geschrieben, was wir verwenden werden, um unseren Smart Contract zu schreiben.‌ + +1. Navigieren Sie zum `contracts`-Ordner und erstellen Sie eine neue Datei namens `HelloWorld.sol` +2. Unten ist ein Beispiel für einen Hallo-Welt-Smart-Contract, den wir für dieses Tutorial verwenden werden. Kopieren Sie den folgenden Inhalt in die `HelloWorld.sol`-Datei. + +_Hinweis: Lesen Sie unbedingt die Kommentare, um zu verstehen, was dieser Vertrag bewirkt._ + +``` +// Gibt die Version von Solidity an, unter Verwendung von semantischer Versionierung. +// Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity >=0.7.3; + +// Definiert einen Vertrag namens `HelloWorld`. +// Ein Vertrag ist eine Sammlung von Funktionen und Daten (seinem Zustand). Nach der Bereitstellung befindet sich ein Vertrag an einer bestimmten Adresse auf der Ethereum-Blockchain. Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + //Wird ausgegeben, wenn die update-Funktion aufgerufen wird + //Smart-Contract-Ereignisse sind eine Möglichkeit für Ihren Vertrag, Ihrer App-Frontend mitzuteilen, dass auf der Blockchain etwas passiert ist. Das Frontend kann auf bestimmte Ereignisse „hören“ und bei deren Eintreten Maßnahmen ergreifen. + event UpdatedMessages(string oldStr, string newStr); + + // Deklariert eine Zustandsvariable `message` vom Typ `string`. + // Zustandsvariablen sind Variablen, deren Werte dauerhaft im Vertragsspeicher gespeichert werden. Das Schlüsselwort `public` macht Variablen von außerhalb eines Vertrags zugänglich und erstellt eine Funktion, die andere Verträge oder Clients aufrufen können, um auf den Wert zuzugreifen. + string public message; + + // Ähnlich wie in vielen klassenbasierten objektorientierten Sprachen ist ein Konstruktor eine spezielle Funktion, die nur bei der Erstellung des Vertrags ausgeführt wird. + // Konstruktoren werden verwendet, um die Daten des Vertrags zu initialisieren. Mehr erfahren:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // Akzeptiert ein String-Argument `initMessage` und setzt den Wert in die Speichervariable `message` des Vertrags). + message = initMessage; + } + + // Eine öffentliche Funktion, die ein String-Argument akzeptiert und die Speichervariable `message` aktualisiert. + function update(string memory newMessage) public { + string memory oldMsg = message; + message = newMessage; + emit UpdatedMessages(oldMsg, newMessage); + } +} +``` + +Dies ist ein einfacher Smart Contract, der bei der Erstellung eine Nachricht speichert. Er kann durch Aufrufen der `update`-Funktion aktualisiert werden. + +### Schritt 11: Verbinden Sie MetaMask und Alchemy mit Ihrem Projekt {#step-11-connect-metamask-alchemy-to-your-project} + +Wir haben eine MetaMask-Wallet und ein Alchemy-Konto erstellt und unseren Smart Contract geschrieben. Jetzt ist es an der Zeit, die drei zu verbinden. + +Jede von Ihrer Wallet gesendete Transaktion erfordert eine Signatur mit Ihrem eindeutigen privaten Schlüssel. Um unserem Programm diese Berechtigung zu erteilen, können wir unseren privaten Schlüssel sicher in einer Umgebungsdatei speichern. Wir werden hier auch einen API-Schlüssel für Alchemy speichern. + +> Um mehr über das Senden von Transaktionen zu erfahren, lesen Sie [dieses Tutorial](https://www.alchemy.com/docs/hello-world-smart-contract#step-11-connect-metamask--alchemy-to-your-project) über das Senden von Transaktionen mit web3. + +Installieren Sie zuerst das dotenv-Paket in Ihrem Projektverzeichnis: + +``` +npm install dotenv --save +``` + +Erstellen Sie dann eine `.env`-Datei im Stammverzeichnis des Projekts. Fügen Sie Ihren privaten MetaMask-Schlüssel und die HTTP-Alchemy-API-URL hinzu. + +Ihre Umgebungsdatei muss den Namen `.env` haben, sonst wird sie nicht als Umgebungsdatei erkannt. + +Nennen Sie sie nicht `process.env` oder `.env-custom` oder irgendetwas anderes. + +- Befolgen Sie [diese Anweisungen](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key), um Ihren privaten Schlüssel zu exportieren +- Siehe unten, um die HTTP Alchemy API-URL zu erhalten + +![](./get-alchemy-api-key.gif) + +Ihre `.env`-Datei sollte wie folgt aussehen: + +``` +API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" +PRIVATE_KEY = "your-metamask-private-key" +``` + +Um diese tatsächlich mit unserem Code zu verbinden, verweisen wir in Schritt 13 in unserer `hardhat.config.js`-Datei auf diese Variablen. + +### Schritt 12: Ethers.js installieren {#step-12-install-ethersjs} + +Ethers.js ist eine Bibliothek, die es einfacher macht, mit Ethereum zu interagieren und Anfragen zu stellen, indem sie [standardmäßige JSON-RPC-Methoden](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc) mit benutzerfreundlicheren Methoden umschließt. + +Hardhat ermöglicht es uns, [Plugins](https://hardhat.org/plugins/) für zusätzliche Tools und erweiterte Funktionalität zu integrieren. Wir werden das [Ethers-Plugin](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) für die Vertragsbereitstellung nutzen. + +Geben Sie Folgendes in Ihrem Projektverzeichnis ein: + +```bash +npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0" +``` + +### Schritt 13: Aktualisieren der hardhat.config.js {#step-13-update-hardhat-configjs} + +Wir haben bisher mehrere Abhängigkeiten und Plugins hinzugefügt. Jetzt müssen wir `hardhat.config.js` aktualisieren, damit unser Projekt alle kennt. + +Aktualisieren Sie Ihre `hardhat.config.js`, sodass sie wie folgt aussieht: + +```javascript +/** + * @type import('hardhat/config').HardhatUserConfig + */ + +require("dotenv").config() +require("@nomiclabs/hardhat-ethers") + +const { API_URL, PRIVATE_KEY } = process.env + +module.exports = { + solidity: "0.7.3", + defaultNetwork: "goerli", + networks: { + hardhat: {}, + goerli: { + url: API_URL, + accounts: [`0x${PRIVATE_KEY}`], + }, + }, +} +``` + +### Schritt 14: Kompilieren unseres Vertrags {#step-14-compile-our-contract} + +Um sicherzugehen, dass so weit alles funktioniert, sollten wir unseren Vertrag erstellen. Der `compile`-Task ist einer der integrierten Hardhat-Tasks. + +Führen Sie folgenden Befehl in der Befehlszeile aus: + +```bash +npx hardhat compile +``` + +Möglicherweise erhalten Sie eine Warnung über `SPDX license identifier not provided in source file`, aber machen Sie sich darüber keine Sorgen – hoffentlich sieht alles andere gut aus! Wenn nicht, können Sie jederzeit eine Nachricht im [Alchemy-Discord](https://discord.gg/u72VCg3) schreiben. + +### Schritt 15: Schreiben unseres Bereitstellungsskripts {#step-15-write-our-deploy-script} + +Nun, da unser Vertrag geschrieben und unsere Konfigurationsdatei einsatzbereit ist, ist es an der Zeit, das Skript zur Bereitstellung des Vertrags zu schreiben. + +Navigieren Sie zum Ordner `scripts/` und erstellen Sie eine neue Datei namens `deploy.js`, und fügen Sie ihr den folgenden Inhalt hinzu: + +```javascript +async function main() { + const HelloWorld = await ethers.getContractFactory("HelloWorld") + + // Startet die Bereitstellung und gibt ein Promise zurück, das zu einem Vertragsobjekt aufgelöst wird + const hello_world = await HelloWorld.deploy("Hello World!") + console.log("Vertrag bereitgestellt unter Adresse:", hello_world.address) +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) +``` + +Hardhat erklärt in seinem [Contracts-Tutorial](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) hervorragend, was jede dieser Codezeilen bewirkt; wir haben die Erklärungen hier übernommen. + +```javascript +const HelloWorld = await ethers.getContractFactory("HelloWorld") +``` + +Eine `ContractFactory` in ethers.js ist eine Abstraktion, die verwendet wird, um neue Smart Contracts bereitzustellen. `HelloWorld` ist hier also eine [Factory](https://en.wikipedia.org/wiki/Factory_\(object-oriented_programming\)) für Instanzen unseres Hallo-Welt-Vertrags. Bei der Verwendung des `hardhat-ethers`-Plugins werden `ContractFactory`- und `Contract`-Instanzen standardmäßig mit dem ersten Unterzeichner (Besitzer) verbunden. + +```javascript +const hello_world = await HelloWorld.deploy() +``` + +Der Aufruf von `deploy()` auf einer `ContractFactory` startet die Bereitstellung und gibt ein `Promise` zurück, das zu einem `Contract`-Objekt aufgelöst wird. Das ist das Objekt, das eine Methode für jede unserer Smart-Contract-Funktionen enthält. + +### Schritt 16: Unseren Vertrag bereitstellen {#step-16-deploy-our-contract} + +Nun sind wir endlich bereit, unseren Smart Contract bereitzustellen. Navigieren Sie zur Befehlszeile und führen Sie Folgendes aus: + +```bash +npx hardhat run scripts/deploy.js --network goerli +``` + +Sie sollten dann etwas sehen wie: + +```bash +Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570 +``` + +**Bitte speichern Sie diese Adresse**. Wir werden sie später im Tutorial verwenden. + +Wenn wir zum [Goerli-Etherscan](https://goerli.etherscan.io) gehen und nach unserer Vertragsadresse suchen, sollten wir sehen können, dass sie erfolgreich bereitgestellt wurde. Die Transaktion wird ungefähr so aussehen: + +![](./etherscan-contract.png) + +Die `From`-Adresse sollte mit Ihrer MetaMask-Kontoadresse übereinstimmen und die `To`-Adresse lautet **Vertragserstellung**. Wenn wir auf die Transaktion klicken, sehen wir unsere Vertragsadresse im `To`-Feld. + +![](./etherscan-transaction.png) + +Glückwunsch! Sie haben gerade einen Smart Contract in einem Ethereum-Testnet bereitgestellt. + +Um zu verstehen, was „unter der Haube“ vor sich geht, navigieren wir zum Explorer-Tab in unserem [Alchemy-Dashboard](https://dashboard.alchemy.com/explorer). Wenn Sie mehrere Alchemy-Apps haben, stellen Sie sicher, dass Sie nach App filtern und **Hello World** auswählen. + +![](./hello-world-explorer.png) + +Hier sehen Sie eine Handvoll JSON-RPC-Methoden, die Hardhat/Ethers für uns „unter der Haube“ ausgeführt hat, als wir die `.deploy()`-Funktion aufgerufen haben. Zwei wichtige Methoden sind hier [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), das ist die Anforderung, unseren Vertrag in die Goerli-Chain zu schreiben, und [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash), eine Anforderung zum Lesen von Informationen über unsere Transaktion anhand des Hashes. Um mehr über das Senden von Transaktionen zu erfahren, lesen Sie unser [Tutorial zum Senden von Transaktionen mit Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/). + +## Teil 2: Interaktion mit Ihrem Smart Contract {#part-2-interact-with-your-smart-contract} + +Nachdem wir nun erfolgreich einen Smart Contract im Goerli-Netzwerk bereitgestellt haben, lernen wir, wie man mit ihm interagiert. + +### Eine interact.js-Datei erstellen {#create-a-interactjs-file} + +Dies ist die Datei, in die wir unser Interaktionsskript schreiben werden. Wir werden die Ethers.js-Bibliothek verwenden, die Sie zuvor in Teil 1 installiert haben. + +Erstellen Sie im Ordner `scripts/` eine neue Datei namens `interact.js` und fügen Sie den folgenden Code hinzu: + +```javascript +// interact.js + +const API_KEY = process.env.API_KEY +const PRIVATE_KEY = process.env.PRIVATE_KEY +const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS +``` + +### Aktualisieren Sie Ihre .env-Datei {#update-your-env-file} + +Wir werden neue Umgebungsvariablen verwenden, also müssen wir sie in der `.env`-Datei definieren, die [wir zuvor erstellt haben](#step-11-connect-metamask-&-alchemy-to-your-project). + +Wir müssen eine Definition für unseren Alchemy `API_KEY` und die `CONTRACT_ADDRESS` hinzufügen, unter der Ihr Smart Contract bereitgestellt wurde. + +Ihre `.env`-Datei sollte ungefähr so aussehen: + +```bash +# .env + +API_URL = "https://eth-goerli.alchemyapi.io/v2/" +API_KEY = "" +PRIVATE_KEY = "" +CONTRACT_ADDRESS = "0x" +``` + +### Ihre Vertrags-ABI abrufen {#grab-your-contract-ABI} + +Unsere Vertrags-[ABI (Application Binary Interface)](/glossary/#abi) ist die Schnittstelle, über die die Interaktion mit unserem Smart Contract erfolgt. Hardhat generiert automatisch eine ABI und speichert sie in `HelloWorld.json`. Um die ABI zu verwenden, müssen wir den Inhalt auslesen, indem wir die folgenden Codezeilen zu unserer `interact.js`-Datei hinzufügen: + +```javascript +// interact.js +const contract = require("../artifacts/contracts/HelloWorld.sol/HelloWorld.json") +``` + +Wenn Sie die ABI sehen möchten, können Sie sie auf Ihrer Konsole ausgeben: + +```javascript +console.log(JSON.stringify(contract.abi)) +``` + +Um Ihre ABI in der Konsole ausgedruckt zu sehen, navigieren Sie zu Ihrem Terminal und führen Sie aus: + +```bash +npx hardhat run scripts/interact.js +``` + +### Eine Instanz Ihres Vertrags erstellen {#create-an-instance-of-your-contract} + +Um mit unserem Vertrag zu interagieren, müssen wir eine Vertragsinstanz in unserem Code erstellen. Um dies mit Ethers.js zu tun, müssen wir mit drei Konzepten arbeiten: + +1. Provider – ein Node-Provider, der Ihnen Lese- und Schreibzugriff auf die Blockchain gibt +2. Signer – repräsentiert ein Ethereum-Konto, das Transaktionen signieren kann +3. Contract – ein Ethers.js-Objekt, das einen bestimmten onchain bereitgestellten Vertrag darstellt + +Wir verwenden die Vertrags-ABI aus dem vorherigen Schritt, um unsere Instanz des Vertrags zu erstellen: + +```javascript +// interact.js + +// Provider +const alchemyProvider = new ethers.providers.AlchemyProvider( + (network = "goerli"), + API_KEY +) + +// Signer +const signer = new ethers.Wallet(PRIVATE_KEY, alchemyProvider) + +// Contract +const helloWorldContract = new ethers.Contract( + CONTRACT_ADDRESS, + contract.abi, + signer +) +``` + +Erfahren Sie mehr über Provider, Signer und Contracts in der [ethers.js-Dokumentation](https://docs.ethers.io/v5/). + +### Lesen Sie die init-Nachricht {#read-the-init-message} + +Erinnern Sie sich, als wir unseren Vertrag mit `initMessage = "Hello world!"` bereitgestellt haben? Wir werden nun diese Nachricht, die in unserem Smart Contract gespeichert ist, lesen und in der Konsole ausgeben. + +In JavaScript werden asynchrone Funktionen verwendet, wenn mit Netzwerken interagiert wird. Um mehr über asynchrone Funktionen zu erfahren, [lesen Sie diesen Medium-Artikel](https://blog.bitsrc.io/understanding-asynchronous-javascript-the-event-loop-74cd408419ff). + +Verwenden Sie den folgenden Code, um die `message`-Funktion in unserem Smart Contract aufzurufen und die init-Nachricht zu lesen: + +```javascript +// interact.js + +// ... + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) +} +main() +``` + +Nachdem wir die Datei mit `npx hardhat run scripts/interact.js` im Terminal ausgeführt haben, sollten wir diese Antwort sehen: + +``` +Die Nachricht ist: Hallo Welt! +``` + +Glückwunsch! Sie haben gerade erfolgreich Smart-Contract-Daten von der Ethereum-Blockchain gelesen, gut gemacht! + +### Die Nachricht aktualisieren {#update-the-message} + +Anstatt nur die Nachricht zu lesen, können wir auch die in unserem Smart Contract gespeicherte Nachricht mithilfe der `update`-Funktion aktualisieren! Ziemlich cool, oder? + +Um die Nachricht zu aktualisieren, können wir die `update`-Funktion direkt auf unserem instanziierten Vertrags-Objekt aufrufen: + +```javascript +// interact.js + +// ... + +async function main() { + const message = await helloWorldContract.message() + console.log("Die Nachricht ist: " + message) + + console.log("Aktualisiere die Nachricht...") + const tx = await helloWorldContract.update("Dies ist die neue Nachricht.") + await tx.wait() +} +main() +``` + +Beachten Sie, dass wir in Zeile 11 einen Aufruf von `.wait()` auf dem zurückgegebenen Transaktionsobjekt machen. Dies stellt sicher, dass unser Skript wartet, bis die Transaktion auf der Blockchain gemined ist, bevor die Funktion beendet wird. Wenn der `.wait()`-Aufruf nicht enthalten ist, sieht das Skript möglicherweise nicht den aktualisierten `message`-Wert im Vertrag. + +### Die neue Nachricht lesen {#read-the-new-message} + +Sie sollten in der Lage sein, den [vorherigen Schritt](#read-the-init-message) zu wiederholen, um den aktualisierten `message`-Wert zu lesen. Nehmen Sie sich einen Moment Zeit und sehen Sie, ob Sie die notwendigen Änderungen vornehmen können, um diesen neuen Wert auszugeben! + +Wenn Sie einen Hinweis benötigen, hier ist, wie Ihre `interact.js`-Datei an dieser Stelle aussehen sollte: + +```javascript +// interact.js + +const API_KEY = process.env.API_KEY +const PRIVATE_KEY = process.env.PRIVATE_KEY +const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS + +const contract = require("../artifacts/contracts/HelloWorld.sol/HelloWorld.json") + +// provider - Alchemy +const alchemyProvider = new ethers.providers.AlchemyProvider( + (network = "goerli"), + API_KEY +) + +// signer - Sie +const signer = new ethers.Wallet(PRIVATE_KEY, alchemyProvider) + +// Vertragsinstanz +const helloWorldContract = new ethers.Contract( + CONTRACT_ADDRESS, + contract.abi, + signer +) + +async function main() { + const message = await helloWorldContract.message() + console.log("Die Nachricht ist: " + message) + + console.log("Aktualisiere die Nachricht...") + const tx = await helloWorldContract.update("Dies ist die neue Nachricht") + await tx.wait() + + const newMessage = await helloWorldContract.message() + console.log("Die neue Nachricht ist: " + newMessage) +} + +main() +``` + +Führen Sie nun einfach das Skript aus und Sie sollten die alte Nachricht, den Aktualisierungsstatus und die neue Nachricht in Ihrem Terminal ausgegeben sehen! + +`npx hardhat run scripts/interact.js --network goerli` + +``` +Die Nachricht ist: Hallo Welt! +Aktualisiere die Nachricht... +Die neue Nachricht ist: Dies ist die neue Nachricht. +``` + +Während der Ausführung dieses Skripts werden Sie vielleicht feststellen, dass der Schritt `Aktualisiere die Nachricht...` eine Weile zum Laden braucht, bevor die neue Nachricht geladen wird. Dies liegt am Mining-Prozess; wenn Sie neugierig sind, Transaktionen während des Minings zu verfolgen, besuchen Sie den [Alchemy-Mempool](https://dashboard.alchemyapi.io/mempool), um den Status einer Transaktion zu sehen. Wenn die Transaktion verworfen wird, ist es auch hilfreich, [Goerli Etherscan](https://goerli.etherscan.io) zu überprüfen und nach Ihrem Transaktions-Hash zu suchen. + +## Teil 3: Veröffentlichen Sie Ihren Smart Contract auf Etherscan {#part-3-publish-your-smart-contract-to-etherscan} + +Sie haben die ganze harte Arbeit geleistet, um Ihren Smart Contract zum Leben zu erwecken; jetzt ist es an der Zeit, ihn mit der Welt zu teilen! + +Durch die Verifizierung Ihres Smart Contracts auf Etherscan kann jeder Ihren Quellcode einsehen und mit Ihrem Smart Contract interagieren. Legen wir los! + +### Schritt 1: Generieren Sie einen API-Schlüssel in Ihrem Etherscan-Konto {#step-1-generate-an-api-key-on-your-etherscan-account} + +Ein Etherscan-API-Schlüssel ist notwendig, um zu verifizieren, dass Sie der Eigentümer des Smart Contracts sind, den Sie veröffentlichen möchten. + +Wenn Sie noch kein Etherscan-Konto haben, [registrieren Sie sich für ein Konto](https://etherscan.io/register). + +Nach dem Einloggen finden Sie Ihren Benutzernamen in der Navigationsleiste, fahren Sie mit der Maus darüber und wählen Sie die Schaltfläche **Mein Profil**. + +Auf Ihrer Profilseite sollten Sie eine seitliche Navigationsleiste sehen. Wählen Sie in der seitlichen Navigationsleiste **API-Schlüssel**. Drücken Sie als Nächstes die Schaltfläche „Hinzufügen“, um einen neuen API-Schlüssel zu erstellen, benennen Sie Ihre App **hello-world** und drücken Sie die Schaltfläche **Neuen API-Schlüssel erstellen**. + +Ihr neuer API-Schlüssel sollte in der API-Schlüssel-Tabelle erscheinen. Kopieren Sie den API-Schlüssel in Ihre Zwischenablage. + +Als Nächstes müssen wir den Etherscan-API-Schlüssel zu unserer `.env`-Datei hinzufügen. + +Nachdem Sie ihn hinzugefügt haben, sollte Ihre `.env`-Datei so aussehen: + +```javascript +API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" +PUBLIC_KEY = "your-public-account-address" +PRIVATE_KEY = "your-private-account-address" +CONTRACT_ADDRESS = "your-contract-address" +ETHERSCAN_API_KEY = "your-etherscan-key" +``` + +### Hardhat-bereitgestellte Smart Contracts {#hardhat-deployed-smart-contracts} + +#### Installieren Sie hardhat-etherscan {#install-hardhat-etherscan} + +Das Veröffentlichen Ihres Vertrags auf Etherscan mit Hardhat ist unkompliziert. Sie müssen zuerst das `hardhat-etherscan`-Plugin installieren, um zu beginnen. `hardhat-etherscan` wird automatisch den Quellcode und die ABI des Smart Contracts auf Etherscan verifizieren. Um dies hinzuzufügen, führen Sie im `hello-world`-Verzeichnis Folgendes aus: + +```text +npm install --save-dev @nomiclabs/hardhat-etherscan +``` + +Nach der Installation fügen Sie die folgende Anweisung am Anfang Ihrer `hardhat.config.js` ein und fügen Sie die Etherscan-Konfigurationsoptionen hinzu: + +```javascript +// hardhat.config.js + +require("dotenv").config() +require("@nomiclabs/hardhat-ethers") +require("@nomiclabs/hardhat-etherscan") + +const { API_URL, PRIVATE_KEY, ETHERSCAN_API_KEY } = process.env + +module.exports = { + solidity: "0.7.3", + defaultNetwork: "goerli", + networks: { + hardhat: {}, + goerli: { + url: API_URL, + accounts: [`0x${PRIVATE_KEY}`], + }, + }, + etherscan: { + // Ihr API-Schlüssel für Etherscan + // Erhalten Sie einen unter https://etherscan.io/ + apiKey: ETHERSCAN_API_KEY, + }, +} +``` + +#### Verifizieren Sie Ihren Smart Contract auf Etherscan {#verify-your-smart-contract-on-etherscan} + +Stellen Sie sicher, dass alle Dateien gespeichert und alle `.env`-Variablen korrekt konfiguriert sind. + +Führen Sie die `verify`-Aufgabe aus, indem Sie die Vertragsadresse und das Netzwerk übergeben, in dem sie bereitgestellt ist: + +```text +npx hardhat verify --network goerli DEPLOYED_CONTRACT_ADDRESS 'Hello World!' +``` + +Stellen Sie sicher, dass `DEPLOYED_CONTRACT_ADDRESS` die Adresse Ihres bereitgestellten Smart Contracts im Goerli-Testnet ist. Außerdem muss das letzte Argument (`'Hello World!'`) derselbe String-Wert sein, der [während des Bereitstellungsschritts in Teil 1](#write-our-deploy-script) verwendet wurde. + +Wenn alles gut geht, sehen Sie die folgende Nachricht in Ihrem Terminal: + +```text +Quellcode für Vertrag erfolgreich übermittelt +contracts/HelloWorld.sol:HelloWorld unter 0xdeployed-contract-address +zur Verifizierung auf Etherscan. Warte auf Verifizierungsergebnis... + + +Vertrag HelloWorld auf Etherscan erfolgreich verifiziert. +https://goerli.etherscan.io/address/#contracts +``` + +Glückwunsch! Ihr Smart-Contract-Code ist auf Etherscan! + +### Schauen Sie sich Ihren Smart Contract auf Etherscan an! {#check-out-your-smart-contract-on-etherscan} + +Wenn Sie dem in Ihrem Terminal bereitgestellten Link folgen, sollten Sie in der Lage sein, Ihren Smart-Contract-Code und Ihre ABI auf Etherscan veröffentlicht zu sehen! + +**Wuhuu – du hast es geschafft, Champion! Jetzt kann jeder Ihren Smart Contract aufrufen oder in ihn schreiben! Wir können es kaum erwarten zu sehen, was Sie als Nächstes bauen!** + +## Teil 4 – Integrieren Ihres Smart Contracts in das Frontend {#part-4-integrating-your-smart-contract-with-the-frontend} + +Am Ende dieses Tutorials werden Sie wissen, wie Sie: + +- Eine MetaMask-Wallet mit Ihrer Dapp verbinden +- Daten aus Ihrem Smart Contract mit der [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) API lesen +- Ethereum-Transaktionen mit MetaMask signieren + +Für diese Dapp werden wir [React](https://react.dev/) als unser Frontend-Framework verwenden; es ist jedoch wichtig zu beachten, dass wir nicht viel Zeit damit verbringen werden, dessen Grundlagen zu erläutern, da wir uns hauptsächlich darauf konzentrieren werden, Web3-Funktionalität in unser Projekt zu bringen. + +Als Voraussetzung sollten Sie ein grundlegendes Verständnis von React haben. Wenn nicht, empfehlen wir, das offizielle [Intro zu React-Tutorial](https://react.dev/learn) abzuschließen. + +### Die Starter-Dateien klonen {#clone-the-starter-files} + +Gehen Sie zunächst zum [hello-world-part-four GitHub-Repository](https://github.com/alchemyplatform/hello-world-part-four-tutorial), um die Starter-Dateien für dieses Projekt zu erhalten, und klonen Sie dieses Repository auf Ihren lokalen Rechner. + +Öffnen Sie das geklonte Repository lokal. Beachten Sie, dass es zwei Ordner enthält: `starter-files` und `completed`. + +- `starter-files` – **wir werden in diesem Verzeichnis arbeiten**, wir werden die Benutzeroberfläche mit Ihrer Ethereum-Wallet und dem Smart Contract verbinden, den wir in [Teil 3](#part-3) auf Etherscan veröffentlicht haben. +- `completed` enthält das gesamte abgeschlossene Tutorial und sollte nur als Referenz verwendet werden, wenn Sie nicht weiterkommen. + +Öffnen Sie als Nächstes Ihre Kopie von `starter-files` in Ihrem bevorzugten Code-Editor und navigieren Sie dann in den `src`-Ordner. + +Der gesamte Code, den wir schreiben werden, befindet sich im Ordner `src`. Wir werden die `HelloWorld.js`-Komponente und die `util/interact.js`-JavaScript-Dateien bearbeiten, um unserem Projekt Web3-Funktionalität zu verleihen. + +### Sehen Sie sich die Starter-Dateien an {#check-out-the-starter-files} + +Bevor wir mit dem Codieren beginnen, lassen Sie uns untersuchen, was uns in den Starter-Dateien zur Verfügung gestellt wird. + +#### Dein React-Projekt zum Laufen bringen {#get-your-react-project-running} + +Beginnen wir damit, das React-Projekt in unserem Browser auszuführen. Das Schöne an React ist, dass alle Änderungen, die wir speichern, live in unserem Browser aktualisiert werden, sobald unser Projekt im Browser läuft. + +Um das Projekt zum Laufen zu bringen, navigieren Sie zum Stammverzeichnis des `starter-files`-Ordners und führen Sie `npm install` in Ihrem Terminal aus, um die Abhängigkeiten des Projekts zu installieren: + +```bash +cd starter-files +npm install +``` + +Sobald die Installation abgeschlossen ist, führe `npm start` in deinem Terminal aus: + +```bash +npm start +``` + +Dadurch sollte [http://localhost:3000/](http://localhost:3000/) in Ihrem Browser geöffnet werden, wo Sie das Frontend für unser Projekt sehen. Es sollte aus einem Feld (einem Ort zum Aktualisieren der in Ihrem Smart Contract gespeicherten Nachricht), einer Schaltfläche „Wallet verbinden“ und einer Schaltfläche „Aktualisieren“ bestehen. + +Wenn Sie versuchen, auf eine der beiden Schaltflächen zu klicken, werden Sie feststellen, dass sie nicht funktionieren – das liegt daran, dass wir ihre Funktionalität noch programmieren müssen. + +#### Die `HelloWorld.js`-Komponente {#the-helloworld-js-component} + +Kehren wir zum `src`-Ordner in unserem Editor zurück und öffnen Sie die `HelloWorld.js`-Datei. Es ist sehr wichtig, dass wir alles in dieser Datei verstehen, da es sich um die primäre React-Komponente handelt, an der wir arbeiten werden. + +Oben in dieser Datei werden Sie feststellen, dass wir mehrere Import-Anweisungen haben, die notwendig sind, um unser Projekt zum Laufen zu bringen, einschließlich der React-Bibliothek, useEffect- und useState-Hooks, einige Elemente aus `./util/interact.js` (wir werden sie bald genauer beschreiben!) und das Alchemy-Logo. + +```javascript +// HelloWorld.js + +import React from "react" +import { useEffect, useState } from "react" +import { + helloWorldContract, + connectWallet, + updateMessage, + loadCurrentMessage, + getCurrentWalletConnected, +} from "./util/interact.js" + +import alchemylogo from "./alchemylogo.svg" +``` + +Als Nächstes haben wir unsere Zustandsvariablen, die wir nach bestimmten Ereignissen aktualisieren werden. + +```javascript +// HelloWorld.js + +//Zustandsvariablen +const [walletAddress, setWallet] = useState("") +const [status, setStatus] = useState("") +const [message, setMessage] = useState("Keine Verbindung zum Netzwerk.") +const [newMessage, setNewMessage] = useState("") +``` + +Hier ist, was jede der Variablen darstellt: + +- `walletAddress` - eine Zeichenfolge, die die Wallet-Adresse des Benutzers speichert +- `status` – ein String, der eine hilfreiche Nachricht speichert, die den Benutzer bei der Interaktion mit der Dapp anleitet +- `message` – ein String, der die aktuelle Nachricht im Smart Contract speichert +- `newMessage` – ein String, der die neue Nachricht speichert, die in den Smart Contract geschrieben wird + +Nach den Zustandsvariablen sehen Sie fünf nicht implementierte Funktionen: `useEffect` ,`addSmartContractListener`, `addWalletListener` , `connectWalletPressed` und `onUpdatePressed`. Wir erklären unten, was sie tun: + +```javascript +// HelloWorld.js + +//wird nur einmal aufgerufen +useEffect(async () => { + //TODO: implement +}, []) + +function addSmartContractListener() { + //TODO: implement +} + +function addWalletListener() { + //TODO: implement +} + +const connectWalletPressed = async () => { + //TODO: implement +} + +const onUpdatePressed = async () => { + //TODO: implement +} +``` + +- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html) – dies ist ein React-Hook, der aufgerufen wird, nachdem Ihre Komponente gerendert wurde. Da ihm ein leeres Array `[]` als Eigenschaft übergeben wird (siehe Zeile 4), wird er nur beim _ersten_ Rendern der Komponente aufgerufen. Hier laden wir die aktuelle Nachricht, die in unserem Smart Contract gespeichert ist, rufen unsere Smart-Contract- und Wallet-Listener auf und aktualisieren unsere Benutzeroberfläche, um anzuzeigen, ob eine Wallet bereits verbunden ist. +- `addSmartContractListener` – diese Funktion richtet einen Listener ein, der auf das `UpdatedMessages`-Ereignis unseres HelloWorld-Vertrags achtet und unsere Benutzeroberfläche aktualisiert, wenn die Nachricht in unserem Smart Contract geändert wird. +- `addWalletListener` – diese Funktion richtet einen Listener ein, der Änderungen im Zustand der MetaMask-Wallet des Benutzers erkennt, z. B. wenn der Benutzer seine Wallet trennt oder Adressen wechselt. +- `connectWalletPressed` – diese Funktion wird aufgerufen, um die MetaMask-Wallet des Benutzers mit unserer Dapp zu verbinden. +- `onUpdatePressed` – diese Funktion wird aufgerufen, wenn der Benutzer die im Smart Contract gespeicherte Nachricht aktualisieren möchte. + +Gegen Ende dieser Datei haben wir die Benutzeroberfläche unserer Komponente. + +```javascript +// HelloWorld.js + +//die Benutzeroberfläche unserer Komponente +return ( +
+ + + +

Aktuelle Nachricht:

+

{message}

+ +

Neue Nachricht:

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

{status}

+ + +
+
+) +``` + +Wenn Sie diesen Code sorgfältig scannen, werden Sie feststellen, wo wir unsere verschiedenen Zustandsvariablen in unserer Benutzeroberfläche verwenden: + +- In den Zeilen 6-12, wenn die Wallet des Benutzers verbunden ist (d. h. `walletAddress.length > 0`), zeigen wir eine gekürzte Version der Benutzer-`walletAddress` in der Schaltfläche mit der ID „walletButton“ an; andernfalls steht dort einfach „Wallet verbinden“. +- In Zeile 17 zeigen wir die aktuelle Nachricht an, die im Smart Contract gespeichert ist und im `message`-String erfasst wird. +- In den Zeilen 23–26 verwenden wir eine [kontrollierte Komponente](https://legacy.reactjs.org/docs/forms.html#controlled-components), um unsere `newMessage`-Zustandsvariable zu aktualisieren, wenn sich die Eingabe im Textfeld ändert. + +Zusätzlich zu unseren Zustandsvariablen sehen Sie auch, dass die Funktionen `connectWalletPressed` und `onUpdatePressed` aufgerufen werden, wenn die Schaltflächen mit den IDs `publishButton` bzw. `walletButton` geklickt werden. + +Lassen Sie uns schließlich klären, wo diese `HelloWorld.js`-Komponente hinzugefügt wird. + +Wenn Sie zur `App.js`-Datei gehen, die die Hauptkomponente in React ist und als Container für alle anderen Komponenten dient, werden Sie sehen, dass unsere `HelloWorld.js`-Komponente in Zeile 7 eingefügt wird. + +Zu guter Letzt wollen wir uns noch eine weitere für Sie bereitgestellte Datei ansehen, die `interact.js`-Datei. + +#### Die `interact.js`-Datei {#the-interact-js-file} + +Da wir uns an das [M-V-C](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)-Paradigma halten wollen, benötigen wir eine separate Datei, die alle unsere Funktionen zur Verwaltung der Logik, Daten und Regeln unserer Dapp enthält, und diese Funktionen dann in unser Frontend (unsere `HelloWorld.js`-Komponente) exportieren können. + +👆🏽Dies ist genau der Zweck unserer `interact.js`-Datei! + +Navigieren Sie zum `util`-Ordner in Ihrem `src`-Verzeichnis, und Sie werden feststellen, dass wir eine Datei namens `interact.js` beigefügt haben, die alle unsere Smart-Contract-Interaktions- und Wallet-Funktionen und -Variablen enthalten wird. + +```javascript +// interact.js + +//export const helloWorldContract; + +export const loadCurrentMessage = async () => {} + +export const connectWallet = async () => {} + +const getCurrentWalletConnected = async () => {} + +export const updateMessage = async (message) => {} +``` + +Sie werden am Anfang der Datei feststellen, dass wir das `helloWorldContract`-Objekt auskommentiert haben. Später in diesem Tutorial werden wir dieses Objekt entkommentieren und unseren Smart Contract in dieser Variable instanziieren, die wir dann in unsere `HelloWorld.js`-Komponente exportieren werden. + +Die vier nicht implementierten Funktionen nach unserem `helloWorldContract`-Objekt tun Folgendes: + +- `loadCurrentMessage` – diese Funktion behandelt die Logik zum Laden der aktuellen Nachricht, die im Smart Contract gespeichert ist. Es wird ein _Lese_-Aufruf an den Hallo-Welt-Smart-Contract über die [Alchemy Web3 API](https://github.com/alchemyplatform/alchemy-web3) gemacht. +- `connectWallet` – diese Funktion verbindet die MetaMask des Benutzers mit unserer Dapp. +- `getCurrentWalletConnected` – diese Funktion prüft, ob beim Laden der Seite bereits ein Ethereum-Konto mit unserer Dapp verbunden ist, und aktualisiert unsere Benutzeroberfläche entsprechend. +- `updateMessage` – diese Funktion aktualisiert die im Smart Contract gespeicherte Nachricht. Es wird ein _Schreib_-Aufruf an den Hallo-Welt-Smart-Contract gemacht, sodass die MetaMask-Wallet des Benutzers eine Ethereum-Transaktion signieren muss, um die Nachricht zu aktualisieren. + +Jetzt, da wir verstehen, womit wir arbeiten, lassen Sie uns herausfinden, wie wir aus unserem Smart Contract lesen können! + +### Schritt 3: Lesen aus Ihrem Smart Contract {#step-3-read-from-your-smart-contract} + +Um aus Ihrem Smart Contract zu lesen, müssen Sie erfolgreich Folgendes einrichten: + +- Eine API-Verbindung zur Ethereum-Chain +- Eine geladene Instanz Ihres Smart Contracts +- Eine Funktion zum Aufrufen Ihrer Smart-Contract-Funktion +- Ein Listener, der auf Aktualisierungen achtet, wenn sich die Daten, die Sie aus dem Smart Contract lesen, ändern + +Das mag nach vielen Schritten klingen, aber keine Sorge! Wir führen Sie Schritt für Schritt durch jeden einzelnen davon! :\) + +#### Eine API-Verbindung zur Ethereum-Chain herstellen {#establish-an-api-connection-to-the-ethereum-chain} + +Erinnern Sie sich, wie wir in Teil 2 dieses Tutorials unseren [Alchemy Web3-Schlüssel verwendet haben, um aus unserem Smart Contract zu lesen](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract/interacting-with-a-smart-contract#step-1-install-web3-library)? Sie benötigen auch einen Alchemy Web3-Schlüssel in Ihrer Dapp, um von der Chain zu lesen. + +Wenn Sie es noch nicht haben, installieren Sie zuerst [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3), indem Sie zum Stammverzeichnis Ihrer `starter-files` navigieren und Folgendes in Ihrem Terminal ausführen: + +```text +npm install @alch/alchemy-web3 +``` + +[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) ist ein Wrapper um [Web3.js](https://docs.web3js.org/) und bietet erweiterte API-Methoden und andere entscheidende Vorteile, um dir das Leben als Web3-Entwickler zu erleichtern. Es ist so konzipiert, dass es eine minimale Konfiguration erfordert, sodass du es sofort in deiner App verwenden kannst! + +Installieren Sie dann das [dotenv](https://www.npmjs.com/package/dotenv)-Paket in Ihrem Projektverzeichnis, damit wir einen sicheren Ort haben, um unseren API-Schlüssel nach dem Abrufen zu speichern. + +```text +npm install dotenv --save +``` + +Für unsere Dapp **werden wir unseren Websockets-API-Schlüssel** anstelle unseres HTTP-API-Schlüssels verwenden, da wir damit einen Listener einrichten können, der erkennt, wann sich die im Smart Contract gespeicherte Nachricht ändert. + +Sobald Sie Ihren API-Schlüssel haben, erstellen Sie eine `.env`-Datei in Ihrem Stammverzeichnis und fügen Sie Ihre Alchemy-Websockets-URL hinzu. Danach sollte Ihre `.env`-Datei so aussehen: + +```javascript +REACT_APP_ALCHEMY_KEY = wss://eth-goerli.ws.alchemyapi.io/v2/ +``` + +Jetzt sind wir bereit, unseren Alchemy Web3-Endpunkt in unserer Dapp einzurichten! Kehren wir zu unserer `interact.js` zurück, die in unserem `util`-Ordner verschachtelt ist, und fügen Sie den folgenden Code am Anfang der Datei hinzu: + +```javascript +// interact.js + +require("dotenv").config() +const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3(alchemyKey) + +//export const helloWorldContract; +``` + +Oben haben wir zuerst den Alchemy-Schlüssel aus unserer `.env`-Datei importiert und dann unseren `alchemyKey` an `createAlchemyWeb3` übergeben, um unseren Alchemy Web3-Endpunkt einzurichten. + +Mit diesem Endpunkt sind wir bereit, unseren Smart Contract zu laden! + +#### Ihren Hello World Smart Contract laden {#loading-your-hello-world-smart-contract} + +Um Ihren Hallo-Welt-Smart-Contract zu laden, benötigen Sie seine Vertragsadresse und ABI, die beide auf Etherscan zu finden sind, wenn Sie [Teil 3 dieses Tutorials abgeschlossen haben.](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan-part-3-publish-your-smart-contract-to-etherscan) + +#### Wie Sie Ihre Vertrags-ABI von Etherscan erhalten {#how-to-get-your-contract-abi-from-etherscan} + +Wenn Sie Teil 3 dieses Tutorials übersprungen haben, können Sie den HelloWorld-Vertrag mit der Adresse [0x6f3f635A9762B47954229Ea479b4541eAF402A6A](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code) verwenden. Seine ABI finden Sie [hier](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code). + +Eine Vertrags-ABI ist notwendig, um festzulegen, welche Funktion ein Vertrag aufrufen wird, sowie um sicherzustellen, dass die Funktion Daten im erwarteten Format zurückgibt. Sobald wir unsere Vertrags-ABI kopiert haben, speichern wir sie als JSON-Datei namens `contract-abi.json` in Ihrem `src`-Verzeichnis. + +Ihre contract-abi.json sollte in Ihrem src-Ordner gespeichert sein. + +Bewaffnet mit unserer Vertragsadresse, ABI und dem Alchemy Web3-Endpunkt, können wir die [contract-Methode](https://docs.web3js.org/api/web3-eth-contract/class/Contract) verwenden, um eine Instanz unseres Smart Contracts zu laden. Importieren Sie Ihre Vertrags-ABI in die `interact.js`-Datei und fügen Sie Ihre Vertragsadresse hinzu. + +```javascript +// interact.js + +const contractABI = require("../contract-abi.json") +const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A" +``` + +Wir können nun endlich unsere `helloWorldContract`-Variable entkommentieren und den Smart Contract mit unserem AlchemyWeb3-Endpunkt laden: + +```javascript +// interact.js +export const helloWorldContract = new web3.eth.Contract( + contractABI, + contractAddress +) +``` + +Zusammenfassend sollten die ersten 12 Zeilen Ihrer `interact.js` jetzt so aussehen: + +```javascript +// interact.js + +require("dotenv").config() +const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3(alchemyKey) + +const contractABI = require("../contract-abi.json") +const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A" + +export const helloWorldContract = new web3.eth.Contract( + contractABI, + contractAddress +) +``` + +Jetzt, da wir unseren Vertrag geladen haben, können wir unsere `loadCurrentMessage`-Funktion implementieren! + +#### Implementierung von `loadCurrentMessage` in Ihrer `interact.js`-Datei {#implementing-loadCurrentMessage-in-your-interact-js-file} + +Diese Funktion ist super einfach. Wir werden einen einfachen asynchronen web3-Aufruf machen, um aus unserem Vertrag zu lesen. Unsere Funktion wird die im Smart Contract gespeicherte Nachricht zurückgeben: + +Aktualisieren Sie die `loadCurrentMessage` in Ihrer `interact.js`-Datei auf Folgendes: + +```javascript +// interact.js + +export const loadCurrentMessage = async () => { + const message = await helloWorldContract.methods.message().call() + return message +} +``` + +Da wir diesen Smart Contract in unserer Benutzeroberfläche anzeigen möchten, aktualisieren wir die `useEffect`-Funktion in unserer `HelloWorld.js`-Komponente auf Folgendes: + +```javascript +// HelloWorld.js + +//wird nur einmal aufgerufen +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) +}, []) +``` + +Beachten Sie, dass wir `loadCurrentMessage` nur einmal während des ersten Renderns der Komponente aufrufen wollen. Wir werden bald `addSmartContractListener` implementieren, um die Benutzeroberfläche automatisch zu aktualisieren, nachdem sich die Nachricht im Smart Contract geändert hat. + +Bevor wir uns mit unserem Listener befassen, schauen wir uns an, was wir bisher haben! Speichern Sie Ihre `HelloWorld.js`- und `interact.js`-Dateien und gehen Sie dann zu [http://localhost:3000/](http://localhost:3000/) + +Sie werden feststellen, dass die aktuelle Nachricht nicht mehr „Keine Verbindung zum Netzwerk“ lautet. Stattdessen spiegelt sie die im Smart Contract gespeicherte Nachricht wider. Klasse! + +#### Ihre Benutzeroberfläche sollte jetzt die im Smart Contract gespeicherte Nachricht widerspiegeln {#your-UI-should-now-reflect-the-message-stored-in-the-smart-contract} + +Apropos Listener... + +#### Implementieren Sie `addSmartContractListener` {#implement-addsmartcontractlistener} + +Wenn Sie an die `HelloWorld.sol`-Datei zurückdenken, die wir in [Teil 1 dieser Tutorial-Reihe](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract#step-10-write-our-contract) geschrieben haben, werden Sie sich daran erinnern, dass es ein Smart-Contract-Ereignis namens `UpdatedMessages` gibt, das ausgegeben wird, nachdem die `update`-Funktion unseres Smart Contracts aufgerufen wurde (siehe Zeilen 9 und 27): + +```javascript +// HelloWorld.sol + +// Gibt die Version von Solidity an, unter Verwendung von semantischer Versionierung. +// Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity ^0.7.3; + +// Definiert einen Vertrag namens `HelloWorld`. +// Ein Vertrag ist eine Sammlung von Funktionen und Daten (seinem Zustand). Nach der Bereitstellung befindet sich ein Vertrag an einer bestimmten Adresse auf der Ethereum-Blockchain. Mehr erfahren: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + //Wird ausgegeben, wenn die update-Funktion aufgerufen wird + //Smart-Contract-Ereignisse sind eine Möglichkeit für Ihren Vertrag, Ihrer App-Frontend mitzuteilen, dass auf der Blockchain etwas passiert ist. Das Frontend kann auf bestimmte Ereignisse „hören“ und bei deren Eintreten Maßnahmen ergreifen. + event UpdatedMessages(string oldStr, string newStr); + + // Deklariert eine Zustandsvariable `message` vom Typ `string`. + // Zustandsvariablen sind Variablen, deren Werte dauerhaft im Vertragsspeicher gespeichert werden. Das Schlüsselwort `public` macht Variablen von außerhalb eines Vertrags zugänglich und erstellt eine Funktion, die andere Verträge oder Clients aufrufen können, um auf den Wert zuzugreifen. + string public message; + + // Ähnlich wie in vielen klassenbasierten objektorientierten Sprachen ist ein Konstruktor eine spezielle Funktion, die nur bei der Erstellung des Vertrags ausgeführt wird. + // Konstruktoren werden verwendet, um die Daten des Vertrags zu initialisieren. Mehr erfahren:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // Akzeptiert ein String-Argument `initMessage` und setzt den Wert in die Speichervariable `message` des Vertrags). + message = initMessage; + } + + // Eine öffentliche Funktion, die ein String-Argument akzeptiert und die Speichervariable `message` aktualisiert. + function update(string memory newMessage) public { + string memory oldMsg = message; + message = newMessage; + emit UpdatedMessages(oldMsg, newMessage); + } +} +``` + +Smart-Contract-Ereignisse sind eine Möglichkeit für Ihren Vertrag, Ihrer Frontend-Anwendung mitzuteilen, dass auf der Blockchain etwas passiert ist (d. h. es gab ein _Ereignis_), die auf bestimmte Ereignisse „hören“ und bei deren Eintreten Maßnahmen ergreifen kann. + +Die `addSmartContractListener`-Funktion wird speziell auf das `UpdatedMessages`-Ereignis unseres Hallo-Welt-Smart-Contracts lauschen und unsere Benutzeroberfläche aktualisieren, um die neue Nachricht anzuzeigen. + +Ändern Sie `addSmartContractListener` in Folgendes: + +```javascript +// HelloWorld.js + +function addSmartContractListener() { + helloWorldContract.events.UpdatedMessages({}, (error, data) => { + if (error) { + setStatus("😥 " + error.message) + } else { + setMessage(data.returnValues[1]) + setNewMessage("") + setStatus("🎉 Ihre Nachricht wurde aktualisiert!") + } + }) +} +``` + +Lassen Sie uns aufschlüsseln, was passiert, wenn der Listener ein Ereignis erkennt: + +- Wenn ein Fehler auftritt, wenn das Ereignis ausgegeben wird, wird dies in der Benutzeroberfläche über unsere `status`-Zustandsvariable angezeigt. +- Andernfalls verwenden wir das zurückgegebene `data`-Objekt. Das `data.returnValues` ist ein bei Null indiziertes Array, bei dem das erste Element im Array die vorherige Nachricht und das zweite Element die aktualisierte speichert. Insgesamt werden wir bei einem erfolgreichen Ereignis unseren `message`-String auf die aktualisierte Nachricht setzen, den `newMessage`-String leeren und unsere `status`-Zustandsvariable aktualisieren, um anzuzeigen, dass eine neue Nachricht in unserem Smart Contract veröffentlicht wurde. + +Schließlich rufen wir unseren Listener in unserer `useEffect`-Funktion auf, damit er beim ersten Rendern der `HelloWorld.js`-Komponente initialisiert wird. Insgesamt sollte Ihre `useEffect`-Funktion so aussehen: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() +}, []) +``` + +Jetzt, da wir in der Lage sind, aus unserem Smart Contract zu lesen, wäre es großartig herauszufinden, wie wir auch in ihn schreiben können! Um jedoch in unsere Dapp zu schreiben, müssen wir zuerst eine Ethereum-Wallet damit verbunden haben. + +Als Nächstes werden wir uns also mit der Einrichtung unserer Ethereum-Wallet (MetaMask) befassen und sie dann mit unserer Dapp verbinden! + +### Schritt 4: Richten Sie Ihre Ethereum-Wallet ein {#step-4-set-up-your-ethereum-wallet} + +Um etwas in die Ethereum-Chain zu schreiben, müssen Benutzer Transaktionen mit den privaten Schlüsseln ihrer virtuellen Wallet signieren. Für dieses Tutorial verwenden wir [MetaMask](https://metamask.io/), eine virtuelle Wallet im Browser, die zur Verwaltung Ihrer Ethereum-Kontoadresse verwendet wird, da sie diese Transaktionssignierung für den Endbenutzer super einfach macht. + +Wenn Sie mehr darüber erfahren möchten, wie Transaktionen auf Ethereum funktionieren, sehen Sie sich [diese Seite](/developers/docs/transactions/) der Ethereum Foundation an. + +#### MetaMask herunterladen {#download-metamask} + +Sie können MetaMask [hier](https://metamask.io/download) kostenlos herunterladen und ein Konto erstellen. Wenn Sie ein Konto erstellen oder bereits eines haben, stellen Sie sicher, dass Sie oben rechts zum „Goerli Test Network“ wechseln (damit wir nicht mit echtem Geld arbeiten). + +#### Ether aus einem Faucet hinzufügen {#add-ether-from-a-faucet} + +Um eine Transaktion auf der Ethereum-Blockchain zu signieren, benötigen wir einige gefälschte Eth. Um Eth zu erhalten, können Sie zu [FaucETH](https://fauceth.komputing.org) gehen und Ihre Goerli-Kontoadresse eingeben, auf „Geld anfordern“ klicken, dann im Dropdown-Menü „Ethereum Testnet Goerli“ auswählen und schließlich erneut auf die Schaltfläche „Geld anfordern“ klicken. Kurz darauf solltest du ETH in deinem MetaMask-Konto sehen! + +#### Überprüfen Sie Ihr Guthaben {#check-your-balance} + +Um zu überprüfen, ob unser Guthaben vorhanden ist, machen wir eine [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)-Anfrage mit dem [Composer-Tool von Alchemy](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Dies gibt den Betrag an ETH in unserer Wallet zurück. Nachdem Sie die Adresse Ihres MetaMask-Kontos eingegeben und auf “Send Request” (Anforderung senden) geklickt haben, sollten Sie eine Antwort ähnlich der Folgenden erhalten: + +```text +{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} +``` + +**HINWEIS:** Dieses Ergebnis ist in Wei, nicht in ETH. Wei ist die kleinste Einheit von Ether. Die Umrechnung von Wei in ETH ist: 1 ETH = 10¹⁸ Wei. Wenn wir also 0xde0b6b3a7640000 in eine Dezimalzahl umwandeln, erhalten wir 1\*10¹⁸, was 1 ETH entspricht. + +Puh! Unser Falschgeld ist da! 🤑 + +### Schritt 5: MetaMask mit Ihrer Benutzeroberfläche verbinden {#step-5-connect-metamask-to-your-UI} + +Nachdem unsere MetaMask-Wallet nun eingerichtet ist, verbinden wir unsere Dapp damit! + +#### Die `connectWallet`-Funktion {#the-connectWallet-function} + +In unserer `interact.js`-Datei implementieren wir die `connectWallet`-Funktion, die wir dann in unserer `HelloWorld.js`-Komponente aufrufen können. + +Lassen Sie uns `connectWallet` wie folgt ändern: + +```javascript +// interact.js + +export const connectWallet = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_requestAccounts", + }) + const obj = { + status: "👆🏽 Schreiben Sie eine Nachricht in das Textfeld oben.", + address: addressArray[0], + } + return obj + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

+ {" "} + 🦊 + Sie müssen MetaMask, eine virtuelle Ethereum-Wallet, in Ihrem + Browser installieren. + +

+
+ ), + } + } +} +``` + +Also, was macht dieser riesige Codeblock genau? + +Zuerst prüft er, ob `window.ethereum` in Ihrem Browser aktiviert ist. + +`window.ethereum` ist eine globale API, die von MetaMask und anderen Wallet-Anbietern eingeschleust wird und es Websites ermöglicht, die Ethereum-Konten von Benutzern anzufordern. Wenn genehmigt, kann es Daten von den Blockchains lesen, mit denen der Benutzer verbunden ist, und dem Benutzer vorschlagen, Nachrichten und Transaktionen zu signieren. Weitere Informationen findest du in der [MetaMask-Dokumentation](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents)! + +Wenn `window.ethereum` _nicht_ vorhanden ist, bedeutet das, dass MetaMask nicht installiert ist. Dies führt dazu, dass ein JSON-Objekt zurückgegeben wird, bei dem die zurückgegebene `address` eine leere Zeichenfolge ist und das `status`-JSX-Objekt meldet, dass der Benutzer MetaMask installieren muss. + +Wenn `window.ethereum` jedoch vorhanden _ist_, dann wird es interessant. + +Mithilfe einer try/catch-Schleife versuchen wir, eine Verbindung zu MetaMask herzustellen, indem wir [`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts) aufrufen. Der Aufruf dieser Funktion öffnet MetaMask im Browser, woraufhin der Benutzer aufgefordert wird, seine Wallet mit deiner Dapp zu verbinden. + +- Wenn der Benutzer sich entscheidet, eine Verbindung herzustellen, gibt `method: "eth_requestAccounts"` ein Array zurück, das alle Konto-Adressen des Benutzers enthält, die mit der Dapp verbunden sind. Insgesamt gibt unsere `connectWallet`-Funktion ein JSON-Objekt zurück, das die _erste_ `address` in diesem Array (siehe Zeile 9) und eine `status`-Nachricht enthält, die den Benutzer auffordert, eine Nachricht an den Smart Contract zu schreiben. +- Wenn der Benutzer die Verbindung ablehnt, enthält das JSON-Objekt eine leere Zeichenfolge für die zurückgegebene `address` und eine `status`-Nachricht, die widerspiegelt, dass der Benutzer die Verbindung abgelehnt hat. + +Nachdem wir diese `connectWallet`-Funktion geschrieben haben, ist der nächste Schritt, sie in unserer `HelloWorld.js`-Komponente aufzurufen. + +#### Die `connectWallet`-Funktion zu Ihrer `HelloWorld.js`-UI-Komponente hinzufügen {#add-the-connectWallet-function-to-your-HelloWorld-js-ui-component} + +Navigieren Sie zur `connectWalletPressed`-Funktion in `HelloWorld.js` und aktualisieren Sie sie wie folgt: + +```javascript +// HelloWorld.js + +const connectWalletPressed = async () => { + const walletResponse = await connectWallet() + setStatus(walletResponse.status) + setWallet(walletResponse.address) +} +``` + +Beachten Sie, wie der größte Teil unserer Funktionalität von unserer `HelloWorld.js`-Komponente aus der `interact.js`-Datei abstrahiert wird? Dies geschieht, damit wir dem M-V-C-Paradigma entsprechen! + +In `connectWalletPressed` machen wir einfach einen Await-Aufruf an unsere importierte `connectWallet`-Funktion, und mit ihrer Antwort aktualisieren wir unsere `status`- und `walletAddress`-Variablen über ihre State-Hooks. + +Lassen Sie uns nun beide Dateien (`HelloWorld.js` und `interact.js`) speichern und unsere bisherige Benutzeroberfläche testen. + +Öffnen Sie Ihren Browser auf der Seite [http://localhost:3000/](http://localhost:3000/) und drücken Sie die Schaltfläche „Wallet verbinden“ oben rechts auf der Seite. + +Wenn du MetaMask installiert hast, solltest du aufgefordert werden, deine Wallet mit deiner Dapp zu verbinden. Akzeptiere die Aufforderung, eine Verbindung herzustellen. + +Sie sollten sehen, dass die Wallet-Schaltfläche nun anzeigt, dass Ihre Adresse verbunden ist! Jaaaaa 🔥 + +Als Nächstes versuche, die Seite neu zu laden ... Das ist seltsam. Unsere Wallet-Schaltfläche fordert uns auf, MetaMask zu verbinden, obwohl es bereits verbunden ist ... + +Aber keine Angst! Wir können das leicht adressieren (verstanden?) indem wir `getCurrentWalletConnected` implementieren, das prüft, ob eine Adresse bereits mit unserer Dapp verbunden ist, und unsere Benutzeroberfläche entsprechend aktualisiert! + +#### Die `getCurrentWalletConnected`-Funktion {#the-getcurrentwalletconnected-function} + +Aktualisieren Sie Ihre `getCurrentWalletConnected`-Funktion in der `interact.js`-Datei wie folgt: + +```javascript +// interact.js + +export const getCurrentWalletConnected = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_accounts", + }) + if (addressArray.length > 0) { + return { + address: addressArray[0], + status: "👆🏽 Schreiben Sie eine Nachricht in das Textfeld oben.", + } + } else { + return { + address: "", + status: "🦊 Verbinden Sie sich mit MetaMask über die Schaltfläche oben rechts.", + } + } + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

+ {" "} + 🦊 + Sie müssen MetaMask, eine virtuelle Ethereum-Wallet, in Ihrem + Browser installieren. + +

+
+ ), + } + } +} +``` + +Dieser Code ist _sehr_ ähnlich der `connectWallet`-Funktion, die wir gerade im vorherigen Schritt geschrieben haben. + +Der Hauptunterschied besteht darin, dass wir anstelle der Methode `eth_requestAccounts`, die MetaMask für den Benutzer öffnet, um seine Wallet zu verbinden, hier die Methode `eth_accounts` aufrufen, die einfach ein Array zurückgibt, das die MetaMask-Adressen enthält, die derzeit mit unserer Dapp verbunden sind. + +Um diese Funktion in Aktion zu sehen, rufen wir sie in unserer `useEffect`-Funktion unserer `HelloWorld.js`-Komponente auf: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() + + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) +}, []) +``` + +Beachte, dass wir die Antwort unseres Aufrufs an `getCurrentWalletConnected` verwenden, um unsere `walletAddress`- und `status`-Zustandsvariablen zu aktualisieren. + +Nachdem Sie diesen Code hinzugefügt haben, versuchen wir, unser Browserfenster zu aktualisieren. + +Nett! Die Schaltfläche sollte anzeigen, dass du verbunden bist, und eine Vorschau der Adresse deiner verbundenen Wallet anzeigen – auch nach dem Aktualisieren! + +#### Implementieren Sie `addWalletListener` {#implement-addwalletlistener} + +Der letzte Schritt in der Einrichtung unserer Dapp-Wallet ist die Implementierung des Wallet-Listeners, damit unsere Benutzeroberfläche aktualisiert wird, wenn sich der Zustand unserer Wallet ändert, z. B. wenn der Benutzer die Verbindung trennt oder das Konto wechselt. + +Ändern Sie in Ihrer `HelloWorld.js`-Datei Ihre `addWalletListener`-Funktion wie folgt: + +```javascript +// HelloWorld.js + +function addWalletListener() { + if (window.ethereum) { + window.ethereum.on("accountsChanged", (accounts) => { + if (accounts.length > 0) { + setWallet(accounts[0]) + setStatus("👆🏽 Schreiben Sie eine Nachricht in das Textfeld oben.") + } else { + setWallet("") + setStatus("🦊 Verbinden Sie sich mit MetaMask über die Schaltfläche oben rechts.") + } + }) + } else { + setStatus( +

+ {" "} + 🦊 + Sie müssen MetaMask, eine virtuelle Ethereum-Wallet, in Ihrem Browser installieren. + +

+ ) + } +} +``` + +Ich wette, Sie brauchen an dieser Stelle nicht einmal mehr unsere Hilfe, um zu verstehen, was hier vor sich geht, aber aus Gründen der Vollständigkeit, lassen Sie es uns schnell aufschlüsseln: + +- Zuerst prüft unsere Funktion, ob `window.ethereum` aktiviert ist (d. h. MetaMask ist installiert). + - Wenn nicht, setzen wir einfach unsere `status`-Zustandsvariable auf eine JSX-Zeichenfolge, die den Benutzer auffordert, MetaMask zu installieren. + - Wenn es aktiviert ist, richten wir den Listener `window.ethereum.on("accountsChanged")` in Zeile 3 ein, der auf Zustandsänderungen in der MetaMask-Wallet lauscht. Dazu gehören, wenn der Benutzer ein zusätzliches Konto mit der Dapp verbindet, Konten wechselt oder ein Konto trennt. Wenn mindestens ein Konto verbunden ist, wird die Zustandsvariable `walletAddress` als das erste Konto im `accounts`-Array aktualisiert, das vom Listener zurückgegeben wird. Andernfalls wird `walletAddress` als leere Zeichenfolge festgelegt. + +Zu guter Letzt müssen wir sie in unserer `useEffect`-Funktion aufrufen: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() + + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) + + addWalletListener() +}, []) +``` + +Und das war's! Wir haben erfolgreich die gesamte Funktionalität unserer Wallet programmiert! Jetzt zu unserer letzten Aufgabe: die im Smart Contract gespeicherte Nachricht aktualisieren! + +### Schritt 6: Implementieren der `updateMessage`-Funktion {#step-6-implement-the-updateMessage-function} + +Also gut, Leute, wir sind auf der Zielgeraden! In `updateMessage` Ihrer `interact.js`-Datei werden wir Folgendes tun: + +1. Sicherstellen, dass die Nachricht, die wir in unserem Smart Contact veröffentlichen möchten, gültig ist +2. Unsere Transaktion mit MetaMask signieren +3. Diese Funktion aus unserer `HelloWorld.js`-Frontend-Komponente aufrufen + +Das wird nicht lange dauern; lassen Sie uns diese Dapp fertigstellen! + +#### Fehlerbehandlung bei der Eingabe {#input-error-handling} + +Natürlich ist es sinnvoll, am Anfang der Funktion eine Art Eingabefehlerbehandlung zu haben. + +Wir möchten, dass unsere Funktion frühzeitig zurückkehrt, wenn keine MetaMask-Erweiterung installiert ist, keine Wallet verbunden ist (d. h. die übergebene `address` ein leerer String ist) oder die `message` ein leerer String ist. Fügen wir die folgende Fehlerbehandlung zu `updateMessage` hinzu: + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + if (!window.ethereum || address === null) { + return { + status: + "💡 Verbinden Sie Ihre MetaMask-Wallet, um die Nachricht auf der Blockchain zu aktualisieren.", + } + } + + if (message.trim() === "") { + return { + status: "❌ Ihre Nachricht darf kein leerer String sein.", + } + } +} +``` + +Jetzt, da wir eine ordnungsgemäße Eingabefehlerbehandlung haben, ist es Zeit, die Transaktion über MetaMask zu signieren! + +#### Unsere Transaktion signieren {#signing-our-transaction} + +Wenn Sie bereits mit traditionellen Web3-Ethereum-Transaktionen vertraut sind, wird Ihnen der Code, den wir als Nächstes schreiben, sehr bekannt vorkommen. Fügen Sie unterhalb Ihres Eingabefehlerbehandlungscodes Folgendes zu `updateMessage` hinzu: + +```javascript +// interact.js + +//Transaktionsparameter einrichten +const transactionParameters = { + to: contractAddress, // Erforderlich, außer bei der Veröffentlichung von Verträgen. + from: address, // muss mit der aktiven Adresse des Benutzers übereinstimmen. + data: helloWorldContract.methods.update(message).encodeABI(), +} + +// Transaktion signieren +try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + status: ( + + ✅{" "} + + Sehen Sie sich den Status Ihrer Transaktion auf Etherscan an! + +
+ ℹ️ Sobald die Transaktion vom Netzwerk verifiziert ist, wird die Nachricht + automatisch aktualisiert. +
+ ), + } +} catch (error) { + return { + status: "😥 " + error.message, + } +} +``` + +Schauen wir uns an, was hier passiert. Zuerst richten wir unsere Transaktionsparameter ein, wobei: + +- `to` gibt die Empfängeradresse an (unser Smart Contract) +- `from` gibt den Unterzeichner der Transaktion an, die `address`-Variable, die wir in unsere Funktion übergeben haben +- `data` enthält den Aufruf der `update`-Methode unseres Hallo-Welt-Smart-Contracts, der unsere `message`-String-Variable als Eingabe erhält + +Dann machen wir einen await-Aufruf, `window.ethereum.request`, bei dem wir MetaMask bitten, die Transaktion zu signieren. Beachten Sie, in den Zeilen 11 und 12 geben wir unsere eth-Methode `eth_sendTransaction` an und übergeben unsere `transactionParameters`. + +An diesem Punkt öffnet sich MetaMask im Browser und fordert den Benutzer auf, die Transaktion zu signieren oder abzulehnen. + +- Wenn die Transaktion erfolgreich ist, gibt die Funktion ein JSON-Objekt zurück, bei dem der `status`-JSX-String den Benutzer auffordert, Etherscan für weitere Informationen zu seiner Transaktion zu besuchen. +- Wenn die Transaktion fehlschlägt, gibt die Funktion ein JSON-Objekt zurück, bei dem der `status`-String die Fehlermeldung weitergibt. + +Insgesamt sollte unsere `updateMessage`-Funktion so aussehen: + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + //Eingabefehlerbehandlung + if (!window.ethereum || address === null) { + return { + status: + "💡 Verbinden Sie Ihre MetaMask-Wallet, um die Nachricht auf der Blockchain zu aktualisieren.", + } + } + + if (message.trim() === "") { + return { + status: "❌ Ihre Nachricht darf kein leerer String sein.", + } + } + + //Transaktionsparameter einrichten + const transactionParameters = { + to: contractAddress, // Erforderlich, außer bei der Veröffentlichung von Verträgen. + from: address, // muss mit der aktiven Adresse des Benutzers übereinstimmen. + data: helloWorldContract.methods.update(message).encodeABI(), + } + + // Transaktion signieren + try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + status: ( + + ✅{" "} + + Sehen Sie sich den Status Ihrer Transaktion auf Etherscan an! + +
+ ℹ️ Sobald die Transaktion vom Netzwerk verifiziert ist, wird die Nachricht + automatisch aktualisiert. +
+ ), + } + } catch (error) { + return { + status: "😥 " + error.message, + } + } +} +``` + +Zu guter Letzt müssen wir unsere `updateMessage`-Funktion mit unserer `HelloWorld.js`-Komponente verbinden. + +#### Verbinden Sie `updateMessage` mit dem `HelloWorld.js`-Frontend {#connect-updatemessage-to-the-helloworld-js-frontend} + +Unsere `onUpdatePressed`-Funktion sollte einen await-Aufruf an die importierte `updateMessage`-Funktion machen und die `status`-Zustandsvariable ändern, um anzuzeigen, ob unsere Transaktion erfolgreich war oder fehlgeschlagen ist: + +```javascript +// HelloWorld.js + +const onUpdatePressed = async () => { + const { status } = await updateMessage(walletAddress, newMessage) + setStatus(status) +} +``` + +Es ist super sauber und einfach. Und raten Sie mal... IHRE DAPP IST FERTIG!!! + +Probieren Sie die **Aktualisieren**-Schaltfläche aus! + +### Erstellen Sie Ihre eigene benutzerdefinierte Dapp {#make-your-own-custom-dapp} + +Wooooo, Sie haben es bis zum Ende des Tutorials geschafft! Zusammenfassend haben Sie gelernt, wie Sie: + +- Eine MetaMask-Wallet mit Ihrem Dapp-Projekt verbinden +- Daten aus Ihrem Smart Contract mit der [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) API lesen +- Ethereum-Transaktionen mit MetaMask signieren + +Jetzt sind Sie voll ausgestattet, um die Fähigkeiten aus diesem Tutorial anzuwenden, um Ihr eigenes benutzerdefiniertes Dapp-Projekt zu erstellen! Wie immer, wenn Sie Fragen haben, zögern Sie nicht, uns im [Alchemy Discord](https://discord.gg/gWuC7zB) um Hilfe zu bitten. 🧙‍♂️ + +Sobald Sie dieses Tutorial abgeschlossen haben, lassen Sie uns wissen, wie Ihre Erfahrung war oder ob Sie Feedback haben, indem Sie uns auf Twitter [@alchemyplatform](https://twitter.com/AlchemyPlatform) taggen! diff --git a/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md index 1519d397971..e021dee6f14 100644 --- a/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md @@ -1,68 +1,71 @@ --- title: Hello World-Smart Contract für Einsteiger -description: Einführungstutorial zum Schreiben und Installieren eines einfachen Smart Contracts auf Ethereum +description: Einführungstutorial zum Schreiben und Bereitstellen eines einfachen Smart Contracts auf Ethereum. author: "elanh" tags: - - "Solidity" - - "Hardhat" - - "Alchemy" - - "Smart Contracts" - - "Erste Schritte" - - "Bereitstellung" + [ + "solidity", + "Hardhat", + "Alchemy", + "intelligente Verträge", + "Bereitstellung" + ] skill: beginner lang: de published: 2021-03-31 --- -Wenn Sie neu in der Blockchain-Entwicklung sind und nicht wissen, wo Sie anfangen sollen, oder wenn Sie einfach nur verstehen wollen, wie man Smart Contracts einsetzt und mit ihnen interagiert, ist dieser Leitfaden genau das Richtige für Sie. Wir werden die Erstellung und den Einsatz eines einfachen Smart Contracts auf dem Ropsten-Testnet unter Verwendung einer virtuellen Wallet erläutern ([MetaMask](https://metamask.io/)), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) and [Alchemy](https://alchemyapi.io/eth) (Machen Sie sich keine Sorgen, wenn Sie noch nicht verstehen, was das alles bedeutet. Wir werden es Ihnen erklären). +Wenn Sie neu in der Blockchain-Entwicklung sind und nicht wissen, wo Sie anfangen sollen, oder wenn Sie einfach nur verstehen wollen, wie man Smart Contracts einsetzt und mit ihnen interagiert, ist dieser Leitfaden genau das Richtige für Sie. Wir werden die Erstellung und Bereitstellung eines einfachen Smart Contracts im Sepolia-Testnetz durchgehen. Dabei verwenden wir eine virtuelle Wallet ([MetaMask](https://metamask.io/)), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) und [Alchemy](https://www.alchemy.com/eth) (keine Sorge, falls Sie noch nicht verstehen, was das alles bedeutet – wir werden es erklären). -Im zweiten Teil dieses Tutorials werden wir erläutern, wie wir mit unserem Smart Contract interagieren können, sobald er bereitgestellt wurde. Im dritten Teil erläutern wir dann, wie er auf Etherscan veröffentlicht wird. +In [Teil 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) dieses Tutorials gehen wir durch, wie wir mit unserem Smart Contract interagieren können, sobald er bereitgestellt wurde. In [Teil 3](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) behandeln wir dann, wie man ihn auf Etherscan veröffentlicht. -Wenn Sie zu irgendeinem Zeitpunkt Fragen haben, dann können Sie sich im [Alchemy Discord](https://discord.gg/gWuC7zB) melden. +Wenn Sie zu irgendeinem Zeitpunkt Fragen haben, können Sie sich gerne im [Alchemy Discord](https://discord.gg/gWuC7zB) melden! -## Schritt 1: Verbindung mit dem Ethereum-Netzwerk {#step-1} +## Schritt 1: Mit dem Ethereum-Netzwerk verbinden {#step-1} -Es gibt viele Möglichkeiten, Anfragen an die Ethereum-Chain zu stellen. Der Einfachheit halber verwenden wir ein kostenloses Konto bei Alchemy, eine Blockchain-Entwicklerplattform und API, die es uns ermöglicht, mit der Ethereum-Chain zu kommunizieren, ohne dass wir unseren eigenen Node betreiben müssen. Die Plattform verfügt auch über Entwickler-Tools für die Überwachung und Analyse, die wir in diesem Tutorial nutzen werden, um zu verstehen, was unter der Haube der Smart-Contract-Bereitstellung vor sich geht. Wenn Sie noch kein Alchemy-Konto haben, [können Sie sich hier kostenlos anmelden](https://dashboard.alchemyapi.io/signup). +Es gibt viele Möglichkeiten, Anfragen an die Ethereum-Chain zu stellen. Der Einfachheit halber verwenden wir ein kostenloses Konto bei Alchemy, eine Blockchain-Entwicklerplattform und API, die es uns ermöglicht, mit der Ethereum-Chain zu kommunizieren, ohne dass wir unsere eigenen Nodes betreiben müssen. Die Plattform verfügt auch über Entwickler-Tools für die Überwachung und Analyse, die wir in diesem Tutorial nutzen werden, um zu verstehen, was bei der Bereitstellung unseres Smart Contracts „unter der Haube“ passiert. Wenn Sie noch kein Alchemy-Konto haben, [können Sie sich hier kostenlos registrieren](https://dashboard.alchemy.com/signup). -## Schritt 2: Anwendung (und den API-Schlüssel) erstellen {#step-2} +## Schritt 2: Ihre App (und den API-Schlüssel) erstellen {#step-2} -Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel generieren. Erstellen Sie dafür eine App. Darüber können wir Anfragen an das Ropsten-Testnet stellen. Wenn Sie mit Testnets nicht vertraut sind, lesen Sie [diese Seite](/developers/docs/networks/). +Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel generieren. Erstellen Sie dafür eine App. Dies ermöglicht es uns, Anfragen an das Sepolia-Testnet zu senden. Wenn Sie mit Testnets nicht vertraut sind, sehen Sie sich [diese Seite](/developers/docs/networks/) an. -1. Klicken Sie in Ihrem Alchemy-Dashboard in der Navigationsleiste unter "Apps" auf "Create App" (App erstellen), um auf die Seite "Create App" (App erstellen) zu gelangen. +1. Navigieren Sie in Ihrem Alchemy-Dashboard zur Seite „Create new app“, indem Sie in der Navigationsleiste „Select an app“ auswählen und dann auf „Create new app“ klicken. -![Hello World-App erstellen](./hello-world-create-app.png) +![Hallo Welt App erstellen](./hello-world-create-app.png) -2. Nennen Sie Ihre App "Hello World", geben Sie eine kurze Beschreibung an, wählen Sie "Staging" für die Umgebung (die für die Buchhaltung Ihrer App verwendet wird) und wählen Sie "Ropsten" als Netzwerk. +2. Geben Sie Ihrer App den Namen „Hello World“, fügen Sie eine kurze Beschreibung hinzu und wählen Sie einen Anwendungsfall aus, z. B. „Infra & Tooling“. Suchen Sie als Nächstes nach „Ethereum“ und wählen Sie das Netzwerk aus. -![Hello World-App-Ansicht erstellen](./create-app-view-hello-world.png) +![App-Ansicht erstellen Hallo Welt](./create-app-view-hello-world.png) -3. Klicken Sie auf “Create app” (App erstellen) und schon sind Sie fertig. Die App sollte in der untenstehenden Tabelle erscheinen. +3. Klicken Sie zum Fortfahren auf „Next“, dann auf „Create app“ und das war's schon! Ihre App sollte im Dropdown-Menü der Navigationsleiste erscheinen, und ein API-Schlüssel steht zum Kopieren bereit. ## Schritt 3: Ethereum-Konto (Adresse) erstellen {#step-3} -Wir benötigen ein Ethereum-Konto, um Transaktionen zu senden und zu empfangen. In diesem Tutorial verwenden wir MetaMask, eine virtuelle Wallet im Browser, mit der Sie Ihre Ethereum-Kontoadresse verwalten können. Weitere Informationen zu [Transaktionen](/developers/docs/transactions/). +Zum Versenden und Empfangen von Transaktionen benötigen Sie ein Ethereum-Konto. In diesem Tutorial verwenden wir MetaMask, eine virtuelle Wallet im Browser, mit der Sie Ihre Ethereum-Kontoadresse verwalten können. Mehr zu [Transaktionen](/developers/docs/transactions/). -Sie können MetaMask [hier](https://metamask.io/download) kostenlos herunterladen und ein Konto erstellen. Wenn Sie ein Konto erstellen oder wenn Sie bereits ein Konto haben, stellen Sie sicher, dass Sie oben rechts zum "Ropsten-Testnet" wechseln (damit wir nicht mit echtem Geld arbeiten). +Sie können MetaMask herunterladen und [hier](https://metamask.io/download) kostenlos ein Ethereum-Konto erstellen. Wenn Sie ein Konto erstellen oder bereits eines haben, wechseln Sie über das Netzwerk-Dropdown-Menü unbedingt zum Testnetz „Sepolia“ (damit wir nicht mit echtem Geld arbeiten). -![Beispiel MetaMask Ropsten](./metamask-ropsten-example.png) +Wenn Sepolia nicht aufgeführt ist, gehen Sie in das Menü, dann auf „Advanced“ und scrollen Sie nach unten, um „Show test networks“ zu aktivieren. Wählen Sie im Netzwerkauswahlmenü die Registerkarte „Custom“, um eine Liste von Testnets zu finden, und wählen Sie „Sepolia“ aus. + +![MetaMask Sepolia Beispiel](./metamask-sepolia-example.png) ## Schritt 4: Ether von einem Faucet hinzufügen {#step-4} -Um unseren Smart Contract im Testnet einzusetzen, benötigen wir einige Fake-ETH. Um ETH zu erhalten, können Sie auf den [Ropsten Faucet](https://faucet.dimensions.network/) gehen und Ihre Ropsten-Kontoadresse eingeben. Klicken Sie dann auf "Ropsten-ETH senden". Aufgrund des Netzwerkverkehrs kann es einige Zeit dauern, bis Sie Ihre Fake-ETH erhalten. Sie sollten kurz darauf ETH auf Ihrem MetaMask-Konto sehen. +Um unseren Smart Contract im Testnetz bereitzustellen, benötigen wir etwas „Fake-ETH“. Um Sepolia-ETH zu erhalten, können Sie zu den [Details des Sepolia-Netzwerks](/developers/docs/networks/#sepolia) gehen, um eine Liste verschiedener Faucets anzuzeigen. Wenn einer nicht funktioniert, versuchen Sie einen anderen, da sie manchmal leer sein können. Aufgrund des Netzwerkverkehrs kann es einige Zeit dauern, bis Sie Ihre Fake-ETH erhalten. Sie sollten kurz darauf ETH auf Ihrem MetaMask-Konto sehen! -## Schritt 5: Guthaben prüfen {#step-5} +## Schritt 5: Ihr Guthaben überprüfen {#step-5} -Um unser Guthaben zu überprüfen, müssen wir eine [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)-Anfrage mit dem [dem Composer-Tool von Alchemy](https://composer.alchemyapi.io?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D) stellen. Dadurch wird der Betrag der ETH in unsere Wallet zurückgegeben. Nachdem Sie die Adresse Ihres MetaMask-Kontos eingegeben und auf "Anfrage senden" geklickt haben, sollten Sie eine Antwort wie diese erhalten: +Um zu überprüfen, ob unser Guthaben vorhanden ist, stellen wir eine [eth_getBalance](/developers/docs/apis/json-rpc/#eth_getbalance)-Anfrage mit dem [Composer-Tool von Alchemy](https://sandbox.alchemy.com/?network=ETH_SEPOLIA&method=eth_getBalance&body.id=1&body.jsonrpc=2.0&body.method=eth_getBalance&body.params%5B0%5D=&body.params%5B1%5D=latest). Das gibt den ETH-Betrag in unserem Wallet wieder. Nachdem Sie die Adresse Ihres MetaMask-Kontos eingegeben und auf “Send Request” (Anforderung senden) geklickt haben, sollten Sie eine Antwort ähnlich der Folgenden erhalten: ```json { "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" } ``` -> **HINWEIS:** Dieses Ergebnis ist in Wei und nicht in ETH. Wei ist die kleinste Einheit von Ether. Die Umrechnung von Wei auf ETH ist: 1 ETH = 1018 Wei. Wenn wir also 0x2B5E3AF16B1880000 in eine Dezimalzahl konvertieren, bekommen wir 5\*10¹⁸. Das entspricht 5 ETH. +> **HINWEIS:** Dieses Ergebnis ist in Wei und nicht in ETH angegeben. Wei ist die kleinste Einheit von Ether. Die Umrechnung von Wei in ETH lautet: 1 ETH = 1018 Wei. Wenn wir also 0x2B5E3AF16B1880000 in eine Dezimalzahl umwandeln, erhalten wir 5\*10¹⁸, was 5 ETH entspricht. > -> Puh! Unser Falschgeld ist da . +> Puh! Unser Fake-Geld ist da . -## Schritt 6: Projekt initialisieren {#step-6} +## Schritt 6: Unser Projekt initialisieren {#step-6} Zunächst müssen wir einen Ordner für unser Projekt erstellen. Navigieren Sie zur Befehlszeile und geben Sie Folgendes ein: @@ -71,24 +74,24 @@ mkdir hello-world cd hello-world ``` -Wir befinden uns nun in unserem Projektordner. Mit `npm init` starten wir das Projekt. Wenn Sie npm noch nicht installiert haben, befolgen Sie [diese Anleitung](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (wir brauchen auch Node.js, also laden Sie das auch herunter). +Da wir uns nun in unserem Projektordner befinden, verwenden wir `npm init`, um das Projekt zu initialisieren. Wenn Sie npm noch nicht installiert haben, folgen Sie [dieser Anleitung](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (wir benötigen auch Node.js, also laden Sie das auch herunter!). ``` npm init ``` -Es spielt keine Rolle, wie Sie die Fragen zur Installation beantworten. Wir haben es folgendermaßen gemacht: +Es spielt keine große Rolle, wie Sie die Installationsfragen beantworten. Zu Ihrer Orientierung zeigen wir Ihnen, wie wir es gemacht haben: ``` -package name: (hello-world) -version: (1.0.0) -description: hello world smart contract -entry point: (index.js) -test command: -git repository: -keywords: -author: -license: (ISC) +Paketname: (hello-world) +Version: (1.0.0) +Beschreibung: hello world smart contract +Einstiegspunkt: (index.js) +Testbefehl: +Git-Repository: +Schlüsselwörter: +Autor: +Lizenz: (ISC) About to write to /Users/.../.../.../hello-world/package.json: { @@ -104,29 +107,29 @@ About to write to /Users/.../.../.../hello-world/package.json: } ``` -Genehmigen Sie die package.json und es kann losgehen. +Bestätigen Sie die package.json und schon kann es losgehen! -## Schritt 7: [Hardhat](https://hardhat.org/getting-started/#overview){#step-7} installieren +## Schritt 7: [Hardhat](https://hardhat.org/getting-started/#overview) herunterladen {#step-7} -Hardhat ist eine Entwicklungsumgebung zum Kompilieren, Bereitstellen, Testen und Debuggen Ihrer Ethereum-Software. Es hilft Entwicklern bei der lokalen Erstellung von Smart Contracts und dApps, bevor diese auf der Live-Chain bereitgestellt werden. +Hardhat ist eine Entwicklungsumgebung zum Kompilieren, Bereitstellen, Testen und Debuggen Ihrer Ethereum-Software. Es hilft Entwicklern Smart Contracts und dApps lokal zu erstellen, bevor diese auf der Live-Chain bereitgestellt werden. -Führen Sie innerhalb unseres `hello-world`-Projekts folgenden Befehl aus: +Führen Sie in unserem `hello-world`-Projekt Folgendes aus: ``` npm install --save-dev hardhat ``` -Auf dieser Seite finden Sie weitere Informationen zur [Installationsanleitung](https://hardhat.org/getting-started/#overview). +Weitere Details zu den [Installationsanweisungen](https://hardhat.org/getting-started/#overview) finden Sie auf dieser Seite. ## Schritt 8: Hardhat-Projekt erstellen {#step-8} -Führen Sie in unserem Projektordner folgenden Befehl aus: +Führen Sie folgeden Befehl in unserem Projektordner aus: ``` npx hardhat ``` -Sie sollten eine Willkommensnachricht sehen und die Möglichkeit haben, auszuwählen, was Sie tun möchten. Wählen Sie "create an empty hardhat.config.js" (Eine leere hardhat.config.js erstellen): +Sie sollten dann eine Willkommensnachricht sehen und die Möglichkeit haben, auszuwählen, wie Sie fortfahren möchten. Wählen Sie "create an empty hardhat.config.js" (Leere hardhat.config.js erstellen) aus: ``` 888 888 888 888 888 @@ -138,114 +141,112 @@ Sie sollten eine Willkommensnachricht sehen und die Möglichkeit haben, auszuwä 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 -👷 Welcome to Hardhat v2.0.11 👷‍? +👷 Willkommen bei Hardhat v2.0.11 👷‍? Was möchten Sie tun? … -Create a sample project -❯ Create an empty hardhat.config.js -Quit +Ein Beispielprojekt erstellen +❯ Eine leere hardhat.config.js erstellen +Beenden ``` -Darüber wird eine `hardhat.config.js`-Datei für uns erstellt, in der wir alle Einstellungen für unser Projekt angeben werden (in Schritt 13). +Dadurch wird eine `hardhat.config.js`-Datei für uns generiert, in der wir alle Einstellungen für unser Projekt festlegen (in Schritt 13). ## Schritt 9: Projektordner hinzufügen {#step-9} -Um unser Projekt zu organisieren, erstellen wir zwei neue Ordner. Navigieren Sie in Ihrer Befehlszeile zum Stammverzeichnis Ihres Projekts und geben Sie Folgendes ein: +Um unser Projekt zu organisieren, erstellen wir zwei neue Ordner. Navigieren Sie in der Befehlszeile zum Stammverzeichnis Ihres Projekts und geben Sie Folgendes ein: ``` mkdir contracts mkdir scripts ``` -- `contracts/` ist der Ort, an dem wir unseren hello world-Smart-Contract-Code ablegen -- `scripts/` ist der Ort, an dem wir Skripte zum Einsatz und zur Interaktion mit unserem Vertrag aufbewahren +- `contracts/` ist der Ort, an dem wir unsere `Hello-World-Smart-Contract`-Codedatei aufbewahren. +- `scripts/` ist der Ort, an dem wir Skripte zur Bereitstellung und Interaktion mit unserem Vertrag aufbewahren. -## Schritt 10: Vertrag schreiben {#step-10} +## Schritt 10: Unseren Vertrag schreiben {#step-10} -Sie fragen sich vielleicht, wann fangen wir endlich an, den Code zu schreiben? Jetzt! In Schritt 10. +Sie fragen sich vielleicht, wann wir endlich anfangen, Code zu schreiben? Nun, hier sind wir, in Schritt 10. -Öffnen Sie das hello-world-Projekt in Ihrem bevorzugten Editor (wir bevorzugen [VSCode](https://code.visualstudio.com/)). Smart Contracts werden in einer Sprache namens Solidity geschrieben, die wir verwenden werden, um unseren Smart Contract namens HelloWorld.sol zu schreiben. +Öffnen Sie das hello-world-Projekt in Ihrem bevorzugten Editor (wir mögen [VSCode](https://code.visualstudio.com/)). Smart Contracts werden in einer Sprache namens Solidity geschrieben, die wir verwenden werden, um unseren Smart Contract HelloWorld.sol zu schreiben.‌ -1. Navigieren Sie zum Ordner "contracts" (Verträge) und erstellen Sie eine neue Datei namens HelloWorld.sol. -2. Im Folgenden finden Sie ein Beispiel für einen Hello World-Smart Contract der Ethereum Foundation, den wir für dieses Tutorial verwenden. Kopieren Sie den folgenden Inhalt und fügen Sie ihn in Ihre Datei HelloWorld.sol ein. Lesen Sie die Kommentare, um zu verstehen, was dieser Vertrag bewirkt: +1. Navigieren Sie zum Ordner „contracts“ und erstellen Sie eine neue Datei mit dem Namen HelloWorld.sol +2. Unten finden Sie einen Beispiel-Smart-Contract „Hello World“ von der Ethereum Foundation, den wir für dieses Tutorial verwenden werden. Kopieren Sie den folgenden Inhalt und fügen Sie ihn in Ihre Datei HelloWorld.sol ein. Lesen Sie unbedingt die Kommentare, um zu verstehen, was dieser Vertrag bewirkt: ```solidity -// Bestimmt die Version von Solidity mit semantischer Versionierung. -// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +// Gibt die Version von Solidity an, unter Verwendung der semantischen Versionierung. +// Erfahren Sie mehr: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma pragma solidity ^0.7.0; -// Defines a contract named `HelloWorld`. -// Ein Smart contract ist eine Sammlung von Funktionen und Daten (sein Zustand). Einmal in die Blockchain integriert, befindet sich ein Contract an einer bestimmten Adresse der Ethereum-Blockchain. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +// Definiert einen Vertrag mit dem Namen `HelloWorld`. +// Ein Vertrag ist eine Sammlung von Funktionen und Daten (seinem Zustand). Nach der Bereitstellung befindet sich ein Vertrag an einer bestimmten Adresse in der Ethereum-Blockchain. Erfahren Sie mehr: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html contract HelloWorld { - // Declares a state variable `message` of type `string`. - // Zustandsvariablen sind Variablen, deren Werte dauerhaft im Vertragsspeicher hinterlegt werden. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value. + // Deklariert eine Zustandsvariable `message` vom Typ `string`. + // Zustandsvariablen sind Variablen, deren Werte dauerhaft im Vertragsspeicher gespeichert werden. Das Schlüsselwort `public` macht Variablen von außerhalb eines Vertrags zugänglich und erstellt eine Funktion, die andere Verträge oder Clients aufrufen können, um auf den Wert zuzugreifen. string public message; - // Ähnlich wie viele Klassen-basierte objektorientierte Sprachen, ist ein Konstruktor - // eine spezielle Funktion, die nur bei der Vertragserstellung ausgeführt wird. - // Konstruktoren werden verwendet, um die Vertragsdaten zu initialisieren. Erfahre mehr: https://solidity.readthedocs.io/de/v0.5.10/contracts. tml#constructors - constructor(string memory initMessage) public { - // Akzeptiert ein String Argument `initMessage` und setzt den Wert - // in die `message` Speichervariable des Contracts). + // Ähnlich wie bei vielen klassenbasierten objektorientierten Sprachen ist ein Konstruktor eine spezielle Funktion, die nur bei der Erstellung des Vertrags ausgeführt wird. + // Konstruktoren werden verwendet, um die Daten des Vertrags zu initialisieren. Erfahren Sie mehr:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // Akzeptiert ein String-Argument `initMessage` und legt den Wert in der Speichervariable `message` des Vertrags fest). message = initMessage; - } + } - // Eine öffentliche Funktion, die ein String-Argument akzeptiert - // und die Speichervariable `message` aktualisiert. + // Eine öffentliche Funktion, die ein String-Argument akzeptiert und die Speichervariable `message` aktualisiert. function update(string memory newMessage) public { - message = newMessage; - } + message = newMessage; + } } ``` -Das ist ein sehr einfacher Smart Contract, der eine Nachricht bei Erstellung speichert und durch den Aufruf der `update`-Funktion aktualisiert werden kann. +Dies ist ein sehr einfacher Smart Contract, der beim Erstellen eine Nachricht speichert und durch den Aufruf der `update`-Funktion aktualisiert werden kann. ## Schritt 11: MetaMask und Alchemy mit Ihrem Projekt verbinden {#step-11} Wir haben eine MetaMask-Wallet und ein Alchemy-Konto erstellt und unseren Smart Contract geschrieben. Jetzt ist es an der Zeit, die drei zu verbinden. -Jede Transaktion, die von Ihrer virtuellen Wallet gesendet wird, erfordert eine Unterschrift mit Ihrem einzigartigen privaten Schlüssel. Um unser Programm mit dieser Berechtigung auszustatten, können wir unseren privaten Schlüssel (und den Alchemy-API-Schlüssel) sicher in einer Umgebungsdatei speichern. +Jede Transaktion, die von Ihrer virtuellen Wallet gesendet wird, benötigt eine Signatur mit ihrem eindeutigen privaten Schlüssel. Um unser Programm mit dieser Berechtigung auszustatten, können wir unseren privaten Schlüssel (und Alchemy-API-Schlüssel) in einer Umgebungsdatei sicher abspeichern. -> Weitere Informationen zum Senden von Transaktionen finden Sie in [diesem Tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) zum Senden von Transaktionen mit web3. +> Um mehr über das Senden von Transaktionen zu erfahren, sehen Sie sich [dieses Tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) über das Senden von Transaktionen mit web3 an. -Installieren Sie zunächst das dotenv-Paket in Ihrem Projektverzeichnis: +Installieren Sie zuerst das dotenv-Paket in Ihrem Projektverzeichnis: ``` npm install dotenv --save ``` -Erstellen Sie dann eine `.env`-Datei im Hauptverzeichnis unseres Projekts und fügen Sie Ihren privaten MetaMask-Schlüssel und die HTTP-API-URL von Alchemy hinzu. +Erstellen Sie dann eine `.env`-Datei im Stammverzeichnis unseres Projekts und fügen Sie Ihren privaten MetaMask-Schlüssel und Ihre HTTP-Alchemy-API-URL hinzu. -- Befolgen Sie [diese Anweisungen](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key), um Ihren privaten Schlüssel zu exportieren. -- Unten sehen Sie, wie Sie die HTTP-Alchemy API-URL erhalten. +- Befolgen Sie [diese Anweisungen](https://support.metamask.io/configure/accounts/how-to-export-an-accounts-private-key/), um Ihren privaten Schlüssel zu exportieren +- Siehe unten, um die HTTP Alchemy API-URL zu erhalten -![Alchemy-API-Schlüssel erhalten](./get-alchemy-api-key.gif) +![Alchemy-API-Schlüssel erhalten](./get-alchemy-api-key.png) Alchemy-API-URL kopieren -Unser `.env` sollte dann so aussehen: +Ihre `.env`-Datei sollte wie folgt aussehen: ``` -API_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key" +API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key" PRIVATE_KEY = "your-metamask-private-key" ``` -Um diese mit unserem Code zu verbinden, werden wir diese Variablen in unserer `hardhat.config.js`-Datei in Schritt 13 referenzieren. +Um diese tatsächlich mit unserem Code zu verbinden, verweisen wir in Schritt 13 in unserer `hardhat.config.js`-Datei auf diese Variablen. -Führen Sie keinen Commit für .env aus. Stellen Sie sicher, dass Sie Ihre .env-Datei niemals an andere weitergeben, denn damit würden Sie Ihre geheimen Daten weitergeben. Wenn Sie die Versionskontrolle verwenden, fügen Sie Ihre Env-Datei zu einer Datei gitignore hinzu. +Führen Sie keinen Commit für .env aus! Bitte stellen Sie sicher, dass Sie Ihre .env-Datei niemals an Dritte weitergeben oder offenlegen, da Sie dadurch Ihre Geheimnisse preisgeben. Wenn Sie eine Versionskontrolle verwenden, fügen Sie Ihre .env-Datei einer gitignore-Datei hinzu. ## Schritt 12: Ethers.js installieren {#step-12-install-ethersjs} -Ethers.js ist eine Bibliothek, die es einfacher macht, mit Ethereum zu interagieren und Anfragen zu stellen. Dafür schließt sie [Standard-JSON-RPC-Methoden](/developers/docs/apis/json-rpc/) in benutzerfreundlichere Methoden ein. +Ethers.js ist eine Bibliothek, die die Interaktion und das Stellen von Anfragen an Ethereum erleichtert, indem sie [standardmäßige JSON-RPC-Methoden](/developers/docs/apis/json-rpc/) in benutzerfreundlichere Methoden verpackt. -Hardhat macht es sehr einfach [Plug-ins](https://hardhat.org/plugins/) für zusätzliche Tools und erweiterte Funktionen zu integrieren. Wir werden das [Ethers-Plug-in](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) für die Bereitstellung von Verträgen nutzen ([Ethers.js](https://github.com/ethers-io/ethers.js/) bietet einige sehr saubere Methoden zur Bereitstellung von Verträgen). +Hardhat macht es sehr einfach, [Plugins](https://hardhat.org/plugins/) für zusätzliche Tools und erweiterte Funktionalität zu integrieren. Wir werden das [Ethers-Plugin](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) für die Vertragsbereitstellung nutzen ([Ethers.js](https://github.com/ethers-io/ethers.js/) verfügt über einige sehr saubere Methoden zur Vertragsbereitstellung). Geben Sie Folgendes in Ihrem Projektverzeichnis ein: @@ -253,13 +254,13 @@ Geben Sie Folgendes in Ihrem Projektverzeichnis ein: npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0" ``` -Im nächsten Schritt benötigen wir auch Ether in unserer `hardhat.config.js`. +Im nächsten Schritt werden wir auch Ethers in unserer `hardhat.config.js` benötigen. ## Schritt 13: hardhat.config.js aktualisieren {#step-13-update-hardhatconfigjs} -Wir haben bisher mehrere Abhängigkeiten und Plug-ins hinzugefügt. Jetzt müssen wir `hardhat.config.js` aktualisieren, damit unser Projekt über alle diese Abhängigkeiten informiert wird. +Wir haben bisher mehrere Abhängigkeiten und Plugins hinzugefügt. Jetzt müssen wir `hardhat.config.js` aktualisieren, damit unser Projekt alle kennt. -Aktualisieren Sie Ihre `hardhat.config.js` so, dass sie wie folgt aussieht: +Aktualisieren Sie Ihre `hardhat.config.js`, sodass sie wie folgt aussieht: ``` require('dotenv').config(); @@ -272,10 +273,10 @@ const { API_URL, PRIVATE_KEY } = process.env; */ module.exports = { solidity: "0.7.3", - defaultNetwork: "ropsten", + defaultNetwork: "sepolia", networks: { hardhat: {}, - ropsten: { + sepolia: { url: API_URL, accounts: [`0x${PRIVATE_KEY}`] } @@ -283,9 +284,9 @@ module.exports = { } ``` -## Schritt 14: Vertragszusammenstellung {#step-14-compile-our-contracts} +## Schritt 14: Unseren Vertrag kompilieren {#step-14-compile-our-contracts} -Um sicherzugehen, dass so weit alles funktioniert, sollten wir unseren Vertrag erstellen. Die Aufgabe `compile` ist eine der integrierten Hardhat-Aufgaben. +Um sicherzugehen, dass so weit alles funktioniert, sollten wir unseren Vertrag erstellen. Der `compile`-Task ist einer der integrierten Hardhat-Tasks. Führen Sie folgenden Befehl in der Befehlszeile aus: @@ -293,19 +294,19 @@ Führen Sie folgenden Befehl in der Befehlszeile aus: npx hardhat compile ``` -Möglicherweise erhalten Sie eine Warnung über `SPDX license identifier not provided in source file` (SPDX-Lizenzkennung nicht in Quelldatei angegeben), aber darüber brauchen Sie sich keine Sorgen zu machen. Alles andere sieht hoffentlich gut aus. Falls nicht, können Sie jederzeit eine Nachricht im [Alchemy Discord](https://discord.gg/u72VCg3) hinterlassen. +Möglicherweise erhalten Sie eine Warnung `SPDX license identifier not provided in source file`, aber darüber müssen Sie sich keine Sorgen machen – hoffentlich sieht alles andere gut aus! Wenn nicht, können Sie jederzeit eine Nachricht im [Alchemy-Discord](https://discord.gg/u72VCg3) schreiben. -## Schritt 15: Bereitstellungsskript schreiben {#step-15-write-our-deploy-scripts} +## Schritt 15: Unser Bereitstellungsskript schreiben {#step-15-write-our-deploy-scripts} Nun, da unser Vertrag geschrieben und unsere Konfigurationsdatei einsatzbereit ist, ist es an der Zeit, das Skript zur Bereitstellung des Vertrags zu schreiben. -Navigieren Sie zum Ordner `scripts/` und erstellen Sie eine neue Datei namens `deploy.js`. Fügen Sie folgende Inhalte hinzu: +Navigieren Sie zum Ordner `scripts/` und erstellen Sie eine neue Datei namens `deploy.js`, und fügen Sie ihr den folgenden Inhalt hinzu: ``` async function main() { const HelloWorld = await ethers.getContractFactory("HelloWorld"); - // Start deployment, returning a promise that resolves to a contract object + // Startet die Bereitstellung und gibt ein Promise zurück, das in ein Vertragsobjekt aufgelöst wird const hello_world = await HelloWorld.deploy("Hello World!"); console.log("Contract deployed to address:", hello_world.address);} @@ -317,26 +318,26 @@ main() }); ``` -Hardhat erklärt in seinem [Vertragstutorial](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) sehr gut, was die einzelnen Codezeilen bewirken. Wir haben diese Erklärungen hier übernommen. +Hardhat erklärt in seinem [Contracts-Tutorial](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) hervorragend, was jede dieser Codezeilen bewirkt; wir haben die Erklärungen hier übernommen. ``` const HelloWorld = await ethers.getContractFactory("HelloWorld"); ``` -Eine `ContractFactory` in ethers.js ist eine Abstraktion, die dazu dient, neue Smart Contracts einzusetzen. So ist `HelloWorld` eine Factory for Instances von unseren hello world-Vertrag. Wenn Sie das `hardhat-ethers`-Plug-in verwenden, werden die Instanzen `ContractFactory` und `Contract` standardmäßig mit dem ersten Unterzeichner verbunden. +Eine `ContractFactory` in ethers.js ist eine Abstraktion, die zur Bereitstellung neuer Smart Contracts verwendet wird. `HelloWorld` ist hier also eine Factory für Instanzen unseres Hello-World-Vertrags. Bei Verwendung des `hardhat-ethers`-Plugins sind die Instanzen `ContractFactory` und `Contract` standardmäßig mit dem ersten Unterzeichner verbunden. ``` const hello_world = await HelloWorld.deploy(); ``` -Der Aufruf eines `deploy()` im `ContractFactory` startet die Bereitstellung und gibt einen `Promise` zurück, was zum `Contract` führt. Das ist das Objekt, das eine Methode für jede unserer Smart-Contract-Funktionen enthält. +Der Aufruf von `deploy()` auf einer `ContractFactory` startet die Bereitstellung und gibt ein `Promise` zurück, das zu einem `Contract` aufgelöst wird. Das ist das Objekt, das eine Methode für jede unserer Smart-Contract-Funktionen enthält. -## Schritt 16: Vertragsbereitstellung {#step-16-deploy-our-contract} +## Schritt 16: Unseren Vertrag bereitstellen {#step-16-deploy-our-contract} -Nun sind wir endlich bereit, unseren Smart Contract bereitzustellen. Navigieren Sie zur Befehlszeile und führen Sie folgenden Befehl aus: +Nun sind wir endlich bereit, unseren Smart Contract bereitzustellen. Navigieren Sie zur Befehlszeile und führen Sie Folgendes aus: ``` -npx hardhat run scripts/deploy.js --network ropsten +npx hardhat run scripts/deploy.js --network sepolia ``` Sie sollten dann etwas sehen wie: @@ -345,20 +346,22 @@ Sie sollten dann etwas sehen wie: Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570 ``` -Wenn wir den [Ropsten etherscan](https://ropsten.etherscan.io/) aufrufen und nach unserer Vertragsadresse suchen, sollten wir sehen können, dass sie erfolgreich bereitgestellt wurde. Das Ergebnis sollte etwa wie folgt aussehen: +Wenn wir zu [Sepolia Etherscan](https://sepolia.etherscan.io/) gehen und nach unserer Vertragsadresse suchen, sollten wir sehen können, dass sie erfolgreich bereitgestellt wurde. Die Transaktion wird ungefähr so aussehen: ![Etherscan-Vertrag](./etherscan-contract.png) -Die `From`-Adresse sollte mit Ihrer MetaMask-Kontoadresse übereinstimmen und für die To-Adresse wird “Contract Creation” (Vertragserstellung) angezeigt. Doch wenn Sie die Transaktion aufrufen, erkennen Sie unsere Vertragsadresse im `To`-Feld: +Die `From`-Adresse sollte mit Ihrer MetaMask-Kontoadresse übereinstimmen und die `To`-Adresse lautet „Contract Creation“. Wenn wir jedoch auf die Transaktion klicken, sehen wir unsere Vertragsadresse im `To`-Feld: ![Etherscan-Transaktion](./etherscan-transaction.png) -Herzlichen Glückwunsch! Sie haben gerade einen Smart Contract in der Ethereum.Chain hinzugefügt 🎉. +Glückwunsch! Sie haben gerade einen Smart Contract in der Ethereum-Chain bereitgestellt 🎉 -Um zu verstehen, was im Verborgenen vor sich geht, navigieren wir zur Explorer-Registerkarte in unserem [Alchemy-Dashboard](https://dashboard.alchemyapi.io/explorer). Wenn Sie mehrere Alchemy-Anwendungen haben, stellen Sie sicher, dass Sie nach Anwendungen filtern und "Hello World" auswählen. ![Hello World-Explorer](./hello-world-explorer.png) +Um zu verstehen, was unter der Haube vor sich geht, navigieren wir zum Explorer-Tab in unserem [Alchemy-Dashboard](https://dashboard.alchemyapi.io/explorer). Wenn Sie mehrere Alchemy-Apps haben, stellen Sie sicher, dass Sie nach App filtern und „Hello World“ auswählen. +![Hello-World-Explorer](./hello-world-explorer.png) -Hier sehen Sie eine Handvoll JSON-RPC-Befehle, die Hardhat/Ethers implementiert hat, als wir die `.deploy()`-Funktion aufgerufen haben. Zwei wichtige Befehle, die wir hier vorstellen möchten, sind [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), das ist die Aufforderung unseren Vertrag in die Ropsten-Chain zu schreiben, und [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash), was eine Anfrage ist, Informationen über unsere Transaktion anhand des Hashs zu lesen (ein typisches Muster bei Transaktionen). Wenn Sie mehr über das Senden von Transaktionen erfahren möchten, lesen Sie dieses Tutorial über das [Senden von Transaktionen mit Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) +Hier sehen Sie eine Handvoll JSON-RPC-Aufrufe, die Hardhat/Ethers für uns „unter der Haube“ gemacht hat, als wir die `.deploy()`-Funktion aufgerufen haben. Zwei wichtige, die hier zu nennen sind, sind [`eth_sendRawTransaction`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-send-raw-transaction), also die Anfrage, unseren Vertrag tatsächlich in die Sepolia-Chain zu schreiben, und [`eth_getTransactionByHash`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-get-transaction-by-hash), eine Anfrage zum Lesen von Informationen über unsere Transaktion anhand des Hash (ein typisches Muster bei +Transaktionen). Um mehr über das Senden von Transaktionen zu erfahren, sehen Sie sich dieses Tutorial zum [Senden von Transaktionen mit Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) an. -Damit sind wir am Ende des ersten Teils von diesem Tutorial. Im zweiten Teil werden wir [mit unserem Smart Contract interagieren](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#part-2-interact-with-your-smart-contract). Dafür aktualisieren wir unsere anfängliche Nachricht. Im dritten Teil werden wir [unseren Smart Contract auf Etherscan veröffentlichen](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#optional-part-3-publish-your-smart-contract-to-etherscan), damit jeder weiß, wie man mit ihm interagiert. +Das ist alles für Teil 1 dieses Tutorials. In Teil 2 werden wir tatsächlich [mit unserem Smart Contract interagieren](https://www.alchemy.com/docs/interacting-with-a-smart-contract), indem wir unsere ursprüngliche Nachricht aktualisieren, und in Teil 3 werden wir [unseren Smart Contract auf Etherscan veröffentlichen](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan), damit jeder weiß, wie man mit ihm interagiert. -**Möchten Sie mehr über Alchemy erfahren? Besuchen Sie unsere [Website](https://alchemyapi.io/eth). Sie möchten kein Update verpassen? Dann abonnieren Sie [hier](https://www.alchemyapi.io/newsletter) unseren Newsletter. Folgen Sie uns auf [Twitter](https://twitter.com/alchemyplatform) und treten Sie unserer Community in [Discord](https://discord.com/invite/u72VCg3)** bei. +**Möchten Sie mehr über Alchemy erfahren? Besuchen Sie unsere [Website](https://www.alchemy.com/eth). Möchten Sie nie ein Update verpassen? Abonnieren Sie unseren Newsletter [hier](https://www.alchemy.com/newsletter)! Treten Sie auch unserem [Discord](https://discord.gg/u72VCg3) bei.**. diff --git a/public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md b/public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md new file mode 100644 index 00000000000..4c06bc4de5c --- /dev/null +++ b/public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md @@ -0,0 +1,145 @@ +--- +title: Wie man einen ERC-721 Markt implementiert +description: Wie man tokenisierte Assets auf einer dezentralen Pinnwand zum Verkauf anbietet +author: "Alberto Cuesta Cañada" +tags: [ "Smart Contracts", "erc-721", "Solidity", "Token" ] +skill: intermediate +lang: de +published: 2020-03-19 +source: Hackernoon +sourceUrl: https://hackernoon.com/how-to-implement-an-erc721-market-1e1a32j9 +--- + +In diesem Artikel werde ich dir zeigen, wie du Craigslist für die Ethereum Blockchain programmieren kannst. + +Vor Ebay, Craigslist und Gumtree waren Kleinanzeigen vor allem aus Kork oder Papier gemacht. Es gab Kleinanzeigen in Schulkorridoren, Zeitungen, an Straßenbeleuchtungen und Schaufenstern. + +All das änderte sich mit dem Internet. Die Anzahl der Personen, die eine bestimmte Kleinanzeige sehen konnten, multiplizierte sich um ein Vielfaches. Damit wurden die Märkte, die sie repräsentieren, viel effizienter und skalierter auf globale Größe. Ebay ist ein massives Geschäft, dessen Ursprünge auf diese physikalischen Kleinanzeiger zurückgehen. + +Angesichts der Blockchain werden sich diese Märkte erneut ändern, lass mich dir zeigen, wie. + +## Monetisierung {#monetization} + +Das Geschäftsmodell einer öffentlichen Blockchain-Kleinanzeige muss sich von dem von Ebay und Unternehmen unterscheiden. + +Zuerst gibt es [den Dezentralisierungsaspekt](/developers/docs/web2-vs-web3/). Bestehende Plattformen müssen ihre eigenen Server unterhalten. Eine dezentrale Plattform wird von ihren Benutzern verwaltet, so dass die Kosten für den Betrieb der Kernplattform für die Plattform-Besitzer auf Null sinken. + +Dann gibt es das Front-End, die Website oder Schnittstelle, den Zugriff auf die Plattform. Hier gibt es viele Möglichkeiten. Die Besitzer der Plattform können den Zugang einschränken und jeden zwingen, ihr Interface zu verwenden und eine Gebühr zu verlangen. Die Plattformeigentümer können sich auch dazu entscheiden, den Zugang zu öffnen (Alle Macht dem Volk!) und jeden Schnittstellen zur Plattform bauen zu lassen. Oder die Eigentümer könnten sich bei jedem Ansatz für die Mitte dieser Extreme entscheiden. + +_Geschäftsführer mit mehr Vision als ich, wissen, wie man dies monetarisieren kann. Ich sehe lediglich, dass dies anders ist als der Status quo und wahrscheinlich gewinnbringend._ + +Darüber hinaus gibt es den Automatisierungs- und Zahlungsverkehrsblickwinkel. Manche Dinge können sehr [effektiv tokenisiert](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) und auf einer Kleinanzeigen-Plattform gehandelt werden. Tokenisierte Assets werden einfach in einer Blockchain übertragen. Hochkomplexe Zahlungsmethoden lassen sich in einer Blockchain einfach umsetzen. + +Ich rieche hier nur eine Geschäftsgelegenheit. Eine Kleinanzeige ohne laufende Kosten lässt sich problemlos umsetzen, wobei bei jeder Transaktion komplexe Zahlungswege enthalten sind. Ich bin mir sicher, dass jemand eine gute Idee haben wird, wofür er dies nutzen sollte. + +Ich bin nur glücklich, es zu entwickeln. Werfen wir einen Blick auf den Code. + +## Implementierung {#implementation} + +Vor einiger Zeit haben wir ein [Open-Source-Repository](https://github.com/HQ20/contracts?ref=hackernoon.com) mit Implementierungsbeispielen für Geschäftsszenarien und anderen Goodies gestartet, schau es dir bitte an. + +Der Code für dieses [Ethereum Classifieds Board](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) ist dort zu finden, bitte benutze ihn und tobe dich damit aus. Sei dir bewusst, dass der Code noch nicht geprüft wurde und du deine Sorgfaltspflicht erledigen musst, bevor du Geld in den Code steckst. + +Die Grundlagen des Boards sind nicht komplex. Alle Anzeigen im Board werden nur ein Struct mit ein paar Feldern sein: + +```solidity +struct Trade { + address poster; + uint256 item; + uint256 price; + bytes32 status; // Open, Executed, Cancelled +} +``` + +Es gibt jemanden, der die Anzeige veröffentlicht. Ein Artikel zum Verkauf. Ein Preis für diesen Artikel. Der Status des Handels, der geöffnet, ausgeführt oder aufgehoben werden kann. + +Alle diese Geschäfte werden in einer Kartierung aufbewahrt. Weil alles in Solidity ein Mapping zu sein scheint. Auch weil es bequem ist. + +```solidity +mapping(uint256 => Trade) public trades; +``` + +Die Verwendung eines Mappings bedeutet lediglich, dass wir eine ID für jedes Inserat erstellen müssen, bevor wir es veröffentlichen und wir werden die ID einer Anzeige wissen müssen, bevor wir daran arbeiten können. Es gibt mehrere Möglichkeiten, dies entweder im Smart-Contract oder im Front-end zu lösen. Bitte frage dich, ob du Pointer benötigst. + +Als nächstes stellt sich die Frage, mit welcher Währung wir uns befassen und mit welcher Währung wir die Transaktion finanzieren. + +Für die Gegenstände fordern wir lediglich, dass sie die [ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com)-Schnittstelle implementieren, was eigentlich nur eine Methode ist, um reale Gegenstände in einer Blockchain darzustellen, obwohl sie am besten [mit digitalen Vermögenswerten funktioniert](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com). Wir werden unseren eigenen ERC721 Vertrag im Konstrukteur spezifizieren, was bedeutet, dass alle Vermögenswerte in unserem Kleinanzeigen-Board vorher tokenisiert werden müssen. + +Für die Zahlungen werden wir etwas Ähnliches machen. Die meisten Blockchain-Projekte definieren ihre eigene [ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol?ref=hackernoon.com) Kryptowährung. Einige andere ziehen es vor, eine Mainstream-Währung wie den DAI zu verwenden. In diesem Kleinanzeigen-Board musst du im Konstruktor über die Währung entscheiden. Einfach. + +```solidity +constructor ( + address _currencyTokenAddress, address _itemTokenAddress +) public { + currencyToken = IERC20(_currencyTokenAddress); + itemToken = IERC721(_itemTokenAddress); + tradeCounter = 0; +} +``` + +Wir haben es fast geschafft. Wir haben Werbung, Artikel für den Handel und eine Währung für Zahlungen. Eine Anzeige zu machen bedeutet, einen Gegenstand in das Treuhandkontol zu legen und zu zeigen, dass du ihn nicht zweimal gepostet hast, möglicherweise in einem anderen Board. + +Der folgende Code tut genau das. Legt den Gegenstand in escrow, erstellt die Werbung, macht ein wenig den Haushalt. + +```solidity +function openTrade(uint256 _item, uint256 _price) + public +{ + itemToken.transferFrom(msg.sender, address(this), _item); + trades[tradeCounter] = Trade({ + poster: msg.sender, + item: _item, + price: _price, + status: "Open" + }); + tradeCounter += 1; + emit TradeStatusChange(tradeCounter - 1, "Open"); +} +``` + +Den Handel zu akzeptieren bedeutet, wähle eine Anzeige (Handel), zahle den Preis, erhalte den Artikel. Der untenstehende Code ruft einen Handel auf. Überprüft, ob er verfügbar ist. Bezahlt den Artikel. Erhält den Artikel. Aktualisiert die Anzeige. + +```solidity +function executeTrade(uint256 _trade) + public +{ + Trade memory trade = trades[_trade]; + require(trade.status == "Open", "Trade is not Open."); + currencyToken.transferFrom(msg.sender, trade.poster, trade.price); + itemToken.transferFrom(address(this), msg.sender, trade.item); + trades[_trade].status = "Executed"; + emit TradeStatusChange(_trade, "Executed"); +} +``` + +Schließlich haben wir die Möglichkeit für Verkäufer, von einem Handel zurückzutreten, bevor ein Käufer ihn annimmt. In einigen Modellen würden Anzeigen statt dessen eine Zeitspanne lang live sein, bevor sie ablaufen. Deine Wahl, abhängig vom Design Ihres Marktes. + +Der Code ist sehr ähnlich wie bei der Handelsausführung nur dass keine Währung wechselt wird und der Artikel zurück zum Verkäufer geht. + +```solidity +function cancelTrade(uint256 _trade) + public +{ + Trade memory trade = trades[_trade]; + require( + msg.sender == trade.poster, + "Der Handel kann nur vom Ersteller storniert werden." + ); + require(trade.status == "Open", "Der Handel ist nicht offen."); + itemToken.transferFrom(address(this), trade.poster, trade.item); + trades[_trade].status = "Cancelled"; + emit TradeStatusChange(_trade, "Cancelled"); +} +``` + +Das wars. Du hast es bis zum Ende der Umsetzung geschafft. Es ist ziemlich überraschend, wie kompakt einige Geschäftskonzepte sind, wenn sie im Code ausgedrückt werden, und das ist einer dieser Fälle. Sieh dir den vollständigen Vertrag [in unserem Repo](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol) an. + +## Fazit {#conclusion} + +Kleinanzeigen sind eine gemeinsame Marktkonfiguration, die massiv mit dem Internet skaliert wurde und zu einem sehr beliebten Geschäftsmodell mit ein paar monopolistischen Gewinnern geworden ist. + +Kleinanzeigen sind auch ein einfaches Werkzeug zum Nachahmen in einer Blockchain-Umgebung mit sehr spezifischen Merkmalen, die eine Herausforderung für die bestehenden Marktführer ermöglichen. + +In diesem Artikel habe ich den Versuch unternommen, die Geschäftswirklichkeit eines Kleinanzeigen-Business mit der technologischen Umsetzung zu verbinden. Dieses Wissen sollte dir helfen, eine Vision und einen Fahrplan für die Umsetzung zu erstellen, wenn du über die richtigen Fähigkeiten verfügst. + +Wie immer gilt: Wenn du etwas Lustiges bauen willst und einen Ratschlag gebrauchen könntest, [schreib mir einfach eine Nachricht](https://albertocuesta.es/)! Ich helfe immer gerne. diff --git a/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md index a9b9884c8d5..e411d70a1ee 100644 --- a/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md @@ -1,39 +1,42 @@ --- -title: So prägen Sie einen NFT (Teil 2/3 der NFT-Tutorialreihe) -description: In diesem Tutorial wird beschrieben, wie Sie ein NFT auf der Ethereum-Blockchain mit unserem Smart Contract und Web3 prägen können +title: Wie man einen NFT prägt (Teil 2/3 der NFT-Tutorial-Reihe) +description: In diesem Tutorial wird beschrieben, wie Sie einen NFT auf der Ethereum-Blockchain mit unserem Smart Contract und Web3 prägen können. author: "Sumi Mudgil" tags: - - "NFTs" - - "ERC-721" - - "Alchemy" - - "Solidity" - - "Smart Contracts" + [ + "ERC-721", + "Alchemy", + "solidity", + "intelligente Verträge" + ] skill: beginner lang: de published: 2021-04-22 --- -[Beeple](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html): 69 Millionen USD [3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): 11 Millionen USD [Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): 6 Millionen USD +[Beeple](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html): 69 Millionen Dollar +[3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): 11 Millionen Dollar +[Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): 6 Millionen Dollar Sie alle haben ihre NFTs mit der leistungsstarken API von Alchemy geprägt. In diesem Tutorial zeigen wir Ihnen, wie das in \<10 Minuten geht. -"NFTs prägen" – ist die Veröffentlichung einer einzigartigen Instanz Ihres ERC-721-Tokens auf der Blockchain. Mit unserem Smart Contract aus [Teil 1 dieser NFT-Tutorialserie](/developers/tutorials/how-to-write-and-deploy-an-nft/) möchten wir unsere Web3-Fähigkeiten unter Beweis stellen und einen NFT prägen. Am Ende dieses Tutorials sind Sie selbst in der Lage, so viele NFTs zu prägen, wie Ihr Herz (und Ihr Wallet) begehrt. +Das „Prägen eines NFT“ ist der Akt der Veröffentlichung einer einzigartigen Instanz Ihres ERC-721-Tokens auf der Blockchain. Nutzen wir unseren Smart Contract aus [Teil 1 dieser NFT-Tutorial-Reihe](/developers/tutorials/how-to-write-and-deploy-an-nft/), um unsere Web3-Fähigkeiten unter Beweis zu stellen und einen NFT zu prägen. Am Ende dieses Tutorials werden Sie in der Lage sein, so viele NFTs zu prägen, wie Ihr Herz (und Ihr Wallet) begehrt! -Los gehts! +Legen wir los! ## Schritt 1: Web3 installieren {#install-web3} -Wenn Sie das erste Tutorial zur Erstellung Ihres NFT-Smart Contracts verfolgt haben, haben Sie bereits Erfahrung mit Ethers.js gesammelt. Web3 ist ähnlich wie Ethers eine Bibliothek, die das Erstellen von Anfragen an die Ethereum-Blockchain erleichtert. In diesem Tutorial verwenden wir [Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3), eine erweiterte Web3-Bibliothek, die automatische Wiederholungen und ausgereifte WebSocket-Unterstützung bietet. +Wenn Sie dem ersten Tutorial zur Erstellung Ihres NFT-Smart-Contracts gefolgt sind, haben Sie bereits Erfahrung mit der Verwendung von Ethers.js. Web3 ist ähnlich wie Ethers eine Bibliothek, die das Erstellen von Anfragen an die Ethereum-Blockchain erleichtert. In diesem Tutorial verwenden wir [Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3), eine erweiterte Web3-Bibliothek, die automatische Wiederholungsversuche und robuste WebSocket-Unterstützung bietet. -Führen Sie folgenden Befehl im Startverzeichnis Ihres Projekts aus: +Führen Sie im Stammverzeichnis Ihres Projekts Folgendes aus: ``` npm install @alch/alchemy-web3 ``` -## Schritt 2: `mint-nft.js`-Datei erstellen {#create-mintnftjs} +## Schritt 2: Eine `mint-nft.js`-Datei erstellen {#create-mintnftjs} -Erstellen Sie die Datei `mint-nft.js` in Ihrem Skriptverzeichnis und fügen Sie die folgenden Codezeilen hinzu: +Erstellen Sie in Ihrem Skriptverzeichnis eine `mint-nft.js`-Datei und fügen Sie die folgenden Codezeilen hinzu: ```js require("dotenv").config() @@ -42,123 +45,123 @@ const { createAlchemyWeb3 } = require("@alch/alchemy-web3") const web3 = createAlchemyWeb3(API_URL) ``` -## Schritt 3: Vertrags-ABI öffnen {#contract-abi} +## Schritt 3: Die Vertrags-ABI abrufen {#contract-abi} -Unsere Vertrags-ABI (Application Binary Interface) ist die Schnittstelle, über die die Interaktion mit unserem Smart Contract erfolgt. [Hier](https://docs.alchemyapi.io/alchemy/guides/eth_getlogs#what-are-ab-is) erfahren Sie mehr über Vertrags-ABIs. Hardhat generiert automatisch eine ABI für uns und speichert sie in der Datei `MyNFT.json`. Um das zu nutzen, müssen wir den Inhalt auslesen. Dafür fügen wir die folgenden Codezeilen in unsere `mint-nft.js`-Datei ein: +Die ABI unseres Vertrags (Application Binary Interface) ist die Schnittstelle für die Interaktion mit unserem Smart-Contract. Mehr über Vertrags-ABIs erfahren Sie [hier](https://docs.alchemyapi.io/alchemy/guides/eth_getlogs#what-are-ab-is). Hardhat generiert automatisch eine ABI für uns und speichert sie in der Datei `MyNFT.json`. Um dies zu verwenden, müssen wir den Inhalt parsen, indem wir die folgenden Codezeilen zu unserer `mint-nft.js`-Datei hinzufügen: ```js const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json") ``` -Wenn Sie die ABI anzeigen möchten, können Sie sie auf Ihrer Konsole anzeigen: +Wenn Sie die ABI sehen möchten, können Sie sie auf Ihrer Konsole ausgeben: ```js console.log(JSON.stringify(contract.abi)) ``` -Um `mint-nft.js` auszuführen und die ABI auf der Konsole anzuzeigen, navigieren Sie zu Ihrem Terminal und führen folgenden befehl aus: +Um `mint-nft.js` auszuführen und Ihre ABI auf der Konsole ausgeben zu sehen, navigieren Sie zu Ihrem Terminal und führen Sie Folgendes aus: ```js node scripts/mint-nft.js ``` -## Schritt 4: Metadaten für den NFT mit IPFS konfigurieren {#config-meta} +## Schritt 4: Metadaten für Ihren NFT mit IPFS konfigurieren {#config-meta} -Wenn Sie sich an den ersten Teil unseres Tutorials erinnern, nimmt unsere `mintNFT`-Smart-Contract-Funktion einen tokenURI-Parameter entgegen, der in ein JSON-Dokument aufgelöst werden sollte, das die Metadaten des NFT beschreibt. Das ist es, was einen NFT wirklich zum Leben erweckt und ermöglicht, konfigurierbare Eigenschaften wie einen Namen, eine Beschreibung, ein Bild und andere Attribute zu haben. +Wenn Sie sich an unser Tutorial in Teil 1 erinnern, nimmt unsere `mintNFT`-Smart-Contract-Funktion einen tokenURI-Parameter entgegen, der zu einem JSON-Dokument aufgelöst werden sollte, das die Metadaten des NFT beschreibt – was den NFT erst richtig zum Leben erweckt und ihm konfigurierbare Eigenschaften wie Name, Beschreibung, Bild und andere Attribute verleiht. -> _Interplanetary File System (IPFS) ist ein dezentralisiertes Protokoll und Peer-to-Peer-Netzwerk, um Informationen in verteilten Dateisystemen zu speichern und zu teilen._ +> _Interplanetary File System (IPFS) ist ein dezentrales Protokoll und ein Peer-to-Peer-Netzwerk zum Speichern und Teilen von Daten in einem verteilten Dateisystem._ -Wir nutzen Pinata, eine praktische IPFS-API und ein Toolkit zum Speichern unserer NFT-Assets und Metadaten, um sicherzustellen, dass unser NFT wirklich dezentralisiert ist. Falls Sie noch kein Pinata-Konto haben, können Sie ein kostenloses Konto [hier](https://app.pinata.cloud) erstellen. Zur Vervollständigung müssen Sie anschließend noch Ihre E-Mail-Adresse verifizieren. +Wir werden Pinata, eine praktische IPFS-API und ein Toolkit, verwenden, um unser NFT-Asset und unsere Metadaten zu speichern und sicherzustellen, dass unser NFT wirklich dezentral ist. Wenn Sie kein Pinata-Konto haben, registrieren Sie sich [hier](https://app.pinata.cloud) für ein kostenloses Konto und führen Sie die Schritte zur Verifizierung Ihrer E-Mail-Adresse aus. Sobald Sie ein Konto erstellt haben: -- Navigieren Sie zur Seite "Files" (Dateien) und klicken Sie auf die blaue Schaltfläche "Upload" (Hochladen) oben links auf der Seite. +- Navigieren Sie zur Seite „Dateien“ und klicken Sie oben links auf die blaue Schaltfläche „Hochladen“. -- Laden Sie ein Bild bei Pinata hoch — diese Bild-Datei wird für Ihren NFT benötigt. Sie können die Datei beliebig benennen. +- Laden Sie ein Bild auf Pinata hoch – dies wird das Bild-Asset für Ihren NFT sein. Sie können das Asset benennen, wie Sie möchten. -- Nach dem Hochladen sehen Sie die Dateiinformationen in der Tabelle auf der Seite "Files" (Dateien). Zudem sehen Sie auch die Spalte "CID". Sie können die CID kopieren, indem Sie auf die Kopierschaltfläche direkt daneben klicken. Sie können ihren Upload einsehen unter: `https://gateway.pinata.cloud/ipfs/`. Das Bild, das wir auf IPFS verwendet haben, finden Sie zum Beispiel [hier](https://gateway.pinata.cloud/ipfs/QmarPqdEuzh5RsWpyH2hZ3qSXBCzC5RyK3ZHnFkAsk7u2f). +- Nach dem Hochladen sehen Sie die Datei-Informationen in der Tabelle auf der Seite „Dateien“. Sie werden auch eine CID-Spalte sehen. Sie können die CID kopieren, indem Sie auf die Schaltfläche zum Kopieren daneben klicken. Sie können Ihren Upload unter `https://gateway.pinata.cloud/ipfs/` ansehen. Das von uns verwendete Bild finden Sie zum Beispiel auf IPFS [hier](https://gateway.pinata.cloud/ipfs/QmZdd5KYdCFApWn7eTZJ1qgJu18urJrP9Yh1TZcZrZxxB5). -Für visuell Lernende sind die oben genannten Schritte hier zusammengefasst: +Für die eher visuell Lernenden sind die obigen Schritte hier zusammengefasst: -![So laden Sie ihr Bild bei Pinata hoch](https://gateway.pinata.cloud/ipfs/Qmcdt5VezYzAJDBc4qN5JbANy5paFg9iKDjq8YksRvZhtL) +![So laden Sie Ihr Bild auf Pinata hoch](./instructionsPinata.gif) -Jetzt laden wir ein weiteres Dokument in Pinata hoch. Doch bevor wir das machen, müssen wir es erst erstellen. +Jetzt wollen wir noch ein weiteres Dokument auf Pinata hochladen. Aber bevor wir das tun, müssen wir es erstellen! -Erstellen Sie in Ihrem Stammverzeichnis eine neue Datei namens `nft-metadata.json` und fügen Sie den folgenden json-Code hinzu: +Erstellen Sie in Ihrem Stammverzeichnis eine neue Datei mit dem Namen `nft-metadata.json` und fügen Sie den folgenden JSON-Code hinzu: ```json { "attributes": [ { - "trait_type": "Breed", + "trait_type": "Rasse", "value": "Maltipoo" }, { - "trait_type": "Eye color", - "value": "Mocha" + "trait_type": "Augenfarbe", + "value": "Mokka" } ], - "description": "The world's most adorable and sensitive pup.", + "description": "Der bezauberndste und sensibelste Welpe der Welt.", "image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb", "name": "Ramses" } ``` -Sie können die Daten in der json-Datei gerne ändern. Sie können den Attributabschnitt entfernen oder hinzufügen. Vergewissern Sie sich vor allem, dass das Bildfeld auf den Speicherort Ihres IPFS-Bildes verweist – andernfalls wird Ihr NFT ein Foto eines (sehr niedlichen!) Hundes enthalten. +Sie können die Daten in der JSON-Datei beliebig ändern. Sie können den Abschnitt mit den Attributen entfernen oder erweitern. Am wichtigsten ist, dass das Bildfeld auf den Speicherort Ihres IPFS-Bildes verweist – andernfalls enthält Ihr NFT ein Foto von einem (sehr süßen!) Hund. -Wenn Sie mit der Bearbeitung der JSON-Datei fertig sind, speichern Sie sie und laden Sie sie auf Pinata hoch. Führen Sie dafür die gleichen Schritte wie beim Hochladen des Bildes aus. +Wenn Sie mit der Bearbeitung der JSON-Datei fertig sind, speichern Sie sie und laden Sie sie auf Pinata hoch. Befolgen Sie dabei die gleichen Schritte wie beim Hochladen des Bildes. -![So laden Sie die Datei "nft-metadata.json" bei Pinata hoch](./uploadPinata.gif) +![So laden Sie Ihre nft-metadata.json auf Pinata hoch](./uploadPinata.gif) -## Schritt 5: Vertragsinstanz erstellen {#instance-contract} +## Schritt 5: Eine Instanz Ihres Vertrags erstellen {#instance-contract} -Um nun mit unserem Vertrag zu interagieren, müssen wir eine Instanz davon in unserem Code erstellen. Dazu benötigen wir unsere Vertragsadresse, die wir über die Bereitstellung oder [Etherscan](https://ropsten.etherscan.io/) erhalten können. Dafür fragen wir die Adresse ab, die Sie für die Bereitstellung des Vertrags verwendet haben. +Um mit unserem Vertrag zu interagieren, müssen wir nun eine Instanz davon in unserem Code erstellen. Dazu benötigen wir unsere Vertragsadresse, die wir bei der Bereitstellung oder von [Blockscout](https://eth-sepolia.blockscout.com/) erhalten können, indem wir die Adresse nachschlagen, die Sie zur Bereitstellung des Vertrags verwendet haben. -![Ihre Vertragsadresse auf Etherscan anzeigen](./viewContractEtherscan.png) +![Ihre Vertragsadresse auf Etherscan anzeigen](./view-contract-etherscan.png) -Im obigen Beispiel lautet unsere Vertragsadresse 0x81c587EB0fE773404c42c1d2666b5f557C470eED. +Im obigen Beispiel lautet unsere Vertragsadresse 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778. -Als Nächstes werden wir die Web3-[Vertragsmethode](https://docs.web3js.org/api/web3-eth-contract/class/Contract) verwenden, um unseren Vertrag unter Verwendung der ABI und der Adresse zu erstellen. Fügen Sie in der Datei `mint-nft.js` Folgendes hinzu: +Als Nächstes verwenden wir die Web3-[Vertragsmethode](https://docs.web3js.org/api/web3-eth-contract/class/Contract), um unseren Vertrag mithilfe der ABI und der Adresse zu erstellen. Fügen Sie in Ihrer `mint-nft.js`-Datei Folgendes hinzu: ```js -const contractAddress = "0x81c587EB0fE773404c42c1d2666b5f557C470eED" +const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" const nftContract = new web3.eth.Contract(contract.abi, contractAddress) ``` -## Schritt 6: `.env`-Datei aktualisieren {#update-env} +## Schritt 6: Die `.env`-Datei aktualisieren {#update-env} -Um nun Transaktionen zu erstellen und an die Ethereum-Chain zu senden, verwenden wir Ihre öffentliche Ethereum-Kontoadresse, um die Konto-Nonce zu erhalten (wird unten erklärt). +Um Transaktionen zu erstellen und an die Ethereum-Kette zu senden, verwenden wir nun Ihre öffentliche Ethereum-Kontoadresse, um die Konto-Nonce zu erhalten (Erklärung folgt unten). -Fügen Sie Ihren öffentlichen Schlüssel zu Ihrer `.env-`Datei hinzu. Wenn Sie den ersten Teil des Tutorials abgeschlossen haben, sollte die `.env`-Datei nun wie folgt aussehen: +Fügen Sie Ihren öffentlichen Schlüssel zu Ihrer `.env`-Datei hinzu – wenn Sie Teil 1 des Tutorials abgeschlossen haben, sollte unsere `.env`-Datei jetzt so aussehen: ```js -API_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key" +API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key" PRIVATE_KEY = "your-private-account-address" PUBLIC_KEY = "your-public-account-address" ``` -## Schritt 7: Transaktion erstellen {#create-txn} +## Schritt 7: Ihre Transaktion erstellen {#create-txn} -Als Erstes definieren wir eine Funktion mit dem Namen `mintNFT(tokenData)` und erstellen dann wie folgt unsere Transaktion: +Definieren wir zunächst eine Funktion namens `mintNFT(tokenData)` und erstellen wir unsere Transaktion, indem wir Folgendes tun: -1. Nehmen Sie den _PRIVATE_KEY_ und _PUBLIC_KEY_ aus der `.env`-Datei. +1. Holen Sie sich Ihren _PRIVATE_KEY_ und _PUBLIC_KEY_ aus der `.env`-Datei. -1. Als Nächstes müssen wir die Konto-Nonce in Erfahrung bringen. Die Nonce-Spezifikation wird verwendet, um die Anzahl der von Ihrer Adresse aus gesendeten Transaktionen zu verfolgen. Das ist aus Sicherheitsgründen und zur Verhinderung von [Replay-Angriffen](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce) erforderlich. Um die Anzahl der von Ihrer Adresse aus gesendeten Transaktionen in Erfahrung zu bringen, nutzen wir [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). +2. Als Nächstes müssen wir die Konto-Nonce ermitteln. Die Nonce-Spezifikation wird verwendet, um die Anzahl der von Ihrer Adresse gesendeten Transaktionen zu verfolgen – was wir aus Sicherheitsgründen und zur Verhinderung von [Replay-Angriffen](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce) benötigen. Um die Anzahl der von Ihrer Adresse gesendeten Transaktionen zu erhalten, verwenden wir [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). -1. Abschließend richten wir eine Transaktion mit der folgenden Information ein: +3. Schließlich richten wir unsere Transaktion mit den folgenden Informationen ein: -- `'from': PUBLIC_KEY` – Der Ursprung der Transaktion ist unsere öffentliche Adresse +- `'from': PUBLIC_KEY` — Der Ursprung unserer Transaktion ist unsere öffentliche Adresse -- `'to': contractAddress` – Der Vertrag, mit dem wir interagieren und dem wir die Transaktion senden möchten +- `'to': contractAddress` — Der Vertrag, mit dem wir interagieren und an den wir die Transaktion senden wollen -- `'nonce': nonce` – Die Konto-Nonce mit der Anzahl der Transaktionen, die von unserer Adresse gesendet wurden +- `'nonce': nonce` — Die Konto-Nonce mit der Anzahl der von unserer Adresse gesendeten Transaktionen -- `'gas': estimatedGas` – Die geschätzten Ressourcen, die zum Abschließen der Transaktion erforderlich sind +- `'gas': estimatedGas` — Das geschätzte Gas, das für den Abschluss der Transaktion benötigt wird -- `'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()` – Die Berechnung, die wir in dieser Transaktion durchführen wollen, in diesem Fall das Prägen eines NFT. +- `'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()` — Die Berechnung, die wir in dieser Transaktion durchführen wollen — in diesem Fall das Prägen eines NFT -Unser mint-nft.js Datei sollte dann so aussehen: +Ihre `mint-nft.js`-Datei sollte jetzt so aussehen: ```js require('dotenv').config(); @@ -170,13 +173,13 @@ Unser mint-nft.js Datei sollte dann so aussehen: const web3 = createAlchemyWeb3(API_URL); const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json"); - const contractAddress = "0x81c587EB0fE773404c42c1d2666b5f557C470eED"; + const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"; const nftContract = new web3.eth.Contract(contract.abi, contractAddress); async function mintNFT(tokenURI) { - const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //get latest nonce + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //letzte Nonce holen - //the transaction + //die Transaktion const tx = { 'from': PUBLIC_KEY, 'to': contractAddress, @@ -187,11 +190,11 @@ Unser mint-nft.js Datei sollte dann so aussehen: }​ ``` -## Schritt 8: Transaktion signieren {#sign-txn} +## Schritt 8: Die Transaktion signieren {#sign-txn} -Jetzt, da wir unsere Transaktion erstellt haben, müssen wir sie signieren, um sie abzusenden. Dafür verwenden wir den privaten Schlüssel. +Nachdem wir unsere Transaktion erstellt haben, müssen wir sie signieren, um sie zu versenden. Hier werden wir unseren privaten Schlüssel verwenden. -`web3.eth.sendSignedTransaction` liefert uns den Transaktions-Hash, mit dem wir sicherstellen können, dass die Transaktion verarbeitet und nicht vom Netzwerk gelöscht wurde. Sie werden feststellen, dass wir im Abschnitt zur Transaktionssignierung eine Fehlerprüfung hinzugefügt haben, damit wir wissen, ob unsere Transaktion erfolgreich durchgeführt wurde. +`web3.eth.sendSignedTransaction` gibt uns den Transaktions-Hash, mit dem wir sicherstellen können, dass unsere Transaktion gemined und nicht vom Netzwerk verworfen wurde. Sie werden feststellen, dass wir im Abschnitt zur Signierung der Transaktion eine Fehlerprüfung hinzugefügt haben, damit wir wissen, ob unsere Transaktion erfolgreich war. ```js require("dotenv").config() @@ -203,13 +206,13 @@ const { createAlchemyWeb3 } = require("@alch/alchemy-web3") const web3 = createAlchemyWeb3(API_URL) const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json") -const contractAddress = "0x81c587EB0fE773404c42c1d2666b5f557C470eED" +const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" const nftContract = new web3.eth.Contract(contract.abi, contractAddress) async function mintNFT(tokenURI) { - const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //letzte Nonce holen - //the transaction + //die Transaktion const tx = { from: PUBLIC_KEY, to: contractAddress, @@ -226,13 +229,13 @@ async function mintNFT(tokenURI) { function (err, hash) { if (!err) { console.log( - "The hash of your transaction is: ", + "Der Hash Ihrer Transaktion ist: ", hash, - "\nCheck Alchemy's Mempool to view the status of your transaction!" + "\nÜberprüfen Sie den Mempool von Alchemy, um den Status Ihrer Transaktion anzuzeigen!" ) } else { console.log( - "Something went wrong when submitting your transaction:", + "Beim Senden Ihrer Transaktion ist ein Fehler aufgetreten:", err ) } @@ -240,24 +243,24 @@ async function mintNFT(tokenURI) { ) }) .catch((err) => { - console.log(" Promise failed:", err) + console.log(" Promise fehlgeschlagen:", err) }) } ``` -## Schritt 9: `mintNFT` aufrufen und Node-`mint-nft.js` ausführen {#call-mintnft-fn} +## Schritt 9: `mintNFT` aufrufen und `node mint-nft.js` ausführen {#call-mintnft-fn} -Erinnern Sie sich noch an die Datei `metadata.json`, die Sie in Pinata hochgeladen haben? Holen Sie sich den Hashcode von Pinata und übermitteln Sie die Parameter an die `mintNFT`-Funktion: `https://gateway.pinata.cloud/ipfs/` +Erinnern Sie sich an die `metadata.json`, die Sie auf Pinata hochgeladen haben? Holen Sie sich den Hashcode von Pinata und übergeben Sie Folgendes als Parameter an die Funktion `mintNFT`: `https://gateway.pinata.cloud/ipfs/` So erhalten Sie den Hashcode: -![So erhalten Sie Ihren NFT-Metadaten-Hashcode auf Pinata](./metadataPinata.gif)_So bekommen Sie Ihren NFT-Metadata-Hashcode auf Pinata_ +![So erhalten Sie den Hashcode Ihrer NFT-Metadaten auf Pinata](./metadataPinata.gif)_So erhalten Sie den Hashcode Ihrer NFT-Metadaten auf Pinata_ -> Überprüfen Sie den Hashcode, den Sie zu Ihrer **metadata.json** verlinkt haben, indem Sie `https://gateway.pinata.cloud/ipfs/` in einem separaten Fenster öffnen. Die Seite sollte ähnlich wie der untenstehende Screenshot aussehen: +> Überprüfen Sie, ob der von Ihnen kopierte Hashcode auf Ihre **metadata.json** verweist, indem Sie `https://gateway.pinata.cloud/ipfs/` in einem separaten Fenster laden. Die Seite sollte ähnlich wie im folgenden Screenshot aussehen: -![Ihre Seite sollte die json-Metadata anzeigen](./metadataJSON.png)_Ihre Seite sollte die json-Metadaten anzeigen_ +![Ihre Seite sollte die JSON-Metadaten anzeigen](./metadataJSON.png)_Ihre Seite sollte die JSON-Metadaten anzeigen_ -Alles in allem sollte Ihr Code etwa wie folgt aussehen: +Insgesamt sollte Ihr Code etwa so aussehen: ```js require("dotenv").config() @@ -269,13 +272,13 @@ const { createAlchemyWeb3 } = require("@alch/alchemy-web3") const web3 = createAlchemyWeb3(API_URL) const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json") -const contractAddress = "0x81c587EB0fE773404c42c1d2666b5f557C470eED" +const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" const nftContract = new web3.eth.Contract(contract.abi, contractAddress) async function mintNFT(tokenURI) { - const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //letzte Nonce holen - //the transaction + //die Transaktion const tx = { from: PUBLIC_KEY, to: contractAddress, @@ -292,13 +295,13 @@ async function mintNFT(tokenURI) { function (err, hash) { if (!err) { console.log( - "The hash of your transaction is: ", + "Der Hash Ihrer Transaktion ist: ", hash, - "\nCheck Alchemy's Mempool to view the status of your transaction!" + "\nÜberprüfen Sie den Mempool von Alchemy, um den Status Ihrer Transaktion anzuzeigen!" ) } else { console.log( - "Something went wrong when submitting your transaction:", + "Beim Senden Ihrer Transaktion ist ein Fehler aufgetreten:", err ) } @@ -306,25 +309,27 @@ async function mintNFT(tokenURI) { ) }) .catch((err) => { - console.log("Promise failed:", err) + console.log("Promise fehlgeschlagen:", err) }) } mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP") ``` -Führen Sie nun `node scripts/mint-nft.js` aus, um Ihren NFT bereitzustellen. Nach ein paar Sekunden sollten Sie eine Antwort wie diese in Ihrem Terminal sehen: +Führen Sie nun `node scripts/mint-nft.js` aus, um Ihren NFT zu prägen. Nach einigen Sekunden sollten Sie eine Antwort wie diese in Ihrem Terminal sehen: - The hash of your transaction is: 0x10e5062309de0cd0be7edc92e8dbab191aa2791111c44274483fa766039e0e00 + ``` + Der Hash Ihrer Transaktion lautet: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8 + + Überprüfen Sie den Mempool von Alchemy, um den Status Ihrer Transaktion anzuzeigen! + ``` - Check Alchemy's Mempool to view the status of your transaction! +Besuchen Sie als Nächstes Ihren [Alchemy-Mempool](https://dashboard.alchemyapi.io/mempool), um den Status Ihrer Transaktion zu sehen (ob sie ausstehend ist, gemined wurde oder vom Netzwerk verworfen wurde). Wenn Ihre Transaktion verworfen wurde, ist es auch hilfreich, [Blockscout](https://eth-sepolia.blockscout.com/) zu überprüfen und nach Ihrem Transaktions-Hash zu suchen. -Als Nächstes gehen Sie zu Ihrem [Alchemy-Mempool](https://dashboard.alchemyapi.io/mempool), um den Status Ihrer Transaktion zu sehen (ob sie ausstehend ist, geprägt oder vom Netzwerk abgebrochen wurde). Wenn Ihre Transaktion abgebrochen wurde, ist es auch hilfreich, [Ropsten-Etherscan](https://ropsten.etherscan.io/) zu überprüfen und nach Ihrem Transaktionshash zu suchen. +![Ihren NFT-Transaktions-Hash auf Etherscan anzeigen](./view-nft-etherscan.png)_Ihren NFT-Transaktions-Hash auf Etherscan anzeigen_ -![Ihren NFT-Transaktions-Hash auf Etherscan anzeigen](./viewNFTEtherscan.png)_NFT-Transaktionshash auf Etherscan ansehen_ +Und das war's! Sie haben nun einen NFT auf der Ethereum-Blockchain bereitgestellt UND geprägt -Das war's! Sie haben jetzt einen NFT auf der Ethereum-Blockchain veröffentlicht UND geprägt. +Mit `mint-nft.js` können Sie so viele NFTs prägen, wie Ihr Herz (und Ihr Wallet) begehrt! Stellen Sie nur sicher, dass Sie eine neue tokenURI übergeben, die die Metadaten des NFT beschreibt (andernfalls erstellen Sie nur einen Haufen identischer NFTs mit unterschiedlichen IDs). -Mit der `mint-nft.js` können Sie so viele NFTs prägen, wie Sie möchten (und Ihre Wallet zulässt). Vergewissern Sie sich nur, dass Sie eine neue tokenURI übermitteln, die die Metadaten der NFTs beschreibt (andernfalls würden Sie nur einen Haufen identischer Token mit unterschiedlichen IDs erstellen). - -Vermutlich möchten Sie, dass Ihre NFTs in Ihrer Wallet erscheinen. Lesen Sie also unbedingt [Teil 3: So können Sie Ihre NFTs in Ihrer Wallet anzeigen](/developers/tutorials/how-to-view-nft-in-metamask/). +Vermutlich möchten Sie Ihren NFT in Ihrem Wallet präsentieren können – schauen Sie sich also unbedingt [Teil 3: Wie Sie Ihren NFT in Ihrem Wallet anzeigen](/developers/tutorials/how-to-view-nft-in-metamask/) an! diff --git a/public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md b/public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md new file mode 100644 index 00000000000..20da987ce84 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md @@ -0,0 +1,108 @@ +--- +title: So simulieren Sie Solidity Smart Contracts für Testzwecke +description: Warum Sie sich beim Testen über Ihre Verträge lustig machen sollten +author: Markus Waas +lang: de +tags: + [ + "solidity", + "intelligente Verträge", + "testen", + "mocking" + ] +skill: intermediate +published: 2020-05-02 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/mocking-contracts +--- + +[Mockobjekte](https://wikipedia.org/wiki/Mock_object) sind ein übliches Entwurfsmuster in der objektorientierten Programmierung. Das Wort stammt von dem französischen Wort "mocquer" ab, das so viel bedeutet wie "sich über etwas lustig machen". Es bedeutet aber auch "etwas nachbilden" was genau das ist, was in der Programmierung gemacht wird. Machen Sie sich bitte nur über Ihre Smart Contracts lustig, wenn Sie wollen, aber simulieren Sie sie, wann immer Sie können. Das macht Ihr Leben einfacher. + +## Unittests von Verträgen mit Mocks {#unit-testing-contracts-with-mocks} + +Das Mocking eines Vertrags bedeutet im Wesentlichen, eine zweite Version dieses Vertrags zu erstellen, die sich sehr ähnlich wie das Original verhält, jedoch auf eine Weise, die vom Entwickler leicht kontrolliert werden kann. Oft hat man es mit komplexen Verträgen zu tun, bei denen man nur [kleine Teile des Vertrags per Unittest testen](/developers/docs/smart-contracts/testing/) möchte. Das Problem dabei ist: Was ist, wenn das Testen dieses kleinen Teils einen ganz bestimmten Vertragszustand erfordert, der nur schwer zu erreichen ist? + +Sie könnten jedes Mal eine komplexe Test-Setup-Logik schreiben, die den Vertrag in den erforderlichen Zustand bringt, oder Sie schreiben einen Mock. Das Mocking eines Vertrags ist mit Vererbung einfach. Erstellen Sie einfach einen zweiten Mock-Vertrag, der vom ursprünglichen erbt. Jetzt können Sie Funktionen in Ihrem Mock überschreiben. Sehen wir uns ein Beispiel an. + +## Beispiel: Privates ERC20 {#example-private-erc20} + +Wir verwenden einen beispielhaften ERC-20-Vertrag, der anfänglich eine private Phase hat. Der Eigentümer kann private Benutzer verwalten und nur diesen ist es zu Beginn gestattet, Tokens zu erhalten. Sobald eine bestimmte Zeit vergangen ist, darf jeder die Tokens verwenden. Falls Sie neugierig sind: Wir verwenden den [`_beforeTokenTransfer`](https://docs.openzeppelin.com/contracts/5.x/extending-contracts#using-hooks)-Hook aus den neuen OpenZeppelin Contracts v3. + +```solidity +pragma solidity ^0.6.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract PrivateERC20 is ERC20, Ownable { + mapping (address => bool) public isPrivateUser; + uint256 private publicAfterTime; + + constructor(uint256 privateERC20timeInSec) ERC20("PrivateERC20", "PRIV") public { + publicAfterTime = now + privateERC20timeInSec; + } + + function addUser(address user) external onlyOwner { + isPrivateUser[user] = true; + } + + function isPublic() public view returns (bool) { + return now >= publicAfterTime; + } + + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { + super._beforeTokenTransfer(from, to, amount); + + require(_validRecipient(to), "PrivateERC20: ungültiger Empfänger"); + } + + function _validRecipient(address to) private view returns (bool) { + if (isPublic()) { + return true; + } + + return isPrivateUser[to]; + } +} +``` + +Und nun werden wir ihn mocken. + +```solidity +pragma solidity ^0.6.0; +import "../PrivateERC20.sol"; + +contract PrivateERC20Mock is PrivateERC20 { + bool isPublicConfig; + + constructor() public PrivateERC20(0) {} + + function setIsPublic(bool isPublic) external { + isPublicConfig = isPublic; + } + + function isPublic() public view returns (bool) { + return isPublicConfig; + } +} +``` + +Sie erhalten eine der folgenden Fehlermeldungen: + +- `PrivateERC20Mock.sol: TypeError: Overriding function is missing "override" specifier.` +- `PrivateERC20.sol: TypeError: Trying to override non-virtual function. Did you forget to add "virtual"?.` + +Da wir die neue Solidity-Version 0.6 verwenden, müssen wir das Schlüsselwort `virtual` für Funktionen, die überschrieben werden können, und `override` für die überschreibende Funktion hinzufügen. Fügen wir diese also beiden `isPublic`-Funktionen hinzu. + +In Ihren Unittests können Sie jetzt stattdessen `PrivateERC20Mock` verwenden. Wenn Sie das Verhalten während der privaten Nutzungszeit testen möchten, verwenden Sie `setIsPublic(false)` und entsprechend `setIsPublic(true)` zum Testen der öffentlichen Nutzungszeit. Natürlich könnten wir in unserem Beispiel auch einfach [Zeithelfer](https://docs.openzeppelin.com/test-helpers/0.5/api#increase) verwenden, um die Zeiten entsprechend zu ändern. Aber die Idee des Mockings sollte jetzt klar sein und Sie können sich Szenarien vorstellen, in denen es nicht so einfach ist, wie nur die Zeit vorzustellen. + +## Mocking vieler Verträge {#mocking-many-contracts} + +Es kann unübersichtlich werden, wenn Sie für jeden einzelnen Mock einen weiteren Vertrag erstellen müssen. Wenn Sie das stört, können Sie sich die [MockContract](https://github.com/gnosis/mock-contract)-Bibliothek ansehen. Sie ermöglicht es Ihnen, das Verhalten von Verträgen zur Laufzeit zu überschreiben und zu ändern. Sie funktioniert jedoch nur für das Mocking von Aufrufen an einen anderen Vertrag, weshalb sie für unser Beispiel nicht funktionieren würde. + +## Mocking kann noch leistungsfähiger sein {#mocking-can-be-even-more-powerful} + +Die Möglichkeiten des Mockings enden hier nicht. + +- Hinzufügen von Funktionen: Nicht nur das Überschreiben einer bestimmten Funktion ist nützlich, sondern auch das einfache Hinzufügen zusätzlicher Funktionen. Ein gutes Beispiel für Tokens ist es, einfach eine zusätzliche `mint`-Funktion zu haben, die es jedem Benutzer erlaubt, kostenlos neue Tokens zu erhalten. +- Verwendung in Testnets: Wenn Sie Ihre Verträge zusammen mit Ihrer Dapp auf Testnets bereitstellen und testen, sollten Sie die Verwendung einer gemockten Version in Betracht ziehen. Vermeiden Sie das Überschreiben von Funktionen, es sei denn, es ist absolut notwendig. Schließlich wollen Sie ja die eigentliche Logik testen. Aber das Hinzufügen zum Beispiel einer Reset-Funktion, die den Vertragszustand einfach auf den Anfang zurücksetzt, kann nützlich sein, ohne dass eine neue Bereitstellung erforderlich ist. Offensichtlich würden Sie das nicht in einem Mainnet-Vertrag haben wollen. diff --git a/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md new file mode 100644 index 00000000000..c8af715fb23 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md @@ -0,0 +1,709 @@ +--- +title: So verwenden Sie Echidna zum Testen von Smart Contracts +description: So verwenden Sie Echidna zum automatischen Testen von Smart Contracts +author: "Spuren von bits" +lang: de +tags: + [ + "solidity", + "intelligente Verträge", + "Sicherheit", + "testen", + "Fuzzing" + ] +skill: advanced +published: 2020-04-10 +source: Aufbau sicherer Verträge +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna +--- + +## Installation {#installation} + +Echidna kann über Docker oder durch Verwendung des vorkompilierten Binärprogramms installiert werden. + +### Echidna über Docker {#echidna-through-docker} + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox +``` + +_Der letzte Befehl führt die eth-security-toolbox in einem Docker aus, der Zugriff auf dein aktuelles Verzeichnis hat. Du kannst die Dateien von deinem Host aus ändern und die Tools für die Dateien aus dem Docker ausführen_ + +Führen Sie in Docker Folgendes aus: + +```bash +solc-select 0.5.11 +cd /home/training +``` + +### Binär {#binary} + +[https://github.com/crytic/echidna/releases/tag/v1.4.0.0](https://github.com/crytic/echidna/releases/tag/v1.4.0.0) + +## Einführung in das eigenschaftsbasierte Fuzzing {#introduction-to-property-based-fuzzing} + +Echidna ist ein eigenschaftsbasierter Fuzzer, den wir in unseren vorherigen Blogbeiträgen beschrieben haben ([1](https://blog.trailofbits.com/2018/03/09/echidna-a-smart-fuzzer-for-ethereum/), [2](https://blog.trailofbits.com/2018/05/03/state-machine-testing-with-echidna/), [3](https://blog.trailofbits.com/2020/03/30/an-echidna-for-all-seasons/)). + +### Fuzzing {#fuzzing} + +[Fuzzing](https://wikipedia.org/wiki/Fuzzing) ist eine bekannte Technik in der Sicherheits-Community. Sie besteht darin, mehr oder weniger zufällige Eingaben zu generieren, um Fehler im Programm zu finden. Fuzzer für traditionelle Software (wie [AFL](http://lcamtuf.coredump.cx/afl/) oder [LibFuzzer](https://llvm.org/docs/LibFuzzer.html)) sind als effiziente Werkzeuge zur Fehlersuche bekannt. + +Über die rein zufällige Generierung von Eingaben hinaus gibt es viele Techniken und Strategien, um gute Eingaben zu generieren, darunter: + +- Feedback aus jeder Ausführung einholen und die Generierung damit steuern. Wenn zum Beispiel eine neu generierte Eingabe zur Entdeckung eines neuen Pfades führt, kann es sinnvoll sein, neue Eingaben in dessen Nähe zu generieren. +- Generierung der Eingabe unter Einhaltung einer strukturellen Beschränkung. Wenn Ihre Eingabe zum Beispiel einen Header mit einer Prüfsumme enthält, ist es sinnvoll, den Fuzzer Eingaben generieren zu lassen, die die Prüfsumme validieren. +- Verwendung bekannter Eingaben zur Generierung neuer Eingaben: Wenn Sie Zugriff auf einen großen Datensatz gültiger Eingaben haben, kann Ihr Fuzzer daraus neue Eingaben generieren, anstatt die Generierung von Grund auf neu zu starten. Diese werden in der Regel _Seeds_ genannt. + +### Eigenschaftsbasiertes Fuzzing {#property-based-fuzzing} + +Echidna gehört zu einer bestimmten Familie von Fuzzern: dem eigenschaftsbasierten Fuzzing, das stark von [QuickCheck](https://wikipedia.org/wiki/QuickCheck) inspiriert ist. Im Gegensatz zu klassischen Fuzzern, die versuchen, Abstürze zu finden, wird Echidna versuchen, benutzerdefinierte Invarianten zu brechen. + +In Smart Contracts sind Invarianten Solidity-Funktionen, die jeden inkorrekten oder ungültigen Zustand, den der Vertrag erreichen kann, darstellen können, einschließlich: + +- Falsche Zugriffskontrolle: Der Angreifer wurde zum Eigentümer des Vertrags. +- Falsche Statusmaschine: Die Token können übertragen werden, während der Vertrag pausiert ist. +- Falsche Arithmetik: der Benutzer kann sein Guthaben unterlaufen lassen und unbegrenzt kostenlose Token erhalten. + +### Testen einer Eigenschaft mit Echidna {#testing-a-property-with-echidna} + +Wir werden sehen, wie man einen Smart Contract mit Echidna testet. Das Ziel ist der folgende Smart Contract [`token.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/token.sol): + +```solidity +contract Token{ + mapping(address => uint) public balances; + function airdrop() public{ + balances[msg.sender] = 1000; + } + function consume() public{ + require(balances[msg.sender]>0); + balances[msg.sender] -= 1; + } + function backdoor() public{ + balances[msg.sender] += 1; + } +} +``` + +Wir gehen davon aus, dass dieser Token die folgenden Eigenschaften haben muss: + +- Jeder kann maximal 1000 Token haben +- Der Token kann nicht übertragen werden (es ist kein ERC20-Token) + +### Eine Eigenschaft schreiben {#write-a-property} + +Echidna-Eigenschaften sind Solidity-Funktionen. Eine Eigenschaft muss: + +- Kein Argument haben +- `true` zurückgeben, wenn es erfolgreich ist +- Der Name muss mit `echidna` beginnen + +Echidna wird: + +- Automatisch beliebige Transaktionen generieren, um die Eigenschaft zu testen. +- Alle Transaktionen melden, die dazu führen, dass eine Eigenschaft `false` zurückgibt oder einen Fehler auslöst. +- Nebeneffekte beim Aufrufen einer Eigenschaft verwerfen (d. h., wenn die Eigenschaft eine Zustandsvariable ändert, wird sie nach dem Test verworfen) + +Die folgende Eigenschaft prüft, dass der Aufrufer nicht mehr als 1000 Token hat: + +```solidity +function echidna_balance_under_1000() public view returns(bool){ + return balances[msg.sender] <= 1000; +} +``` + +Verwenden Sie Vererbung, um Ihren Vertrag von Ihren Eigenschaften zu trennen: + +```solidity +contract TestToken is Token{ + function echidna_balance_under_1000() public view returns(bool){ + return balances[msg.sender] <= 1000; + } + } +``` + +[`token.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/token.sol) implementiert die Eigenschaft und erbt vom Token. + +### Einen Vertrag initiieren {#initiate-a-contract} + +Echidna benötigt einen [Konstruktor](/developers/docs/smart-contracts/anatomy/#constructor-functions) ohne Argument. Wenn Ihr Vertrag eine spezifische Initialisierung benötigt, müssen Sie dies im Konstruktor tun. + +Es gibt einige spezifische Adressen in Echidna: + +- `0x00a329c0648769A73afAc7F9381E08FB43dBEA72`, die den Konstruktor aufruft. +- `0x10000`, `0x20000`, und `0x00a329C0648769a73afAC7F9381e08fb43DBEA70`, die zufällig die anderen Funktionen aufrufen. + +In unserem aktuellen Beispiel benötigen wir keine besondere Initialisierung, daher ist unser Konstruktor leer. + +### Echidna ausführen {#run-echidna} + +Echidna wird gestartet mit: + +```bash +echidna-test contract.sol +``` + +Wenn contract.sol mehrere Verträge enthält, können Sie das Ziel angeben: + +```bash +echidna-test contract.sol --contract MyContract +``` + +### Zusammenfassung: Testen einer Eigenschaft {#summary-testing-a-property} + +Das Folgende fasst die Ausführung von Echidna an unserem Beispiel zusammen: + +```solidity +contract TestToken is Token{ + constructor() public {} + function echidna_balance_under_1000() public view returns(bool){ + return balances[msg.sender] <= 1000; + } + } +``` + +```bash +echidna-test testtoken.sol --contract TestToken +... + +echidna_balance_under_1000: failed!💥 + Call sequence, shrinking (1205/5000): + airdrop() + backdoor() + +... +``` + +Echidna hat herausgefunden, dass die Eigenschaft verletzt wird, wenn `backdoor` aufgerufen wird. + +## Filtern von Funktionen, die während einer Fuzzing-Kampagne aufgerufen werden sollen {#filtering-functions-to-call-during-a-fuzzing-campaign} + +Wir werden sehen, wie man die zu fuzzenden Funktionen filtert. +Das Ziel ist der folgende Smart Contract: + +```solidity +contract C { + bool state1 = false; + bool state2 = false; + bool state3 = false; + bool state4 = false; + + function f(uint x) public { + require(x == 12); + state1 = true; + } + + function g(uint x) public { + require(state1); + require(x == 8); + state2 = true; + } + + function h(uint x) public { + require(state2); + require(x == 42); + state3 = true; + } + + function i() public { + require(state3); + state4 = true; + } + + function reset1() public { + state1 = false; + state2 = false; + state3 = false; + return; + } + + function reset2() public { + state1 = false; + state2 = false; + state3 = false; + return; + } + + function echidna_state4() public returns (bool) { + return (!state4); + } +} +``` + +Dieses kleine Beispiel zwingt Echidna, eine bestimmte Sequenz von Transaktionen zu finden, um eine Zustandsvariable zu ändern. +Das ist schwierig für einen Fuzzer (es wird empfohlen, ein symbolisches Ausführungswerkzeug wie [Manticore](https://github.com/trailofbits/manticore) zu verwenden). +Wir können Echidna ausführen, um dies zu überprüfen: + +```bash +echidna-test multi.sol +... +echidna_state4: passed! 🎉 +Seed: -3684648582249875403 +``` + +### Filterfunktionen {#filtering-functions} + +Echidna hat Schwierigkeiten, die richtige Sequenz zum Testen dieses Vertrags zu finden, da die beiden Reset-Funktionen (`reset1` und `reset2`) alle Zustandsvariablen auf `false` setzen. +Wir können jedoch eine spezielle Echidna-Funktion verwenden, um entweder die Reset-Funktion auf eine schwarze Liste zu setzen oder nur die Funktionen `f`, `g`, +`h` und `i` auf eine weiße Liste zu setzen. + +Um Funktionen auf die schwarze Liste zu setzen, können wir diese Konfigurationsdatei verwenden: + +```yaml +filterBlacklist: true +filterFunctions: ["reset1", "reset2"] +``` + +Ein anderer Ansatz zum Filtern von Funktionen besteht darin, die auf der weißen Liste stehenden Funktionen aufzulisten. Dazu können wir diese Konfigurationsdatei verwenden: + +```yaml +filterBlacklist: false +filterFunctions: ["f", "g", "h", "i"] +``` + +- `filterBlacklist` ist standardmäßig `true`. +- Die Filterung erfolgt nur nach Namen (ohne Parameter). Wenn Sie `f()` und `f(uint256)` haben, wird der Filter `"f"` auf beide Funktionen passen. + +### Echidna ausführen {#run-echidna-1} + +Um Echidna mit einer Konfigurationsdatei `blacklist.yaml` auszuführen: + +```bash +echidna-test multi.sol --config blacklist.yaml +... +echidna_state4: failed!💥 + Call sequence: + f(12) + g(8) + h(42) + i() +``` + +Echidna wird die Sequenz der Transaktionen, um die Eigenschaft zu widerlegen, fast sofort finden. + +### Zusammenfassung: Filterfunktionen {#summary-filtering-functions} + +Echidna kann während einer Fuzzing-Kampagne entweder Funktionen auf eine schwarze oder eine weiße Liste setzen, indem es Folgendes verwendet: + +```yaml +filterBlacklist: true +filterFunctions: ["f1", "f2", "f3"] +``` + +```bash +echidna-test contract.sol --config config.yaml +... +``` + +Echidna startet eine Fuzzing-Kampagne, bei der `f1`, `f2` und `f3` entweder auf der schwarzen Liste stehen oder nur diese aufgerufen werden, je nach dem Wert des `filterBlacklist`-Booleans. + +## Wie man Soliditys `assert` mit Echidna testet {#how-to-test-soliditys-assert-with-echidna} + +In diesem kurzen Tutorial zeigen wir, wie man Echidna zum Testen der Assertionsprüfung in Verträgen verwendet. Nehmen wir an, wir haben einen Vertrag wie diesen: + +```solidity +contract Incrementor { + uint private counter = 2**200; + + function inc(uint val) public returns (uint){ + uint tmp = counter; + counter += val; + // tmp <= counter + return (counter - tmp); + } +} +``` + +### Eine Assertion schreiben {#write-an-assertion} + +Wir wollen sicherstellen, dass `tmp` kleiner oder gleich `counter` ist, nachdem die Differenz zurückgegeben wurde. Wir könnten eine +Echidna-Eigenschaft schreiben, aber wir müssten den `tmp`-Wert irgendwo speichern. Stattdessen könnten wir eine Assertion wie diese verwenden: + +```solidity +contract Incrementor { + uint private counter = 2**200; + + function inc(uint val) public returns (uint){ + uint tmp = counter; + counter += val; + assert (tmp <= counter); + return (counter - tmp); + } +} +``` + +### Echidna ausführen {#run-echidna-2} + +Um das Testen von Assertionsfehlern zu aktivieren, erstellen Sie eine [Echidna-Konfigurationsdatei](https://github.com/crytic/echidna/wiki/Config) `config.yaml`: + +```yaml +checkAsserts: true +``` + +Wenn wir diesen Vertrag in Echidna ausführen, erhalten wir die erwarteten Ergebnisse: + +```bash +echidna-test assert.sol --config config.yaml +Analyzing contract: assert.sol:Incrementor +assertion in inc: failed!💥 + Call sequence, shrinking (2596/5000): + inc(21711016731996786641919559689128982722488122124807605757398297001483711807488) + inc(7237005577332262213973186563042994240829374041602535252466099000494570602496) + inc(86844066927987146567678238756515930889952488499230423029593188005934847229952) + +Seed: 1806480648350826486 +``` + +Wie Sie sehen können, meldet Echidna einen Assertionsfehler in der `inc`-Funktion. Das Hinzufügen von mehr als einer Assertion pro Funktion ist möglich, aber Echidna kann nicht sagen, welche Assertion fehlgeschlagen ist. + +### Wann und wie man Assertions verwendet {#when-and-how-use-assertions} + +Assertions können als Alternative zu expliziten Eigenschaften verwendet werden, insbesondere wenn die zu prüfenden Bedingungen direkt mit der korrekten Verwendung einer Operation `f` zusammenhängen. Das Hinzufügen von Assertions nach einem Code erzwingt, dass die Prüfung unmittelbar nach dessen Ausführung stattfindet: + +```solidity +function f(..) public { + // some complex code + ... + assert (condition); + ... +} + +``` + +Im Gegenteil, die Verwendung einer expliziten Echidna-Eigenschaft führt zu einer zufälligen Ausführung von Transaktionen, und es gibt keine einfache Möglichkeit, genau zu erzwingen, wann sie überprüft wird. Es ist immer noch möglich, diesen Workaround zu verwenden: + +```solidity +function echidna_assert_after_f() public returns (bool) { + f(..); + return(condition); +} +``` + +Es gibt jedoch einige Probleme: + +- Es schlägt fehl, wenn `f` als `internal` oder `external` deklariert ist. +- Es ist unklar, welche Argumente zum Aufrufen von `f` verwendet werden sollen. +- Wenn `f` fehlschlägt, wird die Eigenschaft ebenfalls fehlschlagen. + +Im Allgemeinen empfehlen wir, [John Regehrs Empfehlung](https://blog.regehr.org/archives/1091) zur Verwendung von Assertions zu folgen: + +- Erzwingen Sie keine Nebeneffekte während der Assertionsprüfung. Zum Beispiel: `assert(ChangeStateAndReturn() == 1)` +- Behaupten Sie keine offensichtlichen Aussagen. Zum Beispiel `assert(var >= 0)`, wobei `var` als `uint` deklariert ist. + +Schließlich, bitte **verwenden Sie nicht** `require` anstelle von `assert`, da Echidna es nicht erkennen kann (aber der Vertrag wird trotzdem fehlschlagen). + +### Zusammenfassung: Assertionsprüfung {#summary-assertion-checking} + +Das Folgende fasst die Ausführung von Echidna an unserem Beispiel zusammen: + +```solidity +contract Incrementor { + uint private counter = 2**200; + + function inc(uint val) public returns (uint){ + uint tmp = counter; + counter += val; + assert (tmp <= counter); + return (counter - tmp); + } +} +``` + +```bash +echidna-test assert.sol --config config.yaml +Analyzing contract: assert.sol:Incrementor +assertion in inc: failed!💥 + Call sequence, shrinking (2596/5000): + inc(21711016731996786641919559689128982722488122124807605757398297001483711807488) + inc(7237005577332262213973186563042994240829374041602535252466099000494570602496) + inc(86844066927987146567678238756515930889952488499230423029593188005934847229952) + +Seed: 1806480648350826486 +``` + +Echidna hat herausgefunden, dass die Assertion in `inc` fehlschlagen kann, wenn diese Funktion mehrmals mit großen Argumenten aufgerufen wird. + +## Sammeln und Modifizieren eines Echidna-Korpus {#collecting-and-modifying-an-echidna-corpus} + +Wir werden sehen, wie man mit Echidna einen Korpus von Transaktionen sammelt und verwendet. Das Ziel ist der folgende Smart Contract [`magic.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/magic.sol): + +```solidity +contract C { + bool value_found = false; + function magic(uint magic_1, uint magic_2, uint magic_3, uint magic_4) public { + require(magic_1 == 42); + require(magic_2 == 129); + require(magic_3 == magic_4+333); + value_found = true; + return; + } + + function echidna_magic_values() public returns (bool) { + return !value_found; + } + +} +``` + +Dieses kleine Beispiel zwingt Echidna, bestimmte Werte zu finden, um eine Zustandsvariable zu ändern. Das ist schwierig für einen Fuzzer +(es wird empfohlen, ein symbolisches Ausführungswerkzeug wie [Manticore](https://github.com/trailofbits/manticore) zu verwenden). +Wir können Echidna ausführen, um dies zu überprüfen: + +```bash +echidna-test magic.sol +... + +echidna_magic_values: passed! 🎉 + +Seed: 2221503356319272685 +``` + +Wir können Echidna jedoch immer noch verwenden, um während dieser Fuzzing-Kampagne einen Korpus zu sammeln. + +### Einen Korpus sammeln {#collecting-a-corpus} + +Um die Korpus-Sammlung zu aktivieren, erstellen Sie ein Korpus-Verzeichnis: + +```bash +mkdir corpus-magic +``` + +Und eine [Echidna-Konfigurationsdatei](https://github.com/crytic/echidna/wiki/Config) `config.yaml`: + +```yaml +coverage: true +corpusDir: "corpus-magic" +``` + +Jetzt können wir unser Werkzeug ausführen und den gesammelten Korpus überprüfen: + +```bash +echidna-test magic.sol --config config.yaml +``` + +Echidna kann immer noch nicht die richtigen magischen Werte finden, aber wir können uns den Korpus ansehen, den es gesammelt hat. +Eine dieser Dateien war zum Beispiel: + +```json +[ + { + "_gas'": "0xffffffff", + "_delay": ["0x13647", "0xccf6"], + "_src": "00a329c0648769a73afac7f9381e08fb43dbea70", + "_dst": "00a329c0648769a73afac7f9381e08fb43dbea72", + "_value": "0x0", + "_call": { + "tag": "SolCall", + "contents": [ + "magic", + [ + { + "contents": [ + 256, + "93723985220345906694500679277863898678726808528711107336895287282192244575836" + ], + "tag": "AbiUInt" + }, + { + "contents": [256, "334"], + "tag": "AbiUInt" + }, + { + "contents": [ + 256, + "68093943901352437066264791224433559271778087297543421781073458233697135179558" + ], + "tag": "AbiUInt" + }, + { + "tag": "AbiUInt", + "contents": [256, "332"] + } + ] + ] + }, + "_gasprice'": "0xa904461f1" + } +] +``` + +Offensichtlich wird diese Eingabe den Fehler in unserer Eigenschaft nicht auslösen. Im nächsten Schritt werden wir jedoch sehen, wie wir sie dafür modifizieren können. + +### Einen Korpus mit Startwerten versehen {#seeding-a-corpus} + +Echidna benötigt etwas Hilfe, um mit der `magic`-Funktion umzugehen. Wir werden die Eingabe kopieren und modifizieren, um geeignete +Parameter dafür zu verwenden: + +```bash +cp corpus/2712688662897926208.txt corpus/new.txt +``` + +Wir werden `new.txt` modifizieren, um `magic(42,129,333,0)` aufzurufen. Jetzt können wir Echidna erneut ausführen: + +```bash +echidna-test magic.sol --config config.yaml +... +echidna_magic_values: failed!💥 + Call sequence: + magic(42,129,333,0) + + +Unique instructions: 142 +Unique codehashes: 1 +Seed: -7293830866560616537 + +``` + +Dieses Mal wurde sofort festgestellt, dass die Eigenschaft verletzt wird. + +## Transaktionen mit hohem Gasverbrauch finden {#finding-transactions-with-high-gas-consumption} + +Wir werden sehen, wie man mit Echidna die Transaktionen mit hohem Gasverbrauch findet. Das Ziel ist der folgende Smart Contract: + +```solidity +contract C { + uint state; + + function expensive(uint8 times) internal { + for(uint8 i=0; i < times; i++) + state = state + i; + } + + function f(uint x, uint y, uint8 times) public { + if (x == 42 && y == 123) + expensive(times); + else + state = 0; + } + + function echidna_test() public returns (bool) { + return true; + } + +} +``` + +Hier kann `expensive` einen hohen Gasverbrauch haben. + +Derzeit benötigt Echidna immer eine Eigenschaft zum Testen: hier gibt `echidna_test` immer `true` zurück. +Wir können Echidna ausführen, um dies zu überprüfen: + +``` +echidna-test gas.sol +... +echidna_test: passed! 🎉 + +Seed: 2320549945714142710 +``` + +### Gasverbrauch messen {#measuring-gas-consumption} + +Um den Gasverbrauch mit Echidna zu aktivieren, erstellen Sie eine Konfigurationsdatei `config.yaml`: + +```yaml +estimateGas: true +``` + +In diesem Beispiel werden wir auch die Größe der Transaktionssequenz reduzieren, um die Ergebnisse leichter verständlich zu machen: + +```yaml +seqLen: 2 +estimateGas: true +``` + +### Echidna ausführen {#run-echidna-3} + +Sobald wir die Konfigurationsdatei erstellt haben, können wir Echidna so ausführen: + +```bash +echidna-test gas.sol --config config.yaml +... +echidna_test: passed! 🎉 + +f used a maximum of 1333608 gas + Call sequence: + f(42,123,249) Gas price: 0x10d5733f0a Time delay: 0x495e5 Block delay: 0x88b2 + +Unique instructions: 157 +Unique codehashes: 1 +Seed: -325611019680165325 + +``` + +- Das angezeigte Gas ist eine Schätzung, die von [HEVM](https://github.com/dapphub/dapptools/tree/master/src/hevm#hevm-) bereitgestellt wird. + +### Gasreduzierende Aufrufe herausfiltern {#filtering-out-gas-reducing-calls} + +Das Tutorial zum **Filtern von Funktionen, die während einer Fuzzing-Kampagne aufgerufen werden** oben zeigt, wie man +einige Funktionen aus dem Test entfernt. +Dies kann entscheidend sein, um eine genaue Gasschätzung zu erhalten. +Betrachte das folgende Beispiel: + +```solidity +contract C { + address [] addrs; + function push(address a) public { + addrs.push(a); + } + function pop() public { + addrs.pop(); + } + function clear() public{ + addrs.length = 0; + } + function check() public{ + for(uint256 i = 0; i < addrs.length; i++) + for(uint256 j = i+1; j < addrs.length; j++) + if (addrs[i] == addrs[j]) + addrs[j] = address(0x0); + } + function echidna_test() public returns (bool) { + return true; + } +} +``` + +Wenn Echidna alle Funktionen aufrufen kann, wird es nicht leicht Transaktionen mit hohen Gaskosten finden: + +``` +echidna-test pushpop.sol --config config.yaml +... +pop used a maximum of 10746 gas +... +check used a maximum of 23730 gas +... +clear used a maximum of 35916 gas +... +push used a maximum of 40839 gas +``` + +Das liegt daran, dass die Kosten von der Größe von `addrs` abhängen und zufällige Aufrufe dazu neigen, das Array fast leer zu lassen. +Das Setzen von `pop` und `clear` auf die schwarze Liste liefert uns jedoch viel bessere Ergebnisse: + +```yaml +filterBlacklist: true +filterFunctions: ["pop", "clear"] +``` + +``` +echidna-test pushpop.sol --config config.yaml +... +push used a maximum of 40839 gas +... +check used a maximum of 1484472 gas +``` + +### Zusammenfassung: Finden von Transaktionen mit hohem Gasverbrauch {#summary-finding-transactions-with-high-gas-consumption} + +Echidna kann Transaktionen mit hohem Gasverbrauch finden, indem es die Konfigurationsoption `estimateGas` verwendet: + +```yaml +estimateGas: true +``` + +```bash +echidna-test contract.sol --config config.yaml +... +``` + +Echidna wird nach Abschluss der Fuzzing-Kampagne für jede Funktion eine Sequenz mit dem maximalen Gasverbrauch melden. diff --git a/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md new file mode 100644 index 00000000000..642a506ae7c --- /dev/null +++ b/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md @@ -0,0 +1,522 @@ +--- +title: So nutzt du Manticore, um Fehler in Smart Contracts zu finden +description: So nutzt du Manticore, um automatisiert Fehler in Smart Contracts zu finden +author: Spuren von bits +lang: de +tags: + [ + "solidity", + "intelligente Verträge", + "Sicherheit", + "testen", + "Formale Verifizierung" + ] +skill: advanced +published: 13.01.2020 +source: Aufbau sicherer Verträge +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore +--- + +Das Ziel dieses Tutorials ist es zu zeigen, wie du Manticore nutzt, um automatisch Fehler in Smart Contracts zu finden. + +## Installation {#installation} + +Manticore erfordert Python >= 3.6. Die Installation kann über pip oder Docker erfolgen. + +### Manticore über Docker {#manticore-through-docker} + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox +``` + +_Der letzte Befehl führt die eth-security-toolbox in einem Docker aus, der Zugriff auf dein aktuelles Verzeichnis hat. Du kannst die Dateien von deinem Host aus ändern und die Tools für die Dateien aus dem Docker ausführen_ + +Führe im Docker aus: + +```bash +solc-select 0.5.11 +cd /home/trufflecon/ +``` + +### Manticore über pip {#manticore-through-pip} + +```bash +pip3 install --user manticore +``` + +solc 0.5.11 wird empfohlen. + +### Ausführen eines Skripts {#running-a-script} + +So führst du ein Python-Skript mit Python 3 aus: + +```bash +python3 script.py +``` + +## Einführung in die dynamische symbolische Ausführung {#introduction-to-dynamic-symbolic-execution} + +### Dynamische symbolische Ausführung – kurz erklärt {#dynamic-symbolic-execution-in-a-nutshell} + +Die dynamische symbolische Ausführung (DSE) ist eine Programmanalysetechnik, die einen Zustandsraum mit einem hohen Grad an semantischem Bewusstsein untersucht. Diese Technik basiert auf der Entdeckung von „Programmpfaden“, die als mathematische Formeln, sogenannte `path predicates`, dargestellt werden. Konzeptionell arbeitet diese Technik in zwei Schritten mit Pfadprädikaten: + +1. Sie werden unter Verwendung von Einschränkungen für die Programmeingabe konstruiert. +2. Sie werden verwendet, um Programmeingaben zu generieren, die die Ausführung der zugehörigen Pfade bewirken. + +Dieser Ansatz erzeugt keine Falsch-Positiv-Meldungen, da alle identifizierten Programmzustände während einer konkreten Ausführung ausgelöst werden können. Findet die Analyse beispielsweise einen Integer-Überlauf, ist dieser garantiert reproduzierbar. + +### Beispiel für ein Pfadprädikat {#path-predicate-example} + +Um einen Einblick in die Funktionsweise von DSE zu erhalten, sieh dir das folgende Beispiel an: + +```solidity +function f(uint a){ + + if (a == 65) { + // Ein Fehler ist vorhanden + } + +} +``` + +Da `f()` zwei Pfade enthält, konstruiert eine DSE zwei verschiedene Pfadprädikate: + +- Pfad 1: `a == 65` +- Pfad 2: `Not (a == 65)` + +Jedes Pfadprädikat ist eine mathematische Formel, die an einen sogenannten [SMT-Solver](https://wikipedia.org/wiki/Satisfiability_modulo_theories) übergeben werden kann, der versucht, die Gleichung zu lösen. Für `Pfad 1` wird der Solver ausgeben, dass der Pfad mit `a = 65` untersucht werden kann. Für `Pfad 2` kann der Solver für `a` einen beliebigen anderen Wert als 65 angeben, zum Beispiel `a = 0`. + +### Überprüfen von Eigenschaften {#verifying-properties} + +Manticore ermöglicht die vollständige Kontrolle über die gesamte Ausführung jedes Pfades. Dadurch kannst du beliebige Einschränkungen für fast alles hinzufügen. Diese Kontrolle ermöglicht das Erstellen von Eigenschaften für den Vertrag. + +Betrachte das folgende Beispiel: + +```solidity +function unsafe_add(uint a, uint b) returns(uint c){ + c = a + b; // kein Überlaufschutz + return c; +} +``` + +Hier gibt es in der Funktion nur einen Pfad zu untersuchen: + +- Pfad 1: `c = a + b` + +Mit Manticore kannst du auf einen Überlauf prüfen und dem Pfadprädikat Einschränkungen hinzufügen: + +- `c = a + b AND (c < a OR c < b)` + +Wenn es möglich ist, eine Bewertung für `a` und `b` zu finden, für die das obige Pfadprädikat erfüllbar ist, bedeutet das, dass du einen Überlauf gefunden hast. Der Solver kann beispielsweise die Eingabe `a = 10 , b = MAXUINT256` generieren. + +Wenn du eine korrigierte Version betrachtest: + +```solidity +function safe_add(uint a, uint b) returns(uint c){ + c = a + b; + require(c>=a); + require(c>=b); + return c; +} +``` + +Die zugehörige Formel mit Überlaufprüfung wäre: + +- `c = a + b AND (c >= a) AND (c=>b) AND (c < a OR c < b)` + +Diese Formel kann nicht gelöst werden; mit anderen Worten, das ist ein **Beweis** dafür, dass in `safe_add` der Wert `c` immer größer wird. + +DSE ist somit ein leistungsfähiges Tool, das beliebige Einschränkungen in deinem Code überprüfen kann. + +## Ausführung mit Manticore {#running-under-manticore} + +Wir werden sehen, wie man einen Smart Contract mit der Manticore-API untersucht. Das Ziel ist der folgende Smart Contract [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): + +```solidity +pragma solidity >=0.4.24 <0.6.0; + +contract Simple { + function f(uint a) payable public{ + if (a == 65) { + revert(); + } + } +} +``` + +### Eine eigenständige Untersuchung ausführen {#run-a-standalone-exploration} + +Du kannst Manticore mit dem folgenden Befehl direkt auf dem Smart Contract ausführen (`project` kann eine Solidity-Datei oder ein Projektverzeichnis sein): + +```bash +$ manticore project +``` + +Du erhältst die Ausgabe von Testfällen wie diesem (die Reihenfolge kann sich ändern): + +``` +... +... m.c.manticore:INFO: Generated testcase No. 0 - STOP +... m.c.manticore:INFO: Generated testcase No. 1 - REVERT +... m.c.manticore:INFO: Generated testcase No. 2 - RETURN +... m.c.manticore:INFO: Generated testcase No. 3 - REVERT +... m.c.manticore:INFO: Generated testcase No. 4 - STOP +... m.c.manticore:INFO: Generated testcase No. 5 - REVERT +... m.c.manticore:INFO: Generated testcase No. 6 - REVERT +... m.c.manticore:INFO: Results in /home/ethsec/workshops/Automated Smart Contracts Audit - TruffleCon 2018/manticore/examples/mcore_t6vi6ij3 +... +``` + +Ohne zusätzliche Informationen untersucht Manticore den Vertrag mit neuen symbolischen Transaktionen, bis es keine neuen Pfade mehr auf dem Vertrag untersucht. Manticore führt nach einer fehlgeschlagenen Transaktion (z. B. nach einem Revert) keine neuen Transaktionen aus. + +Manticore gibt die Informationen in einem `mcore_*`-Verzeichnis aus. Unter anderem findest du in diesem Verzeichnis: + +- `global.summary`: Abdeckung und Compiler-Warnungen +- `test_XXXXX.summary`: Abdeckung, letzte Anweisung, Kontostände pro Testfall +- `test_XXXXX.tx`: detaillierte Liste der Transaktionen pro Testfall + +Hier findet Manticore 7 Testfälle, die Folgendem entsprechen (die Reihenfolge der Dateinamen kann sich ändern): + +| | Transaktion 0 | Transaktion 1 | Transaktion 2 | Ergebnis | +| :-------------------------------------------------------: | :----------------: | :------------------------: | -------------------------- | :------: | +| **test_00000000.tx** | Vertragserstellung | f(!=65) | f(!=65) | STOP | +| **test_00000001.tx** | Vertragserstellung | Fallback-Funktion | | REVERT | +| **test_00000002.tx** | Vertragserstellung | | | RETURN | +| **test_00000003.tx** | Vertragserstellung | f(65) | | REVERT | +| **test_00000004.tx** | Vertragserstellung | f(!=65) | | STOP | +| **test_00000005.tx** | Vertragserstellung | f(!=65) | f(65) | REVERT | +| **test_00000006.tx** | Vertragserstellung | f(!=65) | Fallback-Funktion | REVERT | + +_Zusammenfassung der Untersuchung: f(!=65) bezeichnet einen Aufruf von f mit einem beliebigen Wert, der nicht 65 ist._ + +Wie du sehen kannst, generiert Manticore für jede erfolgreiche oder rückgängig gemachte (reverted) Transaktion einen eindeutigen Testfall. + +Verwende das `--quick-mode`-Flag, wenn du eine schnelle Code-Untersuchung wünschst (es deaktiviert Fehlerdetektoren, Gas-Berechnung, ...) + +### Einen Smart Contract über die API manipulieren {#manipulate-a-smart-contract-through-the-api} + +Dieser Abschnitt beschreibt im Detail, wie man einen Smart Contract über die Manticore-Python-API manipuliert. Du kannst eine neue Datei mit der Python-Erweiterung `*.py` erstellen und den notwendigen Code schreiben, indem du die API-Befehle (deren Grundlagen unten beschrieben werden) in diese Datei einfügst und sie dann mit dem Befehl `$ python3 *.py` ausführst. Du kannst die folgenden Befehle auch direkt in der Python-Konsole ausführen. Um die Konsole zu starten, verwende den Befehl `$ python3`. + +### Erstellen von Konten {#creating-accounts} + +Als Erstes solltest du mit den folgenden Befehlen eine neue Blockchain initialisieren: + +```python +from manticore.ethereum import ManticoreEVM + +m = ManticoreEVM() +``` + +Ein Nicht-Vertragskonto wird mit [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) erstellt: + +```python +user_account = m.create_account(balance=1000) +``` + +Ein Solidity-Vertrag kann mit [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract) bereitgestellt werden: + +```solidity +source_code = ''' +pragma solidity >=0.4.24 <0.6.0; +contract Simple { + function f(uint a) payable public{ + if (a == 65) { + revert(); + } + } +} +''' +# Initiate the contract +contract_account = m.solidity_create_contract(source_code, owner=user_account) +``` + +#### Zusammenfassung {#summary} + +- Du kannst Benutzer- und Vertragskonten mit [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) und [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract) erstellen. + +### Ausführen von Transaktionen {#executing-transactions} + +Manticore unterstützt zwei Arten von Transaktionen: + +- Raw-Transaktion: Alle Funktionen werden untersucht +- Benannte Transaktion: Es wird nur eine Funktion untersucht + +#### Raw-Transaktion {#raw-transaction} + +Eine Raw-Transaktion wird mit [m.transaction](https://manticore.readthedocs.io/en/latest/evm.html?highlight=transaction#manticore.ethereum.ManticoreEVM.transaction) ausgeführt: + +```python +m.transaction(caller=user_account, + address=contract_account, + data=data, + value=value) +``` + +Der Aufrufer, die Adresse, die Daten oder der Wert der Transaktion können entweder konkret oder symbolisch sein: + +- [m.make_symbolic_value](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_value#manticore.ethereum.ManticoreEVM.make_symbolic_value) erstellt einen symbolischen Wert. +- [m.make_symbolic_buffer(size)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_buffer#manticore.ethereum.ManticoreEVM.make_symbolic_buffer) erstellt ein symbolisches Byte-Array. + +Beispiel: + +```python +symbolic_value = m.make_symbolic_value() +symbolic_data = m.make_symbolic_buffer(320) +m.transaction(caller=user_account, + address=contract_address, + data=symbolic_data, + value=symbolic_value) +``` + +Wenn die Daten symbolisch sind, untersucht Manticore während der Transaktionsausführung alle Funktionen des Vertrags. Es ist hilfreich, die Erklärung der Fallback-Funktion im Artikel [Hands on the Ethernaut CTF](https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/) zu lesen, um zu verstehen, wie die Funktionsauswahl funktioniert. + +#### Benannte Transaktion {#named-transaction} + +Funktionen können über ihren Namen ausgeführt werden. +Um `f(uint var)` mit einem symbolischen Wert, von `user_account` und mit 0 Ether auszuführen, verwende: + +```python +symbolic_var = m.make_symbolic_value() +contract_account.f(symbolic_var, caller=user_account, value=0) +``` + +Wenn der `value` der Transaktion nicht angegeben ist, ist er standardmäßig 0. + +#### Zusammenfassung {#summary-1} + +- Argumente einer Transaktion können konkret oder symbolisch sein +- Eine Raw-Transaktion untersucht alle Funktionen +- Funktionen können über ihren Namen aufgerufen werden + +### Arbeitsbereich {#workspace} + +`m.workspace` ist das Verzeichnis, das als Ausgabeverzeichnis für alle erzeugten Dateien verwendet wird: + +```python +print("Ergebnisse sind in {}".format(m.workspace)) +``` + +### Die Untersuchung beenden {#terminate-the-exploration} + +Um die Untersuchung zu beenden, verwende [m.finalize()](https://manticore.readthedocs.io/en/latest/evm.html?highlight=finalize#manticore.ethereum.ManticoreEVM.finalize). Sobald diese Methode aufgerufen wird, sollten keine weiteren Transaktionen gesendet werden. Manticore generiert dann Testfälle für jeden untersuchten Pfad. + +### Zusammenfassung: Ausführung mit Manticore {#summary-running-under-manticore} + +Wenn wir alle vorherigen Schritte zusammenfassen, erhalten wir: + +```python +from manticore.ethereum import ManticoreEVM + +m = ManticoreEVM() + +with open('example.sol') as f: + source_code = f.read() + +user_account = m.create_account(balance=1000) +contract_account = m.solidity_create_contract(source_code, owner=user_account) + +symbolic_var = m.make_symbolic_value() +contract_account.f(symbolic_var) + +print("Ergebnisse sind in {}".format(m.workspace)) +m.finalize() # die Untersuchung anhalten +``` + +Den gesamten obigen Code findest du in [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) + +## Pfade erhalten, die eine Ausnahme auslösen {#getting-throwing-paths} + +Wir generieren nun spezifische Eingaben für die Pfade, die in `f()` eine Ausnahme auslösen. Das Ziel ist nach wie vor der folgende Smart Contract [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): + +```solidity +pragma solidity >=0.4.24 <0.6.0; +contract Simple { + function f(uint a) payable public{ + if (a == 65) { + revert(); + } + } +} +``` + +### Verwenden von Zustandsinformationen {#using-state-information} + +Jeder ausgeführte Pfad hat seinen eigenen Zustand der Blockchain. Ein Zustand ist entweder bereit (ready) oder beendet (killed), was bedeutet, dass er eine THROW- oder REVERT-Anweisung erreicht: + +- [m.ready_states](https://manticore.readthedocs.io/en/latest/states.html#accessing): die Liste der Zustände, die bereit sind (sie haben kein REVERT/INVALID ausgeführt) +- [m.killed_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): die Liste der beendeten Zustände +- [m.all_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): alle Zustände + +```python +for state in m.all_states: + # etwas mit dem Zustand tun +``` + +Du kannst auf Zustandsinformationen zugreifen. Beispiel: + +- `state.platform.get_balance(account.address)`: der Kontostand des Kontos +- `state.platform.transactions`: die Liste der Transaktionen +- `state.platform.transactions[-1].return_data`: die von der letzten Transaktion zurückgegebenen Daten + +Die von der letzten Transaktion zurückgegebenen Daten sind ein Array, das beispielsweise mit `ABI.deserialize` in einen Wert umgewandelt werden kann: + +```python +data = state.platform.transactions[0].return_data +data = ABI.deserialize("uint", data) +``` + +### So generierst du einen Testfall {#how-to-generate-testcase} + +Verwende [m.generate_testcase(state, name)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=generate_testcase#manticore.ethereum.ManticoreEVM.generate_testcase), um einen Testfall zu generieren: + +```python +m.generate_testcase(state, 'BugFound') +``` + +### Zusammenfassung {#summary-2} + +- Du kannst mit `m.all_states` über die Zustände iterieren +- `state.platform.get_balance(account.address)` gibt den Kontostand des Kontos zurück +- `state.platform.transactions` gibt die Liste der Transaktionen zurück +- `transaction.return_data` sind die zurückgegebenen Daten +- `m.generate_testcase(state, name)` generiert Eingaben für den Zustand + +### Zusammenfassung: Pfad erhalten, der eine Ausnahme auslöst {#summary-getting-throwing-path} + +```python +from manticore.ethereum import ManticoreEVM + +m = ManticoreEVM() + +with open('example.sol') as f: + source_code = f.read() + +user_account = m.create_account(balance=1000) +contract_account = m.solidity_create_contract(source_code, owner=user_account) + +symbolic_var = m.make_symbolic_value() +contract_account.f(symbolic_var) + +## Prüfen, ob eine Ausführung mit REVERT oder INVALID endet +for state in m.terminated_states: + last_tx = state.platform.transactions[-1] + if last_tx.result in ['REVERT', 'INVALID']: + print('Ausnahme gefunden {}'.format(m.workspace)) + m.generate_testcase(state, 'ThrowFound') +``` + +Den gesamten obigen Code findest du in [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) + +_Hinweis: Wir hätten ein viel einfacheres Skript generieren können, da alle von `terminated_state` zurückgegebenen Zustände REVERT oder INVALID in ihrem Ergebnis haben: Dieses Beispiel sollte nur demonstrieren, wie man die API manipuliert._ + +## Hinzufügen von Einschränkungen {#adding-constraints} + +Wir werden sehen, wie man die Untersuchung einschränken kann. Wir gehen von der Annahme aus, dass die Dokumentation von `f()` besagt, dass die Funktion niemals mit `a == 65` aufgerufen wird, sodass jeder Fehler bei `a == 65` kein echter Fehler ist. Das Ziel ist nach wie vor der folgende Smart Contract [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): + +```solidity +pragma solidity >=0.4.24 <0.6.0; +contract Simple { + function f(uint a) payable public{ + if (a == 65) { + revert(); + } + } +} +``` + +### Operatoren {#operators} + +Das [Operators](https://github.com/trailofbits/manticore/blob/master/manticore/core/smtlib/operators.py)-Modul erleichtert die Bearbeitung von Einschränkungen und bietet unter anderem Folgendes: + +- Operators.AND, +- Operators.OR, +- Operators.UGT (unsigned greater than), +- Operators.UGE (unsigned greater than or equal to), +- Operators.ULT (unsigned lower than), +- Operators.ULE (unsigned lower than or equal to). + +Verwende Folgendes, um das Modul zu importieren: + +```python +from manticore.core.smtlib import Operators +``` + +`Operators.CONCAT` wird verwendet, um ein Array mit einem Wert zu verketten. Zum Beispiel muss `return_data` einer Transaktion in einen Wert geändert werden, um ihn mit einem anderen Wert zu vergleichen: + +```python +last_return = Operators.CONCAT(256, *last_return) +``` + +### Einschränkungen {#state-constraint} + +Du kannst Einschränkungen global oder für einen bestimmten Zustand verwenden. + +#### Globale Einschränkung {#state-constraint} + +Verwende `m.constrain(constraint)`, um eine globale Einschränkung hinzuzufügen. +Du kannst zum Beispiel einen Vertrag von einer symbolischen Adresse aus aufrufen und diese Adresse auf bestimmte Werte beschränken: + +```python +symbolic_address = m.make_symbolic_value() +m.constraint(Operators.OR(symbolic == 0x41, symbolic_address == 0x42)) +m.transaction(caller=user_account, + address=contract_account, + data=m.make_symbolic_buffer(320), + value=0) +``` + +#### Zustandsbeschränkung {#state-constraint} + +Verwende [state.constrain(constraint)](https://manticore.readthedocs.io/en/latest/states.html?highlight=StateBase#manticore.core.state.StateBase.constrain), um eine Einschränkung zu einem bestimmten Zustand hinzuzufügen. +Dies kann verwendet werden, um den Zustand nach seiner Untersuchung einzuschränken, um eine Eigenschaft darin zu überprüfen. + +### Einschränkung prüfen {#checking-constraint} + +Verwende `solver.check(state.constraints)`, um zu erfahren, ob eine Einschränkung noch erfüllbar ist. +Das folgende Beispiel schränkt beispielsweise `symbolic_value` so ein, dass es sich von 65 unterscheidet, und prüft, ob der Zustand noch erfüllbar ist: + +```python +state.constrain(symbolic_var != 65) +if solver.check(state.constraints): + # Zustand ist erfüllbar +``` + +### Zusammenfassung: Hinzufügen von Einschränkungen {#summary-adding-constraints} + +Wenn wir dem vorherigen Code eine Einschränkung hinzufügen, erhalten wir: + +```python +from manticore.ethereum import ManticoreEVM +from manticore.core.smtlib.solver import Z3Solver + +solver = Z3Solver.instance() + +m = ManticoreEVM() + +with open("example.sol") as f: + source_code = f.read() + +user_account = m.create_account(balance=1000) +contract_account = m.solidity_create_contract(source_code, owner=user_account) + +symbolic_var = m.make_symbolic_value() +contract_account.f(symbolic_var) + +no_bug_found = True + +## Prüfen, ob eine Ausführung mit REVERT oder INVALID endet +for state in m.terminated_states: + last_tx = state.platform.transactions[-1] + if last_tx.result in ['REVERT', 'INVALID']: + # wir betrachten den Pfad nicht, in dem a == 65 ist + condition = symbolic_var != 65 + if m.generate_testcase(state, name="BugFound", only_if=condition): + print(f'Fehler gefunden, Ergebnisse sind in {m.workspace}') + no_bug_found = False + +if no_bug_found: + print(f'Kein Fehler gefunden') +``` + +Den gesamten obigen Code findest du in [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) diff --git a/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md new file mode 100644 index 00000000000..acd355d4efd --- /dev/null +++ b/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md @@ -0,0 +1,239 @@ +--- +title: So verwenden Sie Slither, um Bugs in Smart Contracts zu finden +description: So verwenden Sie Slither, um automatisch Fehler in Smart Contracts zu finden +author: Spuren von bits +lang: de +tags: + [ + "solidity", + "intelligente Verträge", + "Sicherheit", + "testen" + ] +skill: advanced +published: 2020-06-09 +source: Aufbau sicherer Verträge +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither +--- + +## So verwenden Sie Slither {#how-to-use-slither} + +Das Ziel dieses Tutorials ist es zu zeigen, wie Sie Slither verwenden, um automatisch Fehler in Smart Contracts zu finden. + +- [Installation](#installation) +- [Verwendung der Befehlszeile](#command-line) +- [Einführung in die statische Analyse](#static-analysis): Kurze Einführung in die statische Analyse +- [API](#api-basics): Python-API-Beschreibung + +## Installation {#installation} + +Slither erfordert Python >= 3.6. Die Installation kann über pip oder Docker erfolgen. + +Slither über pip: + +```bash +pip3 install --user slither-analyzer +``` + +Slither über Docker: + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/trufflecon trailofbits/eth-security-toolbox +``` + +_Der letzte Befehl führt die eth-security-toolbox in einem Docker aus, der Zugriff auf dein aktuelles Verzeichnis hat. Du kannst die Dateien von deinem Host aus ändern und die Tools für die Dateien aus dem Docker ausführen_ + +Führe im Docker aus: + +```bash +solc-select 0.5.11 +cd /home/trufflecon/ +``` + +### Ausführen eines Skripts {#running-a-script} + +So führst du ein Python-Skript mit Python 3 aus: + +```bash +python3 script.py +``` + +### Befehlszeile {#command-line} + +**Befehlszeile versus benutzerdefinierte Skripte.** Slither wird mit einer Reihe von vordefinierten Detektoren geliefert, die viele häufige Fehler finden. Wenn Sie Slither von der Befehlszeile aus aufrufen, werden alle Detektoren ausgeführt, ohne dass detaillierte Kenntnisse der statischen Analyse erforderlich sind: + +```bash +slither project_paths +``` + +Zusätzlich zu den Detektoren verfügt Slither über Code-Review-Funktionen durch seine [Printers](https://github.com/crytic/slither#printers) und [Tools](https://github.com/crytic/slither#tools). + +Verwenden Sie [crytic.io](https://github.com/crytic), um Zugang zu privaten Detektoren und zur GitHub-Integration zu erhalten. + +## Statische Analyse {#static-analysis} + +Die Fähigkeiten und das Design des statischen Analyse-Frameworks von Slither wurden in Blog-Beiträgen ([1](https://blog.trailofbits.com/2018/10/19/slither-a-solidity-static-analysis-framework/), [2](https://blog.trailofbits.com/2019/05/27/slither-the-leading-static-analyzer-for-smart-contracts/)) und einem [wissenschaftlichen Artikel](https://github.com/trailofbits/publications/blob/master/papers/wetseb19.pdf) beschrieben. + +Statische Analyse gibt es in verschiedenen Varianten. Ihnen ist wahrscheinlich bewusst, dass Compiler wie [clang](https://clang-analyzer.llvm.org/) und [gcc](https://lwn.net/Articles/806099/) auf diesen Forschungstechniken basieren, aber sie bilden auch die Grundlage für ([Infer](https://fbinfer.com/), [CodeClimate](https://codeclimate.com/), [FindBugs](http://findbugs.sourceforge.net/) und auf formalen Methoden basierende Werkzeuge wie [Frama-C](https://frama-c.com/) und [Polyspace](https://www.mathworks.com/products/polyspace.html)). + +Wir werden hier nicht erschöpfend auf statische Analysetechniken und Forscher eingehen. Stattdessen konzentrieren wir uns darauf, was nötig ist, um zu verstehen, wie Slither funktioniert, damit Sie es effektiver nutzen können, um Fehler zu finden und den Code zu verstehen. + +- [Code-Darstellung](#code-representation) +- [Code-Analyse](#analysis) +- [Zwischendarstellung](#intermediate-representation) + +### Code-Darstellung {#code-representation} + +Im Gegensatz zu einer dynamischen Analyse, die einen einzelnen Ausführungspfad betrachtet, betrachtet die statische Analyse alle Pfade auf einmal. Dazu stützt es sich auf eine andere Code-Darstellung. Die beiden häufigsten sind der abstrakte Syntaxbaum (AST) und der Kontrollflussgraph (CFG). + +### Abstrakte Syntaxbäume (AST) {#abstract-syntax-trees-ast} + +ASTs werden jedes Mal verwendet, wenn der Compiler Code parst. Es ist wahrscheinlich die grundlegendste Struktur, auf der statische Analysen durchgeführt werden können. + +Kurz gesagt, ein AST ist ein strukturierter Baum, in dem normalerweise jedes Blatt eine Variable oder eine Konstante enthält und interne Knoten Operanden oder Kontrollflussoperationen sind. Betrachten Sie den folgenden Code: + +```solidity +function safeAdd(uint a, uint b) pure internal returns(uint){ + if(a + b <= a){ + revert(); + } + return a + b; +} +``` + +Der entsprechende AST ist hier dargestellt: + +![AST](./ast.png) + +Slither verwendet den von solc exportierten AST. + +Obwohl der AST einfach zu erstellen ist, handelt es sich um eine verschachtelte Struktur. Manchmal ist dies nicht am einfachsten zu analysieren. Um beispielsweise die vom Ausdruck `a + b <= a` verwendeten Operationen zu identifizieren, müssen Sie zuerst `<=` und dann `+` analysieren. Ein gängiger Ansatz ist die Verwendung des sogenannten Visitor-Patterns, das rekursiv durch den Baum navigiert. Slither enthält einen generischen Visitor in [`ExpressionVisitor`](https://github.com/crytic/slither/blob/master/slither/visitors/expression/expression.py). + +Der folgende Code verwendet `ExpressionVisitor`, um zu erkennen, ob der Ausdruck eine Addition enthält: + +```python +from slither.visitors.expression.expression import ExpressionVisitor +from slither.core.expressions.binary_operation import BinaryOperationType + +class HasAddition(ExpressionVisitor): + + def result(self): + return self._result + + def _post_binary_operation(self, expression): + if expression.type == BinaryOperationType.ADDITION: + self._result = True + +visitor = HasAddition(expression) # expression ist der zu testende Ausdruck +print(f'Der Ausdruck {expression} enthält eine Addition: {visitor.result()}') +``` + +### Kontrollflussgraph (CFG) {#control-flow-graph-cfg} + +Die zweithäufigste Code-Darstellung ist der Kontrollflussgraph (CFG). Wie der Name schon sagt, handelt es sich um eine graphbasierte Darstellung, die alle Ausführungspfade aufzeigt. Jeder Knoten enthält eine oder mehrere Anweisungen. Kanten im Graphen stellen die Kontrollflussoperationen dar (if/then/else, Schleife usw.). Der CFG unseres vorherigen Beispiels lautet: + +![CFG](./cfg.png) + +Der CFG ist die Darstellung, auf der die meisten Analysen aufbauen. + +Es gibt viele andere Code-Darstellungen. Jede Darstellung hat Vor- und Nachteile, je nachdem, welche Analyse Sie durchführen möchten. + +### Analyse {#analysis} + +Die einfachste Art von Analysen, die Sie mit Slither durchführen können, sind syntaktische Analysen. + +### Syntaktische Analyse {#syntax-analysis} + +Slither kann durch die verschiedenen Komponenten des Codes und deren Darstellung navigieren, um Inkonsistenzen und Fehler mit einem Ansatz zu finden, der dem Pattern-Matching ähnelt. + +Die folgenden Detektoren suchen beispielsweise nach syntaxbezogenen Problemen: + +- [Zustandsvariablen-Shadowing](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing): iteriert über alle Zustandsvariablen und prüft, ob eine davon eine Variable aus einem geerbten Vertrag verschattet ([state.py#L51-L62](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/shadowing/state.py#L51-L62)) + +- [Inkorrektes ERC20-Interface](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface): sucht nach inkorrekten ERC20-Funktionssignaturen ([incorrect_erc20_interface.py#L34-L55](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/erc/incorrect_erc20_interface.py#L34-L55)) + +### Semantische Analyse {#semantic-analysis} + +Im Gegensatz zur Syntaxanalyse geht eine semantische Analyse tiefer und analysiert die "Bedeutung" des Codes. Diese Familie umfasst einige allgemeine Arten von Analysen. Sie führen zu aussagekräftigeren und nützlicheren Ergebnissen, sind aber auch komplexer zu schreiben. + +Semantische Analysen werden für die fortschrittlichsten Schwachstellenerkennungen verwendet. + +#### Datenabhängigkeitsanalyse {#fixed-point-computation} + +Eine Variable `variable_a` gilt als datenabhängig von `variable_b`, wenn es einen Pfad gibt, auf dem der Wert von `variable_a` durch `variable_b` beeinflusst wird. + +Im folgenden Code ist `variable_a` von `variable_b` abhängig: + +```solidity +// ... +variable_a = variable_b + 1; +``` + +Slither verfügt über integrierte [Datenabhängigkeits](https://github.com/crytic/slither/wiki/data-dependency)-Fähigkeiten, dank seiner Zwischendarstellung (die in einem späteren Abschnitt besprochen wird). + +Ein Beispiel für die Verwendung der Datenabhängigkeit findet sich im [Detektor für gefährliche strikte Gleichheit](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities). Hier sucht Slither nach einem strikten Gleichheitsvergleich mit einem gefährlichen Wert ([incorrect_strict_equality.py#L86-L87](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L86-L87)) und informiert den Benutzer, dass er `>=` oder `<=` anstelle von `==` verwenden sollte, um zu verhindern, dass ein Angreifer den Vertrag in eine Falle lockt. Unter anderem wird der Detektor den Rückgabewert eines Aufrufs von `balanceOf(address)` ([incorrect_strict_equality.py#L63-L64](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L63-L64)) als gefährlich einstufen und die Datenabhängigkeits-Engine verwenden, um seine Verwendung zu verfolgen. + +#### Fixpunktberechnung {#fixed-point-computation} + +Wenn Ihre Analyse durch den CFG navigiert und den Kanten folgt, werden Sie wahrscheinlich bereits besuchte Knoten sehen. Wenn zum Beispiel eine Schleife wie unten dargestellt ist: + +```solidity +for(uint i; i < range; ++){ + variable_a += 1 +} +``` + +Ihre Analyse muss wissen, wann sie anhalten muss. Hier gibt es zwei Hauptstrategien: (1) jeden Knoten eine endliche Anzahl von Malen durchlaufen, (2) einen sogenannten _Fixpunkt_ berechnen. Ein Fixpunkt bedeutet im Grunde, dass die Analyse dieses Knotens keine aussagekräftigen Informationen mehr liefert. + +Ein Beispiel für die Verwendung eines Fixpunkts findet sich in den Reentrancy-Detektoren: Slither untersucht die Knoten und sucht nach externen Aufrufen sowie Schreib- und Lesezugriffen auf den Speicher. Sobald ein Fixpunkt erreicht ist ([reentrancy.py#L125-L131](https://github.com/crytic/slither/blob/master/slither/detectors/reentrancy/reentrancy.py#L125-L131)), wird die Untersuchung gestoppt und die Ergebnisse werden anhand verschiedener Reentrancy-Muster ([reentrancy_benign.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_benign.py), [reentrancy_read_before_write.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_read_before_write.py), [reentrancy_eth.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_eth.py)) analysiert, um festzustellen, ob eine Reentrancy vorliegt. + +Das Schreiben von Analysen mit effizienter Fixpunktberechnung erfordert ein gutes Verständnis dafür, wie die Analyse ihre Informationen propagiert. + +### Zwischendarstellung {#intermediate-representation} + +Eine Zwischendarstellung (Intermediate Representation, IR) ist eine Sprache, die sich besser für die statische Analyse eignen soll als die ursprüngliche. Slither übersetzt Solidity in seine eigene IR: [SlithIR](https://github.com/crytic/slither/wiki/SlithIR). + +Das Verständnis von SlithIR ist nicht notwendig, wenn Sie nur einfache Prüfungen schreiben wollen. Es wird sich jedoch als nützlich erweisen, wenn Sie vorhaben, fortgeschrittene semantische Analysen zu schreiben. Die [SlithIR](https://github.com/crytic/slither/wiki/Printer-documentation#slithir)- und [SSA](https://github.com/crytic/slither/wiki/Printer-documentation#slithir-ssa)-Printers helfen Ihnen zu verstehen, wie der Code übersetzt wird. + +## API-Grundlagen {#api-basics} + +Slither hat eine API, mit der Sie die grundlegenden Attribute des Vertrags und seiner Funktionen untersuchen können. + +So laden Sie eine Codebasis: + +```python +from slither import Slither +slither = Slither('/path/to/project') + +``` + +### Untersuchen von Verträgen und Funktionen {#exploring-contracts-and-functions} + +Ein `Slither`-Objekt hat: + +- `contracts (list(Contract)`: Liste von Verträgen +- `contracts_derived (list(Contract)`: Liste von Verträgen, die nicht von einem anderen Vertrag geerbt werden (Teilmenge von `contracts`) +- `get_contract_from_name (str)`: Gibt einen Vertrag anhand seines Namens zurück + +Ein `Contract`-Objekt hat: + +- `name (str)`: Name des Vertrags +- `functions (list(Function))`: Liste von Funktionen +- `modifiers (list(Modifier))`: Liste von Modifikatoren +- `all_functions_called (list(Function/Modifier))`: Liste aller internen Funktionen, die vom Vertrag aus erreichbar sind +- `inheritance (list(Contract))`: Liste der geerbten Verträge +- `get_function_from_signature (str)`: Gibt eine Funktion anhand ihrer Signatur zurück +- `get_modifier_from_signature (str)`: Gibt einen Modifikator anhand seiner Signatur zurück +- `get_state_variable_from_name (str)`: Gibt eine Zustandsvariable anhand ihres Namens zurück + +Ein `Function`- oder ein `Modifier`-Objekt hat: + +- `name (str)`: Name der Funktion +- `contract (contract)`: der Vertrag, in dem die Funktion deklariert ist +- `nodes (list(Node))`: Liste der Nodes, aus denen der CFG der Funktion/des Modifikators besteht +- `entry_point (Node)`: Einstiegspunkt des CFG +- `variables_read (list(Variable))`: Liste der gelesenen Variablen +- `variables_written (list(Variable))`: Liste der geschriebenen Variablen +- `state_variables_read (list(StateVariable))`: Liste der gelesenen Zustandsvariablen (Teilmenge von `variables_read`) +- `state_variables_written (list(StateVariable))`: Liste der geschriebenen Zustandsvariablen (Teilmenge von `variables_written`) diff --git a/public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md new file mode 100644 index 00000000000..20b64b9aa74 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md @@ -0,0 +1,81 @@ +--- +title: Wie Sie Tellor als Ihr Orakel einrichten +description: Eine Anleitung für den Einstieg in die Integration des Tellor-Orakels in Ihr Protokoll +author: "Tellor" +lang: de +tags: [ "solidity", "intelligente Verträge", "Orakel" ] +skill: beginner +published: 2021-06-29 +source: Tellor Docs +sourceUrl: https://docs.tellor.io/tellor/ +--- + +Quizfrage: Ihr Protokoll ist fast fertig, aber es braucht ein Orakel, um Zugang zu Offchain-Daten zu erhalten... Was tun Sie? + +## (Optionale) Voraussetzungen {#soft-prerequisites} + +Dieser Beitrag soll den Zugriff auf einen Orakel-Feed so einfach und unkompliziert wie möglich gestalten. Davon abgesehen gehen wir von den folgenden Programmierkenntnissen aus, um uns auf den Orakel-Aspekt zu konzentrieren. + +Annahmen: + +- Sie können in einem Terminal navigieren +- Sie haben npm installiert +- Sie wissen, wie man npm zur Verwaltung von Abhängigkeiten verwendet + +Tellor ist ein live und quelloffenes Orakel, das zur Implementierung bereit ist. Diese Anleitung für Anfänger soll zeigen, wie einfach man mit Tellor loslegen kann, um Ihr Projekt mit einem vollständig dezentralen und zensurresistenten Orakel auszustatten. + +## Überblick {#overview} + +Tellor ist ein Orakelsystem, bei dem Parteien den Wert eines Offchain-Datenpunkts (z. B. BTC/USD) anfordern können und Reporter darum konkurrieren, diesen Wert einer Onchain-Datenbank hinzuzufügen, auf die alle Smart Contracts von Ethereum zugreifen können. Die Eingaben in diese Datenbank werden durch ein Netzwerk von gestakten Reportern gesichert. Tellor nutzt krypto-ökonomische Anreizmechanismen, die ehrliche Dateneinreichungen von Reportern belohnen und schlechte Akteure durch die Emission des Tellor-Tokens, Tributes (TRB), und einen Streitbeilegungsmechanismus bestrafen. + +In diesem Tutorial werden wir Folgendes behandeln: + +- Einrichten des anfänglichen Toolkits, das Sie für den Start benötigen. +- Durchgehen eines einfachen Beispiels. +- Auflisten der Testnet-Adressen von Netzwerken, auf denen Sie Tellor derzeit testen können. + +## UsingTellor {#usingtellor} + +Als Erstes sollten Sie die grundlegenden Tools installieren, die für die Verwendung von Tellor als Ihr Orakel erforderlich sind. Verwenden Sie [dieses Paket](https://github.com/tellor-io/usingtellor), um die Tellor User Contracts zu installieren: + +`npm install usingtellor` + +Nach der Installation können Ihre Verträge die Funktionen aus dem Vertrag „UsingTellor“ erben. + +Großartig! Jetzt, wo Sie die Tools bereit haben, lassen Sie uns eine einfache Übung durchgehen, bei der wir den Bitcoin-Preis abrufen: + +### BTC/USD-Beispiel {#btcusd-example} + +Erben Sie den UsingTellor-Vertrag und übergeben Sie die Tellor-Adresse als Konstruktorargument: + +Hier ein Beispiel: + +```solidity +import "usingtellor/contracts/UsingTellor.sol"; + +contract PriceContract is UsingTellor { + uint256 public btcPrice; + + //Dieser Vertrag hat jetzt Zugriff auf alle Funktionen in UsingTellor + +constructor(address payable _tellorAddress) UsingTellor(_tellorAddress) public {} + +function setBtcPrice() public { + bytes memory _b = abi.encode("SpotPrice",abi.encode("btc","usd")); + bytes32 _queryId = keccak256(_b); + + uint256 _timestamp; + bytes _value; + + (_value, _timestamp) = getDataBefore(_queryId, block.timestamp - 15 minutes); + + btcPrice = abi.decode(_value,(uint256)); + } +} +``` + +Eine vollständige Liste der Vertragsadressen finden Sie [hier](https://docs.tellor.io/tellor/the-basics/contracts-reference). + +Zur Vereinfachung der Nutzung wird das UsingTellor-Repo mit einer Version des [Tellor Playground](https://github.com/tellor-io/TellorPlayground)-Vertrags für eine einfachere Integration geliefert. Eine Liste hilfreicher Funktionen finden Sie [hier](https://github.com/tellor-io/sampleUsingTellor#tellor-playground). + +Für eine robustere Implementierung des Tellor-Orakels sehen Sie sich die vollständige Liste der verfügbaren Funktionen [hier](https://github.com/tellor-io/usingtellor/blob/master/README.md) an. diff --git a/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md b/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md index 7810e36f7c0..562d5176e24 100644 --- a/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md @@ -1,38 +1,33 @@ --- -title: So zeigen Sie Ihren NFT in Ihrem Wallet an (Teil 3/3 der NFT-Tutorialreihe) -description: In diesem Tutorial wird beschrieben, wie Sie einen existierenden NFT auf MetaMask einsehen können. +title: So zeigen Sie Ihr NFT in Ihrem Wallet an (Teil 3/3 der NFT-Tutorialreihe) +description: Dieses Tutorial beschreibt, wie Sie ein bestehendes NFT auf MetaMask anzeigen können! author: "Sumi Mudgil" -tags: - - "NFTs" - - "ERC-721" - - "Alchemy" - - "Non Fungible Token" - - "Solidity" +tags: [ "ERC-721", "Alchemy", "Solidity" ] skill: beginner lang: de published: 2021-04-22 --- -Dieses Tutorial ist Teil 3/3 der NFT-Tutorialreihe, in dem wir unseren neu geprägten NFT betrachten. Die allgemeine Anleitung ist für alle ERC-721-Token auf MetaMask anwendbar, auch im Mainnet oder einem Testnet. Wenn Sie lernen möchten, wie Sie Ihren eigenen NFT auf Ethereum prägen können, sollten Sie sich [Teil 1 zum Schreiben und Bereitstellen eines NFT-Smart-Contracts](/developers/tutorials/how-to-write-and-deploy-an-nft) ansehen. +Dieses Tutorial ist Teil 3/3 der NFT-Tutorialreihe, in dem wir unser neu geprägtes NFT betrachten. Sie können dieses allgemeine Tutorial jedoch für jeden ERC-721-Token mit MetaMask verwenden, einschließlich auf dem Mainnet oder einem beliebigen Testnet. Wenn Sie lernen möchten, wie Sie Ihr eigenes NFT auf Ethereum prägen können, sollten Sie sich [Teil 1 zum Schreiben und Bereitstellen eines NFT-Smart-Contracts](/developers/tutorials/how-to-write-and-deploy-an-nft) ansehen! -Herzlichen Glückwunsch! Sie haben es zum kürzesten und einfachsten Teil unserer NFT-Tutorialreihe geschafft. In diesem Teil erfahren Sie, wie Sie Ihren frisch geprägten NFT in einer virtuellen Geldbörse (Wallet) anzeigen können. Für dieses Beispiel verwenden wir MetaMask, da wir es bereits in den beiden vorangegangenen Teilen verwendet haben. +Glückwunsch! Sie haben es zum kürzesten und einfachsten Teil unserer NFT-Tutorialreihe geschafft – wie Sie Ihr frisch geprägtes NFT in einer virtuellen Wallet anzeigen können. Für dieses Beispiel verwenden wir MetaMask, da wir es bereits in den beiden vorangegangenen Teilen verwendet haben. -Als Voraussetzung sollten Sie MetaMask bereits auf ihrem Handy oder in Ihrem Browser installiert haben und es sollte das Konto enthalten, für die Sie Ihre NFTs geprägt haben. Die App können Sie kostenlos auf [iOS](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202) oder [Android](https://play.google.com/store/apps/details?id=io.metamask&hl=de_US&gl=US) erhalten. +Voraussetzung ist, dass Sie MetaMask auf Ihrem Mobilgerät installiert haben und dass die App das Konto enthält, auf das Sie Ihr NFT geprägt haben – Sie können die App kostenlos für [iOS](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202) oder [Android](https://play.google.com/store/apps/details?id=io.metamask&hl=en_US&gl=US) herunterladen. -## Schritt 1: Das Netzwerk auf Ropsten festlegen {#set-network-to-ropsten} +## Schritt 1: Netzwerk auf Sepolia einstellen {#set-network-to-sepolia} -Drücken Sie oben in der App auf die Schaltfläche "Wallet". Daraufhin werden Sie aufgefordert, ein Netzwerk auszuwählen. Da unser NFT im Ropsten-Netzwerk geprägt wurde, sollten Sie als Netzwerk Ropsten auswählen. +Drücken Sie oben in der App auf die Schaltfläche "Wallet", woraufhin Sie aufgefordert werden, ein Netzwerk auszuwählen. Da unser NFT auf dem Sepolia-Netzwerk geprägt wurde, sollten Sie Sepolia als Ihr Netzwerk auswählen. -![So legen Sie Ropsten als Netzwerk auf MetaMask fest](./goerliMetamask.gif) +![So stellen Sie Sepolia als Ihr Netzwerk auf MetaMask Mobile ein](./goerliMetamask.gif) -## Schritt 2: Kollektion zu MetaMask hinzufügen {#add-nft-to-metamask} +## Schritt 2: Ihr Sammelobjekt zu MetaMask hinzufügen {#add-nft-to-metamask} -Sobald Sie sich im Ropsten-Netzwerk befinden, wählen Sie die Registerkarte "Collectibles" (Sammelbare Elemente) auf der rechten Seite und fügen Sie die NFT-Smart-Contract-Adresse und die ERC-721-Token-ID Ihres NFT hinzu. Sie können sie anhand des Transaktions-Hashes Ihres NFT, der im zweiten Teil unseres Tutorials bereitgestellt wurde, auf Etherscan finden. +Sobald Sie sich im Sepolia-Netzwerk befinden, wählen Sie rechts die Registerkarte "Collectibles" aus und fügen Sie die NFT-Smart-Contract-Adresse und die ERC-721-Token-ID Ihres NFT hinzu. Diese finden Sie auf Etherscan über den Transaktions-Hash Ihres in Teil II unseres Tutorials bereitgestellten NFT. -![So finden Sie Ihren Transaktions-Hash und die ERC-721-Token-ID](./findNFTEtherscan.png) +![So finden Sie Ihren Transaktions-Hash und Ihre ERC-721-Token-ID](./findNFTEtherscan.png) -Möglicherweise müssen Sie die Seite ein paar Mal aktualisieren, bis Sie den NFT sehen können. Aber keine Sorge, er wird da sein. +Sie müssen möglicherweise ein paar Mal aktualisieren, um Ihr NFT zu sehen – aber es wird da sein ! -![So laden Sie Ihren NFT in MetaMask hoch](./findNFTMetamask.gif) +![So laden Sie Ihr NFT auf MetaMask hoch](./findNFTMetamask.gif) -Glückwunsch! Sie haben erfolgreich einen NFT gepräft und können ihn jetzt sehen. Wir können es kaum erwarten zu sehen, wie Sie die NFT-Welt im Sturm erobern werden! +Glückwunsch! Sie haben erfolgreich ein NFT geprägt und können es jetzt ansehen! Wir können es kaum erwarten zu sehen, wie Sie die NFT-Welt im Sturm erobern werden! diff --git a/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index bee38e63e41..a96b1825106 100644 --- a/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -1,86 +1,88 @@ --- -title: So erstellen und veröffentlichen Sie einen NFT (Teil 1/3 von unserer NFT-Tutorialreihe) +title: So erstellen und veröffentlichen Sie einen NFT (Teil 1/3 der NFT-Tutorial-Reihe) description: Dieses Tutorial ist Teil 1 einer Serie über NFTs, die Ihnen Schritt für Schritt zeigt, wie Sie einen Non Fungible Token (ERC-721 Token) Smart Contract mit Ethereum und Inter Planetary File System (IPFS) erstellen und veröffentlichen. author: "Sumi Mudgil" -tags: - - "NFTs" - - "ERC-721" - - "Alchemy" - - "Solidity" - - "Smart Contracts" +tags: [ "ERC-721", "Alchemy", "Solidity", "Smart Contracts" ] skill: beginner lang: de published: 2021-04-22 --- -Mit NFTs ist die Blockchain ins Auge der Öffentlichkeit gerückt. Das ist nun eine ausgezeichnete Gelegenheit, sich selbst ein Bild über diesen Hype zu machen. Veröffentlichen Sie dafür Ihren eigenen NFT (ERC-721 Token) auf der Ethereum-Blockchain. +Da NFTs die Blockchain ins Rampenlicht der Öffentlichkeit rücken, ist dies eine hervorragende Gelegenheit, den Hype selbst zu verstehen, indem Sie Ihren eigenen NFT-Vertrag (ERC-721-Token) auf der Ethereum-Blockchain veröffentlichen! Alchemy ist sehr stolz darauf, die größten Namen im NFT-Bereich zu unterstützen, darunter Makersplace (kürzlich wurde ein Rekordverkauf digitaler Kunstwerke bei Christie's für 69 Millionen USD verzeichnet), Dapper Labs (Entwickler von NBA Top Shot & Crypto Kitties), OpenSea (der weltweit größte NFT-Marktplatz), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable und viele mehr. -In diesem Tutorial erfahren Sie, wie Sie im Ropsten-Testnet mithilfe von [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), [Pinata](https://pinata.cloud/) und [Alchemy](https://alchemy.com/signup/eth) einen ERC-721-Smart Contract erstellen und bereitstellen (keine Sorge, wenn Sie jetzt noch nicht wissen, was das alles bedeutet, wir werden Ihnen das erklären). +In diesem Tutorial führen wir Sie durch die Erstellung und Bereitstellung eines ERC-721-Smart-Contracts im Sepolia-Testnet unter Verwendung von [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), [Pinata](https://pinata.cloud/) und [Alchemy](https://alchemy.com/signup/eth) (keine Sorge, wenn Sie noch nicht verstehen, was das alles bedeutet – wir werden es erklären!). In Teil 2 dieses Tutorials erläutern wir, wie Sie mit diesem Smart Contract einen NFT prägen können, in Teil 3 wird behandelt, wie Sie Ihren NFT auf MetaMask anzeigen können. -Wenn Sie zu irgendeinem Zeitpunkt Fragen haben, melden Sie sich gerne im [Alchemy Discord](https://discord.gg/gWuC7zB) oder rufen Sie die [NFT-API-Dokumentation von Alchemy](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api). +Wenn Sie an irgendeiner Stelle Fragen haben, können Sie sich natürlich jederzeit im [Alchemy Discord](https://discord.gg/gWuC7zB) melden oder die [NFT-API-Dokumentation von Alchemy](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) besuchen! -## Schritt 1: Verbindung mit dem Ethereum-Netzwerk {#connect-to-ethereum} +## Schritt 1: Mit dem Ethereum-Netzwerk verbinden {#connect-to-ethereum} -Es gibt eine Reihe von Möglichkeiten, Anfragen an die Ethereum Blockchain zu stellen, der Einfachheit halber verwenden wir ein kostenloses Konto bei [Alchemy](https://alchemy.com/signup/eth), einer Blockchain-Entwicklerplattform und API, die es uns ermöglicht, mit der Ethereum-Chain zu kommunizieren, ohne dass wir unsere eigenen Nodes betreiben müssen. +Es gibt eine Reihe von Möglichkeiten, Anfragen an die Ethereum-Blockchain zu stellen, aber der Einfachheit halber verwenden wir ein kostenloses Konto bei [Alchemy](https://alchemy.com/signup/eth), einer Blockchain-Entwicklerplattform und API, die es uns ermöglicht, mit der Ethereum-Chain zu kommunizieren, ohne unsere eigenen Nodes betreiben zu müssen. -In diesem Tutorial werden wir auch die Alchemy-Entwicklertools für die Überwachung und Analyse nutzen, um zu verstehen, was sich hinter unserer Smart-Contract-Bereitstellung verbirgt. Wenn Sie noch kein Alchemy-Konto haben, können Sie sich [hier](https://alchemy.com/signup/eth) kostenlos registrieren. +In diesem Tutorial werden wir auch die Alchemy-Entwicklertools für die Überwachung und Analyse nutzen, um zu verstehen, was sich hinter unserer Smart-Contract-Bereitstellung verbirgt. Wenn Sie noch kein Alchemy-Konto haben, können Sie sich [hier](https://alchemy.com/signup/eth) kostenlos anmelden. -## Schritt 2: App (und den API-Schlüssel) erstellen {#make-api-key} +## Schritt 2: Ihre App (und Ihren API-Schlüssel) erstellen {#make-api-key} -Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel generieren, indem Sie eine App erstellen. Dadurch können wir Anfragen an das Ropsten-Testnet stellen. In [diesem Leitfaden](https://docs.alchemyapi.io/guides/choosing-a-network) erfahren Sie mehr über Testnetzwerke. +Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel generieren. Erstellen Sie dafür eine App. Dies ermöglicht es uns, Anfragen an das Sepolia-Testnet zu senden. Sehen Sie sich [diesen Leitfaden](https://docs.alchemyapi.io/guides/choosing-a-network) an, wenn Sie mehr über Testnetze erfahren möchten. 1. Klicken Sie in Ihrem Alchemy-Dashboard in der Navigationsleiste unter "Apps" auf "Create App" (App erstellen), um auf die Seite "Create App" (App erstellen) zu gelangen. -![App erstellen](./create-your-app.png) +![Erstellen Sie Ihre App](./create-your-app.png) -2. Geben Sie Ihrer App einen Namen (wir haben uns für "My First NFT!" entschieden), eine kurze Beschreibung, wählen Sie "Staging" für die Umgebung (für die Buchhaltung Ihrer App) und "Ropsten" als Netzwerk. +2. Benennen Sie Ihre App (wir haben „Mein erster NFT!“ gewählt), geben Sie eine kurze Beschreibung an, wählen Sie „Ethereum“ als Chain und „Sepolia“ als Ihr Netzwerk. Seit The Merge sind die anderen Testnetze veraltet. -![App konfigrurieren und veröffentlichen](./configure-and-publish-your-app.png) +![Ihre App konfigurieren und veröffentlichen](./alchemy-explorer-sepolia.png) 3. Klicken Sie auf “Create app” (App erstellen) und schon sind Sie fertig. Die App sollte in der untenstehenden Tabelle erscheinen. ## Schritt 3: Ethereum-Konto (Adresse) erstellen {#create-eth-address} -Zum Versenden und Empfangen von Transaktionen benötigen Sie ein Ethereum-Konto. In diesem Tutorial verwenden wir MetaMask, eine virtuelle Wallet im Browser, mit der Sie Ihre Ethereum-Kontoadresse verwalten können. Wenn Sie mehr über Transaktionen auf Ethereum erfahren möchten, besuchen Sie [diese Seite](/developers/docs/transactions/) von der Ethereum Foundation. +Zum Versenden und Empfangen von Transaktionen benötigen Sie ein Ethereum-Konto. In diesem Tutorial verwenden wir MetaMask, eine virtuelle Wallet im Browser, mit der Sie Ihre Ethereum-Kontoadresse verwalten können. Wenn Sie mehr darüber erfahren möchten, wie Transaktionen auf Ethereum funktionieren, sehen Sie sich [diese Seite](/developers/docs/transactions/) der Ethereum Foundation an. -Sie können [hier](https://metamask.io/download) MetaMask kostenlos herunterladen und ein Konto erstellen. Wie Sie ein neues Konto erstellen oder wenn Sie bereits ein Konto haben, stellen Sie bitte sicher, dass Sie zum Ropsten-Testnet oben rechts wechseln (um sicherzustellen, dass Sie nicht mit echtem Geld handeln). +Sie können MetaMask [hier](https://metamask.io/download) kostenlos herunterladen und ein Konto erstellen. Wenn Sie ein Konto erstellen oder bereits eines haben, stellen Sie sicher, dass Sie oben rechts zum „Sepolia Test Network“ wechseln (damit wir nicht mit echtem Geld arbeiten). -![Ropsten als Netzwerk festlegen](./metamask-goerli.png) +![Sepolia als Ihr Netzwerk festlegen](./metamask-goerli.png) ## Schritt 4: Ether von einem Faucet hinzufügen {#step-4-add-ether-from-a-faucet} -Um unseren Smart Contract in das Testnetzwerk integrieren zu können, benötigen wir ein paar Fake-ETH. Um ETH zu erhalten, können Sie zu [FaucETH](https://fauceth.komputing.org) navigieren und Ihre Ropsten-Kontoadresse eingeben. Klicken Sie dort auf "Request funds" (Geld anfordern), wählen Sie im Dropdown-Menü "Ethereum Testnet Ropsten" (Ethereum-Testnet Ropsten) und klicken Sie dann nochmals auf die Schaltfläche "Request funds" (Geld anfordern). Sie sollten kurz darauf ETH in Ihrem MetaMask-Konto sehen. +Um unseren Smart Contract in das Testnetzwerk integrieren zu können, benötigen wir ein paar Fake-ETH. Um ETH zu erhalten, können Sie zum von Alchemy gehosteten [Sepolia Faucet](https://sepoliafaucet.com/) gehen, sich anmelden, Ihre Kontoadresse eingeben und auf „Send Me ETH“ klicken. Sie sollten kurz darauf ETH in Ihrem MetaMask-Konto sehen. ## Schritt 5: Kontostand überprüfen {#check-balance} -Um zu überprüfen, ob Sie das Guthaben erhalten haben, stellen wir eine [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)-Anfrage über das [Composer-Tool von Alchemy](https://composer.alchemyapi.io?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Das gibt den ETH-Betrag in unserem Wallet wieder. Nachdem Sie die Adresse Ihres MetaMask-Kontos eingegeben und auf “Send Request” (Anforderung senden) geklickt haben, sollten Sie eine Antwort ähnlich der Folgenden erhalten: +Um zu überprüfen, ob unser Guthaben vorhanden ist, stellen wir eine [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)-Anfrage mit dem [Composer-Tool von Alchemy](https://composer.alchemyapi.io?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Das gibt den ETH-Betrag in unserem Wallet wieder. Nachdem Sie die Adresse Ihres MetaMask-Kontos eingegeben und auf “Send Request” (Anforderung senden) geklickt haben, sollten Sie eine Antwort ähnlich der Folgenden erhalten: - `{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}` + ``` + `{\"jsonrpc\": \"2.0\", \"id\": 0, \"result\": \"0xde0b6b3a7640000\"}` + ``` -**HINWEIS: **Dieses Ergebnis ist in Wei, nicht in ETH. Wei ist die kleinste Einheit von Ether. Die Umrechnung von Wei auf ETH ist: 1 ETH = 1018 Wei. Wenn wir also 0xde0b6b3a7640000 in eine Dezimalzahl konvertieren, erhalten wir 1\*1018 Wei und das entspricht 1 ETH. +> **Hinweis:** Dieses Ergebnis ist in Wei, nicht in ETH. Wei ist die kleinste Einheit von Ether. Die Umrechnung von Wei auf ETH ist: 1 ETH = 1018 Wei. Wenn wir also 0xde0b6b3a7640000 in eine Dezimalzahl konvertieren, erhalten wir 1\*1018 Wei und das entspricht 1 ETH. Puh! Unser Falschgeld ist da. -## Schritt 6: Projekt initialisieren {#initialize-project} +## Schritt 6: Unser Projekt initialisieren {#initialize-project} Zunächst müssen wir einen Ordner für unser Projekt erstellen. Navigieren Sie zur Befehlszeile und geben Sie Folgendes ein: + ``` mkdir my-nft cd my-nft + ``` -Jetzt, da wir uns in unserem Projektordner befinden, verwenden wir "npm init" um das Projekt zu starten. Wenn Sie npm noch nicht installiert haben, folgen Sie [dieser Anleitung](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (wir brauchen auch [Node.js](https://nodejs.org/en/download/), also laden Sie das auch herunter). +Jetzt, da wir uns in unserem Projektordner befinden, verwenden wir "npm init" um das Projekt zu starten. Wenn Sie npm noch nicht installiert haben, befolgen Sie [diese Anweisungen](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (wir benötigen auch [Node.js](https://nodejs.org/en/download/), also laden Sie das auch herunter!). + ``` npm init + ``` Es spielt keine Rolle, wie Sie die Fragen zur Installation beantworten, aber wir haben es folgendermaßen gemacht: + ```json package name: (my-nft) version: (1.0.0) - description: My first NFT! + description: Mein erster NFT! entry point: (index.js) test command: git repository: @@ -92,7 +94,7 @@ Es spielt keine Rolle, wie Sie die Fragen zur Installation beantworten, aber wir { "name": "my-nft", "version": "1.0.0", - "description": "My first NFT!", + "description": "Mein erster NFT!", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" @@ -101,26 +103,32 @@ Es spielt keine Rolle, wie Sie die Fragen zur Installation beantworten, aber wir "license": "ISC" } ``` + Genehmigen Sie die Datei "package.json" und schon kann es losgehen. ## Schritt 7: [Hardhat](https://hardhat.org/getting-started/#overview) installieren {#install-hardhat} -Hardhat ist eine Entwicklungsumgebung zum Kompilieren, Bereitstellen, Testen und Debuggen Ihrer Ethereum-Software. Es hilft Entwicklern bei der lokalen Erstellung von Smart Contracts und dApps, bevor diese auf der Live-Chain bereitgestellt werden. +Hardhat ist eine Entwicklungsumgebung zum Kompilieren, Bereitstellen, Testen und Debuggen Ihrer Ethereum-Software. Es hilft Entwicklern Smart Contracts und dApps lokal zu erstellen, bevor diese auf der Live-Chain bereitgestellt werden. Innerhalb unseres my-nft-Projektlaufs: + ``` npm install --save-dev hardhat + ``` -Auf dieser Seite finden Sie weitere Informationen zur [Installationsanleitung](https://hardhat.org/getting-started/#overview). +Weitere Details zu den [Installationsanweisungen](https://hardhat.org/getting-started/#overview) finden Sie auf dieser Seite. ## Schritt 8: Hardhat-Projekt erstellen {#create-hardhat-project} Führen Sie folgeden Befehl in unserem Projektordner aus: + ``` npx hardhat + ``` Sie sollten dann eine Willkommensnachricht sehen und die Möglichkeit haben, auszuwählen, wie Sie fortfahren möchten. Wählen Sie "create an empty hardhat.config.js" (Leere hardhat.config.js erstellen) aus: + ``` 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 @@ -131,9 +139,10 @@ Sie sollten dann eine Willkommensnachricht sehen und die Möglichkeit haben, aus 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 👷 Welcome to Hardhat v2.0.11 👷‍ ? Was möchten Sie tun? … - Create a sample project - ❯ Create an empty hardhat.config.js - Quit + Ein Beispielprojekt erstellen + ❯ Eine leere hardhat.config.js erstellen + Beenden + ``` Darüber wird eine hardhat.config.js-Datei für uns generiert, in der alle Einstellungen für unser Projekt angeben werden (in Schritt 13). @@ -141,25 +150,27 @@ Darüber wird eine hardhat.config.js-Datei für uns generiert, in der alle Einst Um unser Projekt zu organisieren, erstellen wir zwei neue Ordner. Navigieren Sie in der Befehlszeile zum Stammverzeichnis Ihres Projekts und geben Sie Folgendes ein: + ``` mkdir contracts mkdir scripts + ``` - contracts/ ist der Ort, an dem wir unseren NFT-Smart-Contract-Code aufbewahren werden. - scripts/ ist der Ort, an dem wir Skripte veröffentlichen und mit unseren Smart Contract interagieren. -## Schritt 10: Vertrag schreiben {#write-contract} +## Schritt 10: Unseren Vertrag schreiben {#write-contract} -Nachdem unsere Umgebung nun eingerichtet ist, kommen wir zu spannenderen Dingen: _Wir schreiben unseren Smart-Contract-Code._ +Jetzt, da unsere Umgebung eingerichtet ist, geht es an die aufregenderen Dinge: _das Schreiben unseres Smart-Contract-Codes!_ -Öffnen sie das my-nft-Projekt in ihrem favorisierten Ordner (wir bevorzugen [VSCode](https://code.visualstudio.com/)). Smart Contracts werden in einer Sprache namens Solidity geschrieben. Damit werden wir auch unseren Smart Contract MyNFT.sol schreiben. +Öffnen Sie das my-nft-Projekt in Ihrem bevorzugten Editor (wir mögen [VSCode](https://code.visualstudio.com/)). Smart Contracts werden in einer Sprache namens Solidity geschrieben. Damit werden wir auch unseren Smart Contract MyNFT.sol schreiben. -1. Navigieren Sie zum Ordner `Contracts` (Verträge) und erstellen Sie eine neue Datei namens MyNFT.sol. +1. Navigieren Sie zum `contracts`-Ordner und erstellen Sie eine neue Datei namens MyNFT.sol. -2. Im Folgenden finden Sie den NFT-Smart-Contract-Code, der auf der ERC-721-Implementierung der [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc721)-Bibliothek basiert. Kopieren Sie folgenden Inhalt und fügen Sie ihn in die Datei MyNFT.sol ein. +2. Nachfolgend finden Sie unseren NFT-Smart-Contract-Code, der auf der ERC-721-Implementierung der [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc721)-Bibliothek basiert. Kopieren Sie folgenden Inhalt und fügen Sie ihn in die Datei MyNFT.sol ein. ```solidity - //Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) + //Vertrag basiert auf [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; @@ -189,74 +200,74 @@ Nachdem unsere Umgebung nun eingerichtet ist, kommen wir zu spannenderen Dingen: } ``` -3. Weil wir Klassen der OpenZeppelin-Vertragsbibliothek erben, geben Sie `npm install @openzeppelin/contracts` in die Befehlszeile ein, um die Bibliothek in Ihrem Ordner zu installieren. +3. Da wir Klassen aus der OpenZeppelin-contracts-Bibliothek erben, führen Sie in Ihrer Kommandozeile `npm install @openzeppelin/contracts^4.0.0` aus, um die Bibliothek in unserem Ordner zu installieren. -Doch was _macht_ dieser Code denn genau? Sehen wir uns das gemeinsam Zeil für Zeile an. +Was also _tut_ dieser Code genau? Sehen wir uns das gemeinsam Zeil für Zeile an. -Am Anfang unseres Smart Contracts importieren wir drei [OpenZeppelin](https://openzeppelin.com/)-Smart-Contract-Klassen: +Ganz oben in unserem Smart-Contract importieren wir drei [OpenZeppelin](https://openzeppelin.com/)-Smart-Contract-Klassen: -- @openzeppelin/contracts/token/ERC721/ERC721.sol enthält eine Implementierung des ERC-721-Standards, den unser NFT-Smart-Contract erben wird. (Damit der NFT auch Gültikeit erlangt, muss Ihr Smart Contract alle Methoden des ERC-721-Standards implementieren.) In der Schnittstellendefinition [hier](https://eips.ethereum.org/EIPS/eip-721) erfahren Sie mehr über die vererbten ERC-721-Funktionen. +- @openzeppelin/contracts/token/ERC721/ERC721.sol enthält eine Implementierung des ERC-721-Standards, den unser NFT-Smart-Contract erben wird. (Damit der NFT auch Gültikeit erlangt, muss Ihr Smart Contract alle Methoden des ERC-721-Standards implementieren.) Um mehr über die geerbten ERC-721-Funktionen zu erfahren, sehen Sie sich die Schnittstellendefinition [hier](https://eips.ethereum.org/EIPS/eip-721) an. - @openzeppelin/contracts/utils/Counters.sol stellt Zähler zur Verfügung, die jeweils nur um eins erhöht oder verringert werden können. Unser Smart Contract benutzt einen Zähler, um die Gesamtanzahl der geprägten NFTs zu überprüfen und eine eindeutige ID für unseren neuen NFT festzulegen. (Jedem NFT, der durch die Benutzung eines Smart Contracts geprägt wird, muss eine eindeutige ID zugewiesen werden. In diesem Beispiel wird unsere eindeutige ID einfach deterministisch über die Gesamtanzahl der existierenden NFTs bestimmt. Zum Beispiel hat der erste NFT, der mit unserem Smart Contract geprägt wird, die ID "1", unser zweiter NFT hat die ID "2" usw.) -- @openzeppelin/contracts/access/Ownable.sol richtet eine [Zugriffskontrolle](https://docs.openzeppelin.com/contracts/3.x/access-control) in unserem Smart Contract ein, so dass nur der Besitzer des Smart Contracts (also Sie) NFTs prägen kann. (Hinweis, die Einbeziehung der Zugriffskontrolle ist optional. Wenn Sie möchten, dass mit Ihrem Smart Contract jeder NFTs prägen kann, entfernen Sie das Wort "Ownable" in Zeile 10 und "onlyOwner" in Zeile 17.) +- @openzeppelin/contracts/access/Ownable.sol richtet eine [Zugriffskontrolle](https://docs.openzeppelin.com/contracts/3.x/access-control) für unseren Smart-Contract ein, sodass nur der Eigentümer des Smart-Contracts (also Sie) NFTs prägen kann. (Hinweis, die Einbeziehung der Zugriffskontrolle ist optional. Wenn Sie möchten, dass mit Ihrem Smart Contract jeder NFTs prägen kann, entfernen Sie das Wort "Ownable" in Zeile 10 und "onlyOwner" in Zeile 17.) -Nach unseren Importanweisungen haben wir unseren benutzerdefinierten Smart Contract, der überraschend kurz ist , denn er enthält nur einen Zähler, einen Konstruktor und eine einzige Funktion. Das ist unseren vererbten OpenZeppelin-Contracts zu verdanken, die einen Großteil der Methoden implementieren, die wir zur Erstellung eines NFT benötigen, wie `ownerOf`, was den Besitzer des NFT zurückgibt, und `transferFrom`, was das Eigentum an einem NFT von einem Konto zu einem anderen überträgt. +Nach unseren Importanweisungen haben wir unseren benutzerdefinierten Smart Contract, der überraschend kurz ist , denn er enthält nur einen Zähler, einen Konstruktor und eine einzige Funktion. Dies ist den von uns geerbten OpenZeppelin-Contracts zu verdanken, die die meisten der Methoden implementieren, die wir zum Erstellen eines NFT benötigen, wie z. B. `ownerOf`, das den Eigentümer des NFT zurückgibt, und `transferFrom`, das das Eigentum am NFT von einem Konto auf ein anderes überträgt. Sie werden feststellen, dass wir in unserem ERC-721-Konstruktor zwei Zeichenfolgen übergeben: "MyNFT" und "NFT". Die erste Variable ist der Name des Smart Contracts und die zweite ist sein Symbol. Sie können jede der beiden Variablen benennen wie sie möchten. -Schließlich haben wir unsere Funktion `mintNFT(address recipient, string memory tokenURI)`, mit der wir einen NFT prägen können. Sie werden bemerken, dass diese Funktion zwei Variablen benötigt: +Schließlich haben wir unsere Funktion `mintNFT(address recipient, string memory tokenURI)`, die es uns ermöglicht, einen NFT zu prägen! Sie werden bemerken, dass diese Funktion zwei Variablen benötigt: -- `address recipient` gibt die Adresse an, die den frisch geprägten NFT erhalten soll. +- `address recipient` gibt die Adresse an, die Ihren frisch geprägten NFT erhalten wird -- `string memory tokenURI` ist eine Zeichenfolge, die auf ein JSON-Dokument zeigt, das die Metadaten des NFT beschreibt. Die Metadaten eines NFT, sind das Element, das den NFT wirklich zum Leben erwecken. Sie schaffen die Grundlage, dass ein NFT konfigurierbare Eigenschaften wie einen Namen, eine Beschreibung ein Bild und andere Attribute haben kann. In Teil 2 dieses Tutorials wird die Konfiguration dieser Metadaten beschrieben. +- `string memory tokenURI` ist ein String, der in ein JSON-Dokument aufgelöst werden sollte, das die Metadaten des NFTs beschreibt. Die Metadaten eines NFT, sind das Element, das den NFT wirklich zum Leben erwecken. Sie schaffen die Grundlage, dass ein NFT konfigurierbare Eigenschaften wie einen Namen, eine Beschreibung ein Bild und andere Attribute haben kann. In Teil 2 dieses Tutorials wird die Konfiguration dieser Metadaten beschrieben. -`mintNFT` ruft bestimmte Methoden der vererbten ERC-721-Bibliothek auf und gibt eine Zahl zurück, die für die ID des frisch geprägten NFT steht. +`mintNFT` ruft einige Methoden aus der geerbten ERC-721-Bibliothek auf und gibt schließlich eine Zahl zurück, die die ID des frisch geprägten NFT darstellt. -## Schritt 11: MetaMask und Alchemy mit ihrem Projekt mit Ihrem Projekt verbinden {#connect-metamask-and-alchemy} +## Schritt 11: MetaMask & Alchemy mit Ihrem Projekt verbinden {#connect-metamask-and-alchemy} Nachdem wir nun eine MetaMask-Wallet und ein Alchemy-Konto erstellt uns unseren Smart Contract geschrieben haben, ist es an der Zeit, die drei Elemente miteinander zu verbinden. Jede Transaktion, die von Ihrer virtuellen Wallet gesendet wird, benötigt eine Signatur mit ihrem eindeutigen privaten Schlüssel. Um unser Programm mit dieser Berechtigung auszustatten, können wir unseren privaten Schlüssel (und Alchemy-API-Schlüssel) in einer Umgebungsdatei sicher abspeichern. -Wenn Sie mehr über das Senden von Transaktionen erfahren möchten, schauen Sie sich [dieses Tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) über das senden von Transaktionen mit Web3 an. +Um mehr über das Senden von Transaktionen zu erfahren, sehen Sie sich [dieses Tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) über das Senden von Transaktionen mit web3 an. Installieren Sie zuerst das dotenv-Paket in Ihrem Projektverzeichnis: + ``` npm install dotenv --save + ``` -Danach erstellen Sie eine `.env`-Datei im Hauptverzeichnis des Projekts und fügen den privaten Schlüssel von MetaMask und die HTTP-URL der Alchemy-API hinzu. +Erstellen Sie dann eine `.env`-Datei im Stammverzeichnis unseres Projekts und fügen Sie Ihren privaten MetaMask-Schlüssel und Ihre HTTP-Alchemy-API-URL hinzu. -- Befolgen Sie [diese Anweisungen](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key), um Ihren privaten Schlüssel aus MetaMask zu importieren. +- Befolgen Sie [diese Anweisungen](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key), um Ihren privaten Schlüssel aus MetaMask zu exportieren - Unten wird erläutert, wie Sie die HTTP-URL der Alchemy-API erhalten und in die Zwischenablage kopieren. -![Alchemy-API-URL kopieren](./copy-alchemy-api-url.gif) +![Kopieren Sie Ihre Alchemy-API-URL](./copy-alchemy-api-url.gif) -Ihre `.env`-Datei sollte nun wie folgt aussehen: +Ihre `.env`-Datei sollte jetzt so aussehen: - API_URL="https://eth-ropsten.alchemyapi.io/v2/your-api-key" + ``` + API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key" PRIVATE_KEY="your-metamask-private-key" + ``` -Um nun die Verbindung mit unserem Code zu erstellen, werden wir diese Variablen in der Datei hardhat.config.js in Schritt 13 referenzieren. +Um diese tatsächlich mit unserem Code zu verbinden, werden wir in Schritt 13 in unserer Datei hardhat.config.js auf diese Variablen verweisen. - - - -Führen Sie keinen Commit für .env aus. Stellen Sie sicher, dass Sie Ihre .env-Datei niemals an andere weitergeben, denn damit würden Sie Ihre geheimen Daten weitergeben. Wenn Sie die Versionskontrolle verwenden, fügen Sie Ihre Env-Datei zu einer Datei gitignore hinzu. - - - + ## Schritt 12: Ethers.js installieren {#install-ethers} -Ethers.js ist eine Bibliothek, die es einfacher macht, mit Ethereum zu interagieren und Anfragen zu stellen. Dafür schließt sie [Standard-JSON-RPC-Methoden](/developers/docs/apis/json-rpc/) in benutzerfreundlichere Methoden ein. +Ethers.js ist eine Bibliothek, die die Interaktion und das Stellen von Anfragen an Ethereum erleichtert, indem sie [standardmäßige JSON-RPC-Methoden](/developers/docs/apis/json-rpc/) in benutzerfreundlichere Methoden verpackt. -Hardhat macht es sehr einfach [Plug-ins](https://hardhat.org/plugins/) für zusätzliche Tools und erweiterte Funktionen zu integrieren. Wir werden das [Ethers-Plug-in](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) für die Bereitstellung von Verträgen nutzen ([Ethers.js](https://github.com/ethers-io/ethers.js/) bietet einige sehr saubere Methoden zur Bereitstellung von Verträgen). +Hardhat macht es sehr einfach, [Plugins](https://hardhat.org/plugins/) für zusätzliche Tools und erweiterte Funktionalität zu integrieren. Wir werden das [Ethers-Plugin](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) für die Vertragsbereitstellung nutzen ([Ethers.js](https://github.com/ethers-io/ethers.js/) verfügt über einige sehr saubere Methoden zur Vertragsbereitstellung). Geben Sie Folgendes in Ihrem Projektverzeichnis ein: + ``` npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0 + ``` Im nächsten Schritt benötigen wir auch Ether in unserer hardhat.config.js. @@ -275,10 +286,10 @@ Aktualisieren Sie Ihre hardhat.config.js so, dass sie wie folgt aussieht: const { API_URL, PRIVATE_KEY } = process.env; module.exports = { solidity: "0.8.1", - defaultNetwork: "ropsten", + defaultNetwork: "sepolia", networks: { hardhat: {}, - ropsten: { + sepolia: { url: API_URL, accounts: [`0x${PRIVATE_KEY}`] } @@ -286,27 +297,29 @@ Aktualisieren Sie Ihre hardhat.config.js so, dass sie wie folgt aussieht: } ``` -## Schritt 14: Vertrag kompilieren {#compile-contract} +## Schritt 14: Unseren Vertrag kompilieren {#compile-contract} Um sicherzugehen, dass so weit alles funktioniert, sollten wir unseren Vertrag erstellen. Die Aufgabe compile ist eine der integrierten Hardhat-Aufgaben. Führen Sie folgenden Befehl in der Befehlszeile aus: + ``` npx hardhat compile + ``` -Möglicherweise erhalten Sie eine Warnung, dass die SPDX-Lizenzkennung nicht in Quelldatei angegeben sei. Doch darüber brauchen Sie sich keine Sorgen zu machen. Alles andere sieht hoffentlich gut aus. Falls nicht, können Sie jederzeit eine Nachricht im [Alchemy Discord](https://discord.gg/u72VCg3) hinterlassen. +Möglicherweise erhalten Sie eine Warnung, dass die SPDX-Lizenzkennung nicht in Quelldatei angegeben sei. Doch darüber brauchen Sie sich keine Sorgen zu machen. Alles andere sieht hoffentlich gut aus. Wenn nicht, können Sie jederzeit eine Nachricht im [Alchemy-Discord](https://discord.gg/u72VCg3) schreiben. -## Schritt 15: Bereitstellungsskript schreiben {#write-deploy} +## Schritt 15: Unser Bereitstellungsskript schreiben {#write-deploy} Nun, da unser Vertrag geschrieben und unsere Konfigurationsdatei einsatzbereit ist, ist es an der Zeit, das Skript zur Bereitstellung des Vertrags zu schreiben. -Navigieren Sie zum Ordner `scripts/` und erstellen Sie eine neue Datei namens `deploy.js`. Fügen Sie folgende Inhalte hinzu: +Navigieren Sie zum `scripts/`-Ordner und erstellen Sie eine neue Datei namens `deploy.js`, indem Sie die folgenden Inhalte hinzufügen: ```js async function main() { const MyNFT = await ethers.getContractFactory("MyNFT") - // Start deployment, returning a promise that resolves to a contract object + // Bereitstellung starten, die ein Promise zurückgibt, das zu einem Vertragsobjekt aufgelöst wird const myNFT = await MyNFT.deploy() await myNFT.deployed() console.log("Contract deployed to address:", myNFT.address) @@ -320,40 +333,48 @@ main() }) ``` -Hardhat erklärt in seinem [Vertragstutorial](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) sehr gut, was die einzelnen Codezeilen bewirken. Wir haben diese Erklärungen hier übernommen. +Hardhat erklärt in seinem [Contracts-Tutorial](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) hervorragend, was jede dieser Codezeilen bewirkt; wir haben die Erklärungen hier übernommen. + ``` const MyNFT = await ethers.getContractFactory("MyNFT"); + ``` Eine ContractFactory in ethers.js ist eine Abstraktion, die dazu dient, neue Smart Contracts einzusetzen. So ist MyNFT eine Factory für Instanzen von unseren NFT-Vertrag. Wenn Sie das hardhat-ethers-Plug-in verwenden, werden die Instanzen ContractFactory und Contract standardmäßig mit dem ersten Unterzeichner verbunden. + ``` const myNFT = await MyNFT.deploy(); + ``` Mit dem Aufruf von deploy() über eine ContractFactory wird die Bereitstellung gestartet. Zurückgegeben wird eine Referenz, die auf einen Vertrag zeigt. Das ist das Objekt, das eine Methode für jede unserer Smart-Contract-Funktionen enthält. -## Schritt 16: Vertragsbereitstellung {#deploy-contract} +## Schritt 16: Unseren Vertrag bereitstellen {#deploy-contract} Nun sind wir endlich bereit, unseren Smart Contract bereitzustellen. Navigieren Sie zurück zu Ihrem Stammverzeichnis und führen Sie Folgendes über die Befehlszeile aus: - npx hardhat --network ropsten run scripts/deploy.js + ``` + npx hardhat --network sepolia run scripts/deploy.js + ``` Sie sollten dann etwas sehen wie: - Contract deployed to address: 0x81c587EB0fE773404c42c1d2666b5f557C470eED + ``` + Vertrag bereitgestellt für Adresse: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650 + ``` -Wenn wir den [Ropsten-Etherscan](https://ropsten.etherscan.io/) aufrufen und nach unserer Vertragsadresse suchen, sollten wir sehen, dass sie erfolgreich bereitgestellt wurde. Wenn sie nicht sofort angezeigt wird, haben Sie etwas Geduld, denn dieser Vorgang kann einige Zeit in Anspruch nehmen. Die Transaktion wird ungefähr so aussehen: +Wenn wir zum [Sepolia Etherscan](https://sepolia.etherscan.io/) gehen und nach unserer Vertragsadresse suchen, sollten wir sehen können, dass sie erfolgreich bereitgestellt wurde. Wenn sie nicht sofort angezeigt wird, haben Sie etwas Geduld, denn dieser Vorgang kann einige Zeit in Anspruch nehmen. Die Transaktion wird ungefähr so aussehen: -![Transaktionsadresse auf Etherscan einsehen](./etherscan-sepolia-tx-details.png) +![Ihre Transaktionsadresse auf Etherscan ansehen](./etherscan-sepoila-contract-creation.png) -Die Absenderadresse sollte mit der Adresse ihres MetaMask-Kontos übereinstimmen und in der Empfängeradresse sollte "Contract Creation" (Vertragserstellung) stehen. Wenn wir auf die Transaktion klicken ,sehen wir unsere Vertragsadresse im Empfängerfeld: +Die `From`-Adresse sollte mit Ihrer MetaMask-Kontoadresse übereinstimmen und die `To`-Adresse lautet „Contract Creation“. Wenn wir auf die Transaktion klicken ,sehen wir unsere Vertragsadresse im Empfängerfeld: -![Vertragsadresse auf Etherscan anzeigen](./etherscan-sepoila-contract-creation.png) +![Ihre Vertragsadresse auf Etherscan ansehen](./etherscan-sepolia-tx-details.png) -Großartig! Sie haben soeben Ihren NFT-Smart-Contract auf der Ethereum-Chain bereitgestellt. +Großartig! Sie haben soeben Ihren NFT-Smart-Contract in der Ethereum-Chain (Testnet) bereitgestellt! -Um zu verstehen, was im Verborgenen vor sich geht, navigieren wir zur Explorer-Registerkarte in unserem [Alchemy-Dashboard](https://dashboard.alchemyapi.io/explorer). Wenn Sie mehrere Alchemy-Apps besitzen, filtern Sie nach Apps und wählen Sie "MyNFT" aus. +Um zu verstehen, was unter der Haube vor sich geht, navigieren wir zum Explorer-Tab in unserem [Alchemy-Dashboard](https://dashboard.alchemyapi.io/explorer). Wenn Sie mehrere Alchemy-Apps besitzen, filtern Sie nach Apps und wählen Sie "MyNFT" aus. -![Mit dem Explorer-Dashboard von Alchemy Aufrufe einsehen, die im Verborgenen erfolgen](./alchemy-explorer-goerli.png) +![Anzeigen von Aufrufen, die „unter der Haube“ mit dem Explorer-Dashboard von Alchemy gemacht wurden](./alchemy-explorer-goerli.png) -Hier sehen Sie eine Handvoll JSON-RPC-Aufrufe, die Hardhat/Ethers implementiert hat, als wir die .deploy()-Funktion aufgerufen haben. Zwei wichtige Funktionen, die hier aufzuführen sind, ist die [eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction), die eine Anforderung zum Schreiben unseres Smart Contracts auf der Ropsten-Chain ist, und [eth_getTranscationByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash), die eine Anforderung ist, um Informationen über unsere Transaktion zu lesen, die vom Hash gegeben werden (ein typisches Muster beim Senden von Transaktionen). Wenn Sie mehr über das Senden von Transaktionen erfahren möchten, schauen Sie sich diese Anleitung an: [Transaktionen mit Web3 senden](/developers/tutorials/sending-transactions-using-web3-and-alchemy/). +Hier sehen Sie eine Handvoll JSON-RPC-Aufrufe, die Hardhat/Ethers implementiert hat, als wir die .deploy()-Funktion aufgerufen haben. Zwei wichtige Aufrufe sind hier [eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction), das ist die Anfrage, um unseren Smart-Contract tatsächlich in die Sepolia-Chain zu schreiben, und [eth_getTransactionByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash), eine Anfrage zum Lesen von Informationen über unsere Transaktion anhand des Hashes (ein typisches Muster beim Senden von Transaktionen). Um mehr über das Senden von Transaktionen zu erfahren, lesen Sie dieses Tutorial über das [Senden von Transaktionen mit Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/). -Damit sind wir am Ende vom ersten Teil dieses Tutorials. In [Teil 2 werden wir mit unserem Smart Contract interagieren, indem wir einen NFT prägen](/developers/tutorials/how-to-mint-an-nft/). In [Teil 3 werden wir Ihnen zeigen, wie Sie Ihren NFT in Ihrer Ethereum-Wallet sehen können](/developers/tutorials/how-to-view-nft-in-metamask/). +Damit sind wir am Ende vom ersten Teil dieses Tutorials. In [Teil 2 werden wir tatsächlich mit unserem Smart-Contract interagieren, indem wir einen NFT prägen](/developers/tutorials/how-to-mint-an-nft/), und in [Teil 3 zeigen wir Ihnen, wie Sie Ihren NFT in Ihrer Ethereum-Wallet ansehen können](/developers/tutorials/how-to-view-nft-in-metamask/)! diff --git a/public/content/translations/de/developers/tutorials/interact-with-other-contracts-from-solidity/index.md b/public/content/translations/de/developers/tutorials/interact-with-other-contracts-from-solidity/index.md new file mode 100644 index 00000000000..6c4501fde9f --- /dev/null +++ b/public/content/translations/de/developers/tutorials/interact-with-other-contracts-from-solidity/index.md @@ -0,0 +1,179 @@ +--- +title: Mit anderen Contracts von Solidity aus interagieren +description: Wie man einen Smart Contract von einem bestehenden Contract aus bereitstellt und mit ihm interagiert +author: "jdourlens" +tags: + [ + "intelligente Verträge", + "solidity", + "remix", + "Bereitstellung", + "Komponierbarkeit" + ] +skill: advanced +lang: de +published: 2020-04-05 +source: EthereumDev +sourceUrl: https://ethereumdev.io/interact-with-other-contracts-from-solidity/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +In den vorherigen Tutorials haben wir viel gelernt, [wie man seinen ersten Smart Contract bereitstellt](/developers/tutorials/deploying-your-first-smart-contract/) und ihm einige Funktionen hinzufügt, wie [Zugriffskontrolle mit Modifikatoren](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/) oder [Fehlerbehandlung in Solidity](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/). In diesem Tutorial lernen wir, wie man einen Smart Contract von einem bestehenden Contract aus bereitstellt und mit ihm interagiert. + +Wir erstellen einen Contract, der es jedem ermöglicht, seinen eigenen `Counter`-Smart-Contract zu haben. Dafür erstellen wir eine Factory, die `CounterFactory` heißen wird. Hier ist zunächst der Code unseres ursprünglichen `Counter`-Smart-Contracts: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + uint256 private _count; + address private _owner; + address private _factory; + + + modifier onlyOwner(address caller) { + require(caller == _owner, "Du bist nicht der Eigentümer des Vertrags"); + _; + } + + modifier onlyFactory() { + require(msg.sender == _factory, "Du musst die Factory verwenden"); + _; + } + + constructor(address owner) public { + _owner = owner; + _factory = msg.sender; + } + + function getCount() public view returns (uint256) { + return _count; + } + + function increment(address caller) public onlyFactory onlyOwner(caller) { + _count++; + } + +} +``` + +Beachte, dass wir den Contract-Code geringfügig geändert haben, um die Adresse der Factory und die Adresse des Contract-Eigentümers zu speichern. Wenn du einen Contract-Code von einem anderen Contract aus aufrufst, verweist `msg.sender` auf die Adresse unserer Contract-Factory. Dies ist **ein sehr wichtiger Punkt, den man verstehen sollte**, da die Verwendung eines Contracts zur Interaktion mit anderen Contracts gängige Praxis ist. Daher solltest du in komplexen Fällen darauf achten, wer der Absender ist. + +Dafür haben wir auch einen `onlyFactory`-Modifikator hinzugefügt, der sicherstellt, dass die zustandsändernde Funktion nur von der Factory aufgerufen werden kann, die den ursprünglichen Aufrufer als Parameter übergibt. + +Innerhalb unserer neuen `CounterFactory`, die alle anderen Counter verwalten wird, fügen wir ein Mapping hinzu, das einem Eigentümer die Adresse seines Counter-Contracts zuordnet: + +```solidity +mapping(address => Counter) _counters; +``` + +In Ethereum sind Mappings das Äquivalent zu Objekten in Javascript; sie ermöglichen es, einen Schlüssel vom Typ A einem Wert vom Typ B zuzuordnen. In diesem Fall ordnen wir die Adresse eines Eigentümers der Instanz seines Counters zu. + +Das Instanziieren eines neuen `Counter` für jemanden sieht wie folgt aus: + +```solidity + function createCounter() public { + require (_counters[msg.sender] == Counter(0)); + _counters[msg.sender] = new Counter(msg.sender); + } +``` + +Zuerst prüfen wir, ob die Person bereits einen `Counter` besitzt. Wenn die Person keinen `Counter` besitzt, instanziieren wir einen neuen, indem wir ihre Adresse an den `Counter`-Konstruktor übergeben und die neu erstellte Instanz dem Mapping zuweisen. + +Um den Zählerstand eines bestimmten `Counter` abzurufen, sieht es wie folgt aus: + +```solidity +function getCount(address account) public view returns (uint256) { + require (_counters[account] != Counter(0)); + return (_counters[account].getCount()); +} + +function getMyCount() public view returns (uint256) { + return (getCount(msg.sender)); +} +``` + +Die erste Funktion prüft, ob der `Counter`-Contract für eine bestimmte Adresse existiert, und ruft dann die `getCount`-Methode von der Instanz auf. Die zweite Funktion, `getMyCount`, ist nur eine Abkürzung, um `msg.sender` direkt an die `getCount`-Funktion zu übergeben. + +Die `increment`-Funktion ist recht ähnlich, übergibt aber den ursprünglichen Transaktionssender an den `Counter`-Contract: + +```solidity +function increment() public { + require (_counters[msg.sender] != Counter(0)); + Counter(_counters[msg.sender]).increment(msg.sender); + } +``` + +Beachte, dass unser `Counter` bei zu häufigen Aufrufen Opfer eines Überlaufs werden könnte. Du solltest die [SafeMath-Bibliothek](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/) so oft wie möglich verwenden, um dich vor diesem möglichen Fall zu schützen. + +Um unseren Contract bereitzustellen, musst du sowohl den Code der `CounterFactory` als auch den des `Counter` angeben. Bei der Bereitstellung in Remix musst du zum Beispiel `CounterFactory` auswählen. + +Hier ist der vollständige Code: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + uint256 private _count; + address private _owner; + address private _factory; + + + modifier onlyOwner(address caller) { + require(caller == _owner, "Du bist nicht der Eigentümer des Vertrags"); + _; + } + + modifier onlyFactory() { + require(msg.sender == _factory, "Du musst die Factory verwenden"); + _; + } + + constructor(address owner) public { + _owner = owner; + _factory = msg.sender; + } + + function getCount() public view returns (uint256) { + return _count; + } + + function increment(address caller) public onlyFactory onlyOwner(caller) { + _count++; + } + +} + +contract CounterFactory { + + mapping(address => Counter) _counters; + + function createCounter() public { + require (_counters[msg.sender] == Counter(0)); + _counters[msg.sender] = new Counter(msg.sender); + } + + function increment() public { + require (_counters[msg.sender] != Counter(0)); + Counter(_counters[msg.sender]).increment(msg.sender); + } + + function getCount(address account) public view returns (uint256) { + require (_counters[account] != Counter(0)); + return (_counters[account].getCount()); + } + + function getMyCount() public view returns (uint256) { + return (getCount(msg.sender)); + } + +} +``` + +Nach dem Kompilieren wählst du im Bereitstellungsbereich von Remix die Factory aus, die bereitgestellt werden soll: + +![Auswahl der in Remix bereitzustellenden Factory](./counterfactory-deploy.png) + +Danach kannst du mit deiner Contract Factory interagieren und die Wertänderung überprüfen. Wenn du den Smart Contract von einer anderen Adresse aus aufrufen möchtest, musst du die Adresse in der Kontoauswahl von Remix ändern. diff --git a/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md b/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md new file mode 100644 index 00000000000..b82d4d482d6 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md @@ -0,0 +1,73 @@ +--- +title: IPFS für dezentralisierte Benutzeroberflächen +description: Dieses Tutorial zeigt dem Leser, wie man IPFS nutzt, um die Benutzeroberfläche für eine Dapp zu speichern. Obwohl die Daten und die Geschäftslogik der Anwendung dezentralisiert sind, könnten Benutzer ohne eine zensurresistente Benutzeroberfläche trotzdem den Zugriff darauf verlieren. +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +tags: [ "ipfs" ] +skill: beginner +lang: de +published: 2024-06-29 +--- + +Sie haben eine unglaubliche neue Dapp geschrieben. Sie haben sogar eine [Benutzeroberfläche](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) dafür geschrieben. Aber jetzt befürchten Sie, dass jemand versuchen könnte, sie zu zensieren, indem er Ihre Benutzeroberfläche, die sich nur auf einem einzigen Server in der Cloud befindet, lahmlegt. In diesem Tutorial lernen Sie, wie Sie Zensur vermeiden können, indem Sie Ihre Benutzeroberfläche im **[Interplanetary File System (IPFS)](https://ipfs.tech/developers/)** ablegen, sodass jeder Interessierte sie für den zukünftigen Zugriff auf einem Server pinnen kann. + +Sie könnten einen Drittanbieterdienst wie [Fleek](https://resources.fleek.xyz/docs/) nutzen, um die ganze Arbeit zu erledigen. Dieses Tutorial richtet sich an Personen, die genug tun wollen, um zu verstehen, was sie tun, auch wenn es mehr Arbeit bedeutet. + +## Lokale erste Schritte {#getting-started-locally} + +Es gibt mehrere [Drittanbieter von IPFS](https://docs.ipfs.tech/how-to/work-with-pinning-services/#use-a-third-party-pinning-service), aber für Testzwecke ist es am besten, IPFS zunächst lokal auszuführen. + +1. Installieren Sie die [IPFS-Benutzeroberfläche](https://docs.ipfs.tech/install/ipfs-desktop/#install-instructions). + +2. Erstellen Sie ein Verzeichnis mit Ihrer Website. Wenn Sie [Vite](https://vite.dev/) verwenden, nutzen Sie diesen Befehl: + + ```sh + pnpm vite build + ``` + +3. Klicken Sie in IPFS Desktop auf **Importieren > Ordner** und wählen Sie das Verzeichnis aus, das Sie im vorherigen Schritt erstellt haben. + +4. Wählen Sie den Ordner aus, den Sie gerade hochgeladen haben, und klicken Sie auf **Umbenennen**. Geben Sie ihm einen aussagekräftigeren Namen. + +5. Wählen Sie ihn erneut aus und klicken Sie auf **Link teilen**. Kopieren Sie die URL in die Zwischenablage. Der Link wäre ähnlich wie `https://ipfs.io/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`. + +6. Klicken Sie auf **Status**. Erweitern Sie den Tab **Erweitert**, um die Gateway-Adresse zu sehen. Auf meinem System lautet die Adresse beispielsweise `http://127.0.0.1:8080`. + +7. Kombinieren Sie den Pfad aus dem Link-Schritt mit der Gateway-Adresse, um Ihre Adresse zu finden. Für das obige Beispiel lautet die URL `http://127.0.0.1:8080/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`. Öffnen Sie diese URL in einem Browser, um Ihre Website zu sehen. + +## Hochladen {#uploading} + +Jetzt können Sie IPFS also verwenden, um Dateien lokal bereitzustellen, was nicht sehr aufregend ist. Der nächste Schritt besteht darin, sie für die ganze Welt verfügbar zu machen, wenn Sie offline sind. + +Es gibt eine Reihe von bekannten [Pinning-Diensten](https://docs.ipfs.tech/concepts/persistence/#pinning-services). Wählen Sie einen davon aus. Egal welchen Dienst Sie nutzen, Sie müssen ein Konto erstellen und ihm den **Content Identifier (CID)** von Ihrem IPFS-Desktop bereitstellen. + +Ich persönlich fand [4EVERLAND](https://docs.4everland.org/storage/4ever-pin/guides) am einfachsten zu bedienen. Hier ist die Anleitung dafür: + +1. Navigieren Sie zum [Dashboard](https://dashboard.4everland.org/overview) und melden Sie sich mit Ihrer Wallet an. + +2. Klicken Sie in der linken Seitenleiste auf **Speicher > 4EVER Pin**. + +3. Klicken Sie auf **Hochladen > Ausgewählte CID**. Geben Sie Ihrem Inhalt einen Namen und geben Sie die CID aus dem IPFS-Desktop an. Derzeit ist eine CID eine Zeichenkette, die mit `Qm` beginnt, gefolgt von 44 Buchstaben und Ziffern, die einen [Base58-kodierten](https://medium.com/bootdotdev/base64-vs-base58-encoding-c25553ff4524) Hash darstellen, wie z. B. `QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`, aber [das wird sich wahrscheinlich ändern](https://docs.ipfs.tech/concepts/content-addressing/#version-1-v1). + +4. Der anfängliche Status ist **In Warteschlange**. Laden Sie neu, bis er sich auf **Gepinnt** ändert. + +5. Klicken Sie auf Ihre CID, um den Link zu erhalten. Sie können meine Anwendung [hier](https://bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im.ipfs.dweb.link/) sehen. + +6. Möglicherweise müssen Sie Ihr Konto aktivieren, damit es länger als einen Monat gepinnt bleibt. Die Aktivierung des Kontos kostet etwa 1 $. Wenn Sie es geschlossen haben, melden Sie sich ab und wieder an, um erneut zur Aktivierung aufgefordert zu werden. + +## Verwendung von IPFS {#using-from-ipfs} + +An diesem Punkt haben Sie einen Link zu einem zentralisierten Gateway, das Ihre IPFS-Inhalte bereitstellt. Kurz gesagt, Ihre Benutzeroberfläche ist vielleicht etwas sicherer, aber immer noch nicht zensurresistent. Für echte Zensurresistenz müssen Benutzer IPFS [direkt aus einem Browser](https://docs.ipfs.tech/install/ipfs-companion/#prerequisites) verwenden. + +Sobald Sie das installiert haben (und der Desktop-IPFS funktioniert), können Sie auf jeder Website zu [/ipfs/``](https://any.site/ipfs/bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im) gehen und Sie erhalten diesen Inhalt auf dezentralisierte Weise. + +## Nachteile {#drawbacks} + +Sie können IPFS-Dateien nicht zuverlässig löschen. Solange Sie also Ihre Benutzeroberfläche ändern, ist es wahrscheinlich am besten, sie entweder zentralisiert zu belassen oder das [Interplanetary Name System (IPNS)](https://docs.ipfs.tech/concepts/ipns/#mutability-in-ipfs) zu verwenden, ein System, das Veränderbarkeit auf IPFS bietet. Natürlich kann alles, was veränderbar ist, zensiert werden, im Fall von IPNS, indem man die Person unter Druck setzt, die den zugehörigen privaten Schlüssel besitzt. + +Außerdem haben einige Pakete ein Problem mit IPFS. Wenn Ihre Website also sehr kompliziert ist, ist das möglicherweise keine gute Lösung. Und natürlich kann alles, was auf Server-Integration angewiesen ist, nicht dezentralisiert werden, nur weil die Client-Seite auf IPFS liegt. + +## Fazit {#conclusion} + +So wie Ethereum es Ihnen ermöglicht, die Datenbank- und Geschäftslogikaspekte Ihrer Dapp zu dezentralisieren, ermöglicht IPFS die Dezentralisierung der Benutzeroberfläche. Damit können Sie einen weiteren Angriffsvektor gegen Ihre Dapp ausschalten. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). diff --git a/public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md new file mode 100644 index 00000000000..e9232251e92 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -0,0 +1,111 @@ +--- +title: Starte deine Dapp-Frontend-Entwicklung mit create-eth-app +description: Ein Überblick über die Verwendung und Funktionen von create-eth-app +author: "Markus Waas" +tags: + [ + "Frontend", + "javascript", + "ethers.js", + "the graph", + "defi" + ] +skill: beginner +lang: de +published: 2020-04-27 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/create-eth-app +--- + +Zuletzt haben wir uns [das große Ganze von Solidity](https://soliditydeveloper.com/solidity-overview-2020) angesehen und bereits [create-eth-app](https://github.com/PaulRBerg/create-eth-app) erwähnt. Jetzt erfährst du, wie du sie verwenden kannst, welche Funktionen integriert sind und wie du sie weiter ausbauen kannst. Diese App, die von Paul Razvan Berg, dem Gründer von [Sablier](http://sablier.com/), gestartet wurde, wird deine Frontend-Entwicklung in Schwung bringen und bietet mehrere optionale Integrationen zur Auswahl. + +## Installation {#installation} + +Die Installation erfordert Yarn 0.25 oder höher (`npm install yarn --global`). Die Ausführung ist denkbar einfach: + +```bash +yarn create eth-app my-eth-app +cd my-eth-app +yarn react-app:start +``` + +Es verwendet [create-react-app](https://github.com/facebook/create-react-app) unter der Haube. Um deine App zu sehen, öffne `http://localhost:3000/`. Wenn du bereit für den Einsatz in der Produktion bist, erstelle mit yarn build ein minifiziertes Bundle. Eine einfache Möglichkeit, dies zu hosten, wäre [Netlify](https://www.netlify.com/). Du kannst ein GitHub-Repo erstellen, es zu Netlify hinzufügen, den Build-Befehl einrichten und schon bist du fertig! Deine App wird gehostet und ist für alle nutzbar. Und all das kostenlos. + +## Funktionen {#features} + +### React & create-react-app {#react--create-react-app} + +Zunächst einmal das Herzstück der App: React und all die zusätzlichen Funktionen, die mit _create-react-app_ kommen. Die alleinige Nutzung ist eine gute Option, wenn du Ethereum nicht integrieren möchtest. [React](https://react.dev/) selbst macht die Erstellung interaktiver UIs wirklich einfach. Es mag nicht so einsteigerfreundlich sein wie [Vue](https://vuejs.org/), aber es wird immer noch am häufigsten verwendet, hat mehr Funktionen und, was am wichtigsten ist, es stehen Tausende von zusätzlichen Bibliotheken zur Auswahl. Die _create-react-app_ macht den Einstieg ebenfalls sehr einfach und umfasst: + +- Unterstützung für React-, JSX-, ES6-, TypeScript- und Flow-Syntax. +- Spracherweiterungen über ES6 hinaus, wie der Object-Spread-Operator. +- CSS mit automatischen Präfixen, sodass du keine -webkit- oder andere Präfixe benötigst. +- Ein schneller, interaktiver Unit-Test-Runner mit integrierter Unterstützung für Coverage-Reporting. +- Ein Live-Entwicklungsserver, der vor häufigen Fehlern warnt. +- Ein Build-Skript zum Bündeln von JS, CSS und Bildern für die Produktion, mit Hashes und Sourcemaps. + +Die _create-eth-app_ macht insbesondere von den neuen [Hooks-Effekten](https://legacy.reactjs.org/docs/hooks-effect.html) Gebrauch. Eine Methode, um leistungsstarke und dennoch sehr kleine sogenannte funktionale Komponenten zu schreiben. Wie sie in _create-eth-app_ verwendet werden, steht im folgenden Abschnitt über Apollo. + +### Yarn Workspaces {#yarn-workspaces} + +[Yarn Workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) ermöglichen es, mehrere Pakete zu haben, diese aber alle vom Stammverzeichnis aus zu verwalten und die Abhängigkeiten für alle auf einmal mit `yarn install` zu installieren. Dies ist vor allem bei kleineren Zusatzpaketen wie dem Management von Smart-Contract-Adressen/ABIs (die Information darüber, wo man welche Smart Contracts eingesetzt hat und wie man mit ihnen kommuniziert) oder der Graph-Integration sinnvoll, die beide Teil von `create-eth-app` sind. + +### ethers.js {#ethersjs} + +Obwohl [Web3](https://docs.web3js.org/) immer noch am häufigsten verwendet wird, hat [ethers.js](https://docs.ethers.io/) im letzten Jahr als Alternative viel Anklang gefunden und ist in _create-eth-app_ integriert. Du kannst damit arbeiten, zu Web3 wechseln oder ein Upgrade auf [ethers.js v5](https://docs.ethers.org/v5/) in Erwägung ziehen, das fast die Beta-Phase abgeschlossen hat. + +### The Graph {#the-graph} + +[GraphQL](https://graphql.org/) ist im Vergleich zu einer [RESTful-API](https://restfulapi.net/) eine alternative Methode für den Umgang mit Daten. Sie haben mehrere Vorteile gegenüber RESTful-APIs, insbesondere für dezentrale Blockchain-Daten. Wenn du an der Begründung dafür interessiert bist, schau dir [GraphQL Will Power the Decentralized Web](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a) an. + +Normalerweise würdest du Daten direkt von deinem Smart Contract abrufen. Willst du die Zeit des letzten Handels auslesen? Rufe einfach `MyContract.methods.latestTradeTime().call()` auf, was die Daten von einem Ethereum-Node in deine Dapp holt. Aber was ist, wenn du Hunderte verschiedener Datenpunkte benötigst? Das würde zu Hunderten von Datenabrufen beim Node führen, die jedes Mal eine [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) erfordern, was deine Dapp langsam und ineffizient machen würde. Eine Problemumgehung könnte eine Abruffunktion in deinem Contract sein, die mehrere Daten auf einmal zurückgibt. Das ist aber nicht immer ideal. + +Und dann bist du vielleicht auch an historischen Daten interessiert. Du willst nicht nur die Zeit des letzten Handels wissen, sondern die Zeiten aller Handelsgeschäfte, die du jemals selbst getätigt hast. Verwende das Subgraph-Paket von _create-eth-app_, lies die [Dokumentation](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) und passe es an deine eigenen Contracts an. Wenn du nach beliebten Smart Contracts suchst, gibt es möglicherweise sogar bereits einen Subgraph. Sieh dir den [Subgraph-Explorer](https://thegraph.com/explorer/) an. + +Sobald du einen Subgraph hast, kannst du eine einfache Abfrage in deiner Dapp schreiben, die alle wichtigen Blockchain-Daten, einschließlich historischer Daten, die du benötigst, abruft; dafür ist nur ein Abruf erforderlich. + +### Apollo {#apollo} + +Dank der [Apollo Boost](https://www.apollographql.com/docs/react/get-started/)-Integration kannst du den Graphen einfach in deine React-Dapp integrieren. Besonders bei der Verwendung von React Hooks und Apollo ist das Abrufen von Daten so einfach wie das Schreiben einer einzigen GraphQL-Abfrage in deiner Komponente: + +```js +const { loading, error, data } = useQuery(myGraphQlQuery) + +React.useEffect(() => { + if (!loading && !error && data) { + console.log({ data }) + } +}, [loading, error, data]) +``` + +## Vorlagen {#templates} + +Darüber hinaus kannst du aus verschiedenen Vorlagen wählen. Bisher kannst du eine Aave-, Compound-, UniSwap- oder Sablier-Integration verwenden. Sie alle fügen wichtige Smart-Contract-Adressen für Dienste zusammen mit vorgefertigten Subgraph-Integrationen hinzu. Füge einfach die Vorlage zum Erstellungsbefehl hinzu, wie `yarn create eth-app my-eth-app --with-template aave`. + +### Aave {#aave} + +[Aave](https://aave.com/) ist ein dezentraler Geldleihmarkt. Die Einleger stellen dem Markt Liquidität zur Verfügung, um passives Einkommen zu generieren, während Kreditnehmer sich mithilfe von Sicherheiten Geld leihen können. Eine einzigartige Funktion von Aave sind die [Flash Loans](https://aave.com/docs/developers/flash-loans), die es dir ermöglichen, Geld ohne jegliche Sicherheiten zu leihen, solange du das Darlehen innerhalb einer einzigen Transaktion zurückzahlst. Das kann zum Beispiel nützlich sein, um zusätzliches Geld für das Arbitrage-Trading zu erhalten. + +Gehandelte Token, die dir Zinsen einbringen, werden _aTokens_ genannt. + +Wenn du dich für die Integration von Aave mit _create-eth-app_ entscheidest, erhältst du eine [Subgraph-Integration](https://docs.aave.com/developers/getting-started/using-graphql). Aave verwendet The Graph und stellt dir bereits mehrere einsatzbereite Subgraphs auf [Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten) und [Mainnet](https://thegraph.com/explorer/subgraph/aave/protocol) in [roher](https://thegraph.com/explorer/subgraph/aave/protocol-raw) oder [formatierter](https://thegraph.com/explorer/subgraph/aave/protocol) Form zur Verfügung. + +![Aave Flash-Loan-Meme – „Yeahhh, wenn ich meinen Flash Loan länger als eine Transaktion behalten könnte, wäre das großartig“](./flashloan-meme.png) + +### Compound {#compound} + +[Compound](https://compound.finance/) ist ähnlich wie Aave. Die Integration enthält bereits den neuen [Compound v2 Subgraph](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195). Die zinsbringenden Token werden hier überraschenderweise _cTokens_ genannt. + +### Uniswap {#uniswap} + +[Uniswap](https://uniswap.exchange/) ist eine dezentralisierte Börse (DEX). Liquiditätsanbieter können Gebühren verdienen, indem sie die erforderlichen Token oder Ether für beide Seiten eines Handels bereitstellen. Es ist weit verbreitet und hat daher eine der höchsten Liquiditäten für eine sehr breite Palette von Token. Du kannst es einfach in deine Dapp integrieren, um beispielsweise Benutzern zu ermöglichen, ihre ETH gegen DAI zu tauschen. + +Leider ist die Integration zum Zeitpunkt der Erstellung dieses Artikels nur für Uniswap v1 und nicht für die [gerade veröffentlichte v2](https://uniswap.org/blog/uniswap-v2/) möglich. + +### Sablier {#sablier} + +[Sablier](https://sablier.com/) ermöglicht Benutzern das Streamen von Geldzahlungen. Anstelle eines einzelnen Zahltages erhältst du dein Geld nach der anfänglichen Einrichtung kontinuierlich und ohne weitere Verwaltung. Die Integration umfasst einen [eigenen Subgraph](https://thegraph.com/explorer/subgraph/sablierhq/sablier). + +## Was kommt als Nächstes? {#whats-next} + +Wenn du Fragen zu _create-eth-app_ hast, besuche den [Sablier Community-Server](https://discord.gg/bsS8T47), wo du mit den Autoren von _create-eth-app_ in Kontakt treten kannst. Als erste nächste Schritte könntest du ein UI-Framework wie [Material UI](https://mui.com/material-ui/) integrieren, GraphQL-Abfragen für die Daten schreiben, die du tatsächlich benötigst, und das Deployment einrichten. diff --git a/public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md b/public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md new file mode 100644 index 00000000000..8872be138ea --- /dev/null +++ b/public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md @@ -0,0 +1,269 @@ +--- +title: Grundlegende Ethereum-Themen mit SQL lernen +description: Dieses Tutorial hilft Lesern, grundlegende Ethereum-Konzepte wie Transaktionen, Blöcke und Gas zu verstehen, indem sie On-Chain-Daten mit der Structured Query Language (SQL) abfragen. +author: "Paul Apivat" +tags: [ "SQL", "Abfragen", "Transaktionen" ] +skill: beginner +lang: de +published: 2021-05-11 +source: paulapivat.com +sourceUrl: https://paulapivat.com/post/query_ethereum/ +--- + +Viele Ethereum-Tutorials richten sich an Entwickler, aber es mangelt an Lernressourcen für Datenanalysten oder für Leute, die On-Chain-Daten einsehen möchten, ohne einen Client oder einen Knoten zu betreiben. + +Dieses Tutorial hilft Lesern, grundlegende Ethereum-Konzepte wie Transaktionen, Blöcke und Gas zu verstehen, indem sie On-Chain-Daten mit der Structured Query Language (SQL) über eine von [Dune Analytics](https://dune.com/) bereitgestellte Schnittstelle abfragen. + +On-Chain-Daten können uns helfen, Ethereum, das Netzwerk und seine Wirtschaftlichkeit in Bezug auf die Rechenleistung zu verstehen. Sie sollten als Grundlage für das Verständnis der Herausforderungen dienen, mit denen Ethereum heute konfrontiert ist (z. B. steigende Gaspreise) und, was noch wichtiger ist, für Diskussionen über Skalierungslösungen. + +### Transaktionen {#transactions} + +Die Reise eines Nutzers auf Ethereum beginnt mit der Initialisierung eines nutzergesteuerten Kontos oder einer Entität mit einem ETH-Guthaben. Es gibt zwei Kontotypen – benutzergesteuert oder ein Smart Contract (siehe [ethereum.org](/developers/docs/accounts/)). + +Jedes Konto kann in einem Block-Explorer wie [Etherscan](https://etherscan.io/) oder [Blockscout](https://eth.blockscout.com/) eingesehen werden. Block-Explorer sind ein Portal zu den Daten von Ethereum. Sie zeigen in Echtzeit Daten zu Blöcken, Transaktionen, Minern, Konten und anderen On-Chain-Aktivitäten an (siehe [hier](/developers/docs/data-and-analytics/block-explorers/)). + +Ein Benutzer möchte die Daten jedoch möglicherweise direkt abfragen, um die von externen Block-Explorern bereitgestellten Informationen abzugleichen. [Dune Analytics](https://dune.com/) bietet diese Möglichkeit jedem, der über SQL-Kenntnisse verfügt. + +Als Referenz kann das Smart-Contract-Konto der Ethereum Foundation (EF) auf [Blockscout](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) eingesehen werden. + +Es ist zu beachten, dass alle Konten, einschließlich desjenigen der EF, eine öffentliche Adresse haben, die zum Senden und Empfangen von Transaktionen verwendet werden kann. + +Der Kontostand auf Etherscan umfasst reguläre Transaktionen und interne Transaktionen. Interne Transaktionen sind, trotz des Namens, keine _tatsächlichen_ Transaktionen, die den Zustand der Chain ändern. Es handelt sich um Wertübertragungen, die durch die Ausführung eines Vertrags initiiert werden ([Quelle](https://ethereum.stackexchange.com/questions/3417/how-to-get-contract-internal-transactions)). Da interne Transaktionen keine Signatur haben, sind sie **nicht** in der Blockchain enthalten und können nicht mit Dune Analytics abgefragt werden. + +Daher wird sich dieses Tutorial auf reguläre Transaktionen konzentrieren. Dies kann wie folgt abgefragt werden: + +```sql +WITH temp_table AS ( +SELECT + hash, + block_number, + block_time, + "from", + "to", + value / 1e18 AS ether, + gas_used, + gas_price / 1e9 AS gas_price_gwei +FROM ethereum."transactions" +WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' +ORDER BY block_time DESC +) +SELECT + hash, + block_number, + block_time, + "from", + "to", + ether, + (gas_used * gas_price_gwei) / 1e9 AS txn_fee +FROM temp_table +``` + +Dies liefert die gleichen Informationen wie auf der Transaktionsseite von Etherscan. Zum Vergleich, hier die beiden Quellen: + +#### Etherscan {#etherscan} + +![](./etherscan_view.png) + +[Vertragsseite der EF auf Blockscout.](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) + +#### Dune Analytics {#dune-analytics} + +![](./dune_view.png) + +Das Dashboard finden Sie [hier](https://dune.com/paulapivat/Learn-Ethereum). Klicken Sie auf die Tabelle, um die Abfrage zu sehen (siehe auch oben). + +### Transaktionen im Detail {#breaking_down_transactions} + +Eine übermittelte Transaktion enthält mehrere Informationen, darunter ([Quelle](/developers/docs/transactions/)): + +- **Empfänger**: Die Empfangsadresse (abgefragt als „to“) +- **Signatur**: Während die privaten Schlüssel eines Absenders eine Transaktion signieren, können wir mit SQL die öffentliche Adresse eines Absenders abfragen („from“). +- **Wert**: Dies ist der Betrag an transferiertem ETH (siehe Spalte `ether`). +- **Daten**: Das sind beliebige Daten, die gehasht wurden (siehe Spalte `data`) +- **gasLimit** – die maximale Menge an Gaseinheiten, die von der Transaktion verbraucht werden kann. Gaseinheiten stellen Rechenschritte dar. +- **maxPriorityFeePerGas** – die maximale Gasmenge, die als Trinkgeld für den Miner enthalten sein soll +- **maxFeePerGas** – die maximale Menge an Gas, die für die Transaktion gezahlt werden soll (einschließlich baseFeePerGas und maxPriorityFeePerGas) + +Wir können diese spezifischen Informationen für Transaktionen an die öffentliche Adresse der Ethereum Foundation abfragen: + +```sql +SELECT + "to", + "from", + value / 1e18 AS ether, + data, + gas_limit, + gas_price / 1e9 AS gas_price_gwei, + gas_used, + ROUND(((gas_used / gas_limit) * 100),2) AS gas_used_pct +FROM ethereum."transactions" +WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' +ORDER BY block_time DESC +``` + +### Blöcke {#blocks} + +Jede Transaktion ändert den Zustand der Ethereum Virtual Machine ([EVM](/developers/docs/evm/)) ([Quelle](/developers/docs/transactions/)). Transaktionen werden an das Netzwerk gesendet, um verifiziert und in einen Block aufgenommen zu werden. Jede Transaktion ist mit einer Blocknummer verknüpft. Um die Daten zu sehen, können wir eine bestimmte Blocknummer abfragen: 12396854 (der jüngste Block der Ethereum-Foundation-Transaktionen zum Zeitpunkt des Schreibens dieses Tutorials am 5.11.2021). + +Wenn wir die nächsten beiden Blöcke abfragen, können wir außerdem sehen, dass jeder Block den Hash des vorherigen Blocks (d. h. den übergeordneten Hash) enthält, was zeigt, wie die Blockchain aufgebaut ist. + +Jeder Block enthält einen Verweis auf seinen übergeordneten Block. Dies wird unten zwischen den Spalten `hash` und `parent_hash` gezeigt ([Quelle](/developers/docs/blocks/)): + +![parent_hash](./parent_hash.png) + +Hier ist die [Abfrage](https://dune.com/queries/44856/88292) auf Dune Analytics: + +```sql +SELECT + time, + number, + hash, + parent_hash, + nonce +FROM ethereum."blocks" +WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856 +LIMIT 10 +``` + +Wir können einen Block untersuchen, indem wir Zeit, Blocknummer, Schwierigkeitsgrad, Hash, übergeordneten Hash und die Nonce abfragen. + +Das Einzige, was diese Abfrage nicht abdeckt, ist die _Liste der Transaktionen_, die eine separate Abfrage unten erfordert, und der _State-Root_. Ein Full- oder Archiv-Node speichert alle Transaktionen und Zustandsübergänge, sodass Clients den Zustand der Chain jederzeit abfragen können. Da dies viel Speicherplatz erfordert, können wir Chain-Daten von Zustandsdaten trennen: + +- Chain-Daten (Liste von Blöcken, Transaktionen) +- Zustandsdaten (Ergebnis des Zustandsübergangs jeder Transaktion) + +Der State-Root fällt unter Letzteres und ist _implizite_ Daten (nicht on-chain gespeichert), während Chain-Daten explizit sind und auf der Chain selbst gespeichert werden ([Quelle](https://ethereum.stackexchange.com/questions/359/where-is-the-state-data-stored)). + +In diesem Tutorial konzentrieren wir uns auf On-Chain-Daten, die mit SQL über Dune Analytics abgefragt werden _können_. + +Wie oben erwähnt, enthält jeder Block eine Liste von Transaktionen. Wir können diese abfragen, indem wir nach einem bestimmten Block filtern. Wir versuchen es mit dem letzten Block, 12396854: + +```sql +SELECT * FROM ethereum."transactions" +WHERE block_number = 12396854 +ORDER BY block_time DESC` +``` + +Hier ist die SQL-Ausgabe auf Dune: + +![](./list_of_txn.png) + +Dieser einzelne Block, der der Chain hinzugefügt wird, ändert den Zustand der Ethereum Virtual Machine ([EVM](/developers/docs/evm/)). Dutzende, manchmal Hunderte von Transaktionen werden auf einmal verifiziert. In diesem speziellen Fall waren 222 Transaktionen enthalten. + +Um zu sehen, wie viele tatsächlich erfolgreich waren, fügen wir einen weiteren Filter hinzu, um erfolgreiche Transaktionen zu zählen: + +```sql +WITH temp_table AS ( + SELECT * FROM ethereum."transactions" + WHERE block_number = 12396854 AND success = true + ORDER BY block_time DESC +) +SELECT + COUNT(success) AS num_successful_txn +FROM temp_table +``` + +Für Block 12396854 wurden von insgesamt 222 Transaktionen 204 erfolgreich verifiziert: + +![](./successful_txn.png) + +Transaktionsanfragen kommen Dutzende Male pro Sekunde vor, aber Blöcke werden etwa alle 15 Sekunden committet ([Quelle](/developers/docs/blocks/)). + +Um zu sehen, dass ungefähr alle 15 Sekunden ein Block produziert wird, können wir die Anzahl der Sekunden pro Tag (86.400) durch 15 teilen, um eine geschätzte durchschnittliche Anzahl von Blöcken pro Tag (~ 5.760) zu erhalten. + +Das Diagramm der täglich erzeugten Ethereum-Blöcke (2016 – heute) ist: + +![](./daily_blocks.png) + +Die durchschnittliche Anzahl der in diesem Zeitraum täglich produzierten Blöcke beträgt ~5.874: + +![](./avg_daily_blocks.png) + +Die Abfragen lauten: + +```sql +# Abfrage zur Visualisierung der täglich produzierten Blöcke seit 2016 + +SELECT + DATE_TRUNC('day', time) AS dt, + COUNT(*) AS block_count +FROM ethereum."blocks" +GROUP BY dt +OFFSET 1 + +# durchschnittliche Anzahl der pro Tag produzierten Blöcke + +WITH temp_table AS ( +SELECT + DATE_TRUNC('day', time) AS dt, + COUNT(*) AS block_count +FROM ethereum."blocks" +GROUP BY dt +OFFSET 1 +) +SELECT + AVG(block_count) AS avg_block_count +FROM temp_table +``` + +Die durchschnittliche Anzahl der seit 2016 pro Tag produzierten Blöcke liegt mit 5.874 leicht über diesem Wert. Alternativ ergeben 86.400 Sekunden geteilt durch 5.874 durchschnittliche Blöcke 14,7 Sekunden oder ungefähr einen Block alle 15 Sekunden. + +### Gas {#gas} + +Blöcke sind in ihrer Größe begrenzt. Die maximale Blockgröße ist dynamisch und variiert je nach Netzwerknachfrage zwischen 12.500.000 und 25.000.000 Einheiten. Limits sind erforderlich, um zu verhindern, dass willkürlich große Blöcke die Full Nodes in Bezug auf Speicherplatz- und Geschwindigkeitsanforderungen belasten ([Quelle](/developers/docs/blocks/)). + +Eine Möglichkeit, sich das Block-Gaslimit vorzustellen, ist, es als das **Angebot** an verfügbarem Blockspace zu betrachten, in dem Transaktionen gebündelt werden. Das Block-Gaslimit kann von 2016 bis heute abgefragt und visualisiert werden: + +![](./avg_gas_limit.png) + +```sql +SELECT + DATE_TRUNC('day', time) AS dt, + AVG(gas_limit) AS avg_block_gas_limit +FROM ethereum."blocks" +GROUP BY dt +OFFSET 1 +``` + +Dann gibt es das tatsächlich täglich verwendete Gas, um für Berechnungen auf der Ethereum-Chain zu bezahlen (d. h. das Senden von Transaktionen, das Aufrufen eines Smart Contracts, das Prägen eines NFT). Dies ist die **Nachfrage** nach verfügbarem Ethereum-Blockspace: + +![](./daily_gas_used.png) + +```sql +SELECT + DATE_TRUNC('day', time) AS dt, + AVG(gas_used) AS avg_block_gas_used +FROM ethereum."blocks" +GROUP BY dt +OFFSET 1 +``` + +Wir können diese beiden Diagramme auch einander gegenüberstellen, um zu sehen, wie sich **Angebot und Nachfrage** beeinflussen: + +![gas_demand_supply](./gas_demand_supply.png) + +Daher können wir Gaspreise als eine Funktion der Nachfrage nach Ethereum-Blockspace bei gegebenem Angebot verstehen. + +Schließlich möchten wir vielleicht die durchschnittlichen täglichen Gaspreise für die Ethereum-Chain abfragen. Dies würde jedoch zu einer besonders langen Abfragezeit führen, also filtern wir unsere Abfrage auf die durchschnittliche Gasmenge, die von der Ethereum Foundation pro Transaktion bezahlt wird. + +![](./ef_daily_gas.png) + +Wir können die Gaspreise sehen, die über die Jahre für alle an die Adresse der Ethereum Foundation getätigten Transaktionen gezahlt wurden. Hier ist die Abfrage: + +```sql +SELECT + block_time, + gas_price / 1e9 AS gas_price_gwei, + value / 1e18 AS eth_sent +FROM ethereum."transactions" +WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' +ORDER BY block_time DESC +``` + +### Zusammenfassung {#summary} + +Mit diesem Tutorial verstehen wir grundlegende Ethereum-Konzepte und wie die Ethereum-Blockchain funktioniert, indem wir On-Chain-Daten abfragen und ein Gefühl für sie bekommen. + +Das Dashboard mit dem gesamten in diesem Tutorial verwendeten Code finden Sie [hier](https://dune.com/paulapivat/Learn-Ethereum). + +Für weitere Datennutzung zur Erkundung von Web3 [finden Sie mich auf Twitter](https://twitter.com/paulapivat). diff --git a/public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md b/public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md new file mode 100644 index 00000000000..12a4ea98838 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md @@ -0,0 +1,68 @@ +--- +title: Protokollierung von Daten aus Smart Contracts mit Ereignissen +description: Eine Einführung in Smart-Contract-Ereignisse und wie Sie diese zur Datenprotokollierung verwenden können +author: "jdourlens" +tags: + [ + "intelligente Verträge", + "remix", + "solidity", + "ereignisse" + ] +skill: intermediate +lang: de +published: 2020-04-03 +source: EthereumDev +sourceUrl: https://ethereumdev.io/logging-data-with-events/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +In Solidity sind [Ereignisse](/developers/docs/smart-contracts/anatomy/#events-and-logs) Signale, die von Smart Contracts ausgegeben werden können. Dapps oder alles, was mit der JSON-RPC-API von Ethereum verbunden ist, können auf diese Ereignisse lauschen und entsprechend reagieren. Ein Ereignis kann auch indiziert werden, sodass der Ereignisverlauf später durchsuchbar ist. + +## Ereignisse {#events} + +Das häufigste Ereignis auf der Ethereum-Blockchain ist zum Zeitpunkt der Erstellung dieses Artikels das Transfer-Ereignis, das von ERC20-Tokens ausgegeben wird, wenn jemand Token überträgt. + +```solidity +event Transfer(address indexed from, address indexed to, uint256 value); +``` + +Die Ereignissignatur wird innerhalb des Vertragscodes deklariert und kann mit dem Schlüsselwort emit ausgegeben werden. Zum Beispiel protokolliert das Transfer-Ereignis, wer die Übertragung gesendet hat (_from_), an wen (_to_) und wie viele Token übertragen wurden (_value_). + +Wenn wir zu unserem Counter-Smart-Contract zurückkehren und beschließen, jedes Mal zu protokollieren, wenn der Wert geändert wird. Da dieser Vertrag nicht zur Bereitstellung gedacht ist, sondern als Grundlage für die Erstellung eines anderen Vertrags durch Erweiterung dient, wird er als abstrakter Vertrag bezeichnet. Im Fall unseres Counter-Beispiels würde es so aussehen: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + event ValueChanged(uint oldValue, uint256 newValue); + + // Private Variable vom Typ unsigned int zur Speicherung der Anzahl der Zählungen + uint256 private count = 0; + + // Funktion, die unseren Zähler inkrementiert + function increment() public { + count += 1; + emit ValueChanged(count - 1, count); + } + + // Getter zum Abrufen des Zählwerts + function getCount() public view returns (uint256) { + return count; + } + +} +``` + +Beachten Sie Folgendes: + +- **Zeile 5**: Wir deklarieren unser Ereignis und was es enthält: den alten Wert und den neuen Wert. + +- **Zeile 13**: Wenn wir unsere Zählvariable inkrementieren, geben wir das Ereignis aus. + +Wenn wir nun den Vertrag bereitstellen und die increment-Funktion aufrufen, sehen wir, dass Remix es automatisch anzeigt, wenn Sie auf die neue Transaktion in einem Array namens logs klicken. + +![Remix-Screenshot](./remix-screenshot.png) + +Logs sind sehr nützlich für das Debugging Ihrer Smart Contracts, aber sie sind auch wichtig, wenn Sie Anwendungen erstellen, die von verschiedenen Personen genutzt werden. Sie erleichtern die Analyse, um zu verfolgen und zu verstehen, wie Ihr Smart Contract genutzt wird. Die durch Transaktionen erzeugten Logs werden in gängigen Block-Explorern angezeigt und Sie können sie beispielsweise auch verwenden, um Off-Chain-Skripte zu erstellen, die auf bestimmte Ereignisse lauschen und bei deren Auftreten Maßnahmen ergreifen. diff --git a/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md b/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md new file mode 100644 index 00000000000..a592da5e65d --- /dev/null +++ b/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md @@ -0,0 +1,249 @@ +--- +title: Merkle-Beweise für Offline Datenintegrität +description: Sicherstellung der Datenintegrität onchain für Daten, die größtenteils offchain gespeichert sind +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +tags: [ "Speicher" ] +skill: advanced +lang: de +published: 2021-12-30 +--- + +## Einführung {#introduction} + +Idealerweise möchten wir alles in einem Ethereum Speicher ablegen, der auf Tausenden von Computern gespeichert ist und eine extrem hohe Verfügbarkeit (die Daten können nicht zensiert werden) und Integrität (die Daten können nicht unbefugt verändert werden) aufweist, aber die Speicherung eines 32-Byte-Wortes kostet normalerweise 20.000 Gas. Während ich das schreibe, entsprechen +diese Kosten 6,60 USD. Mit 21 Cent pro Byte ist das für viele Anwendungen zu teuer. + +Um dieses Problem zu lösen, hat das Ethereum-Ökosystem viele alternative Wege entwickelt, um Daten dezentral +zu speichern. In der Regel muss dabei ein Kompromiss zwischen Verfügbarkeit und Preis eingegangen werden. Die Integrität ist jedoch in der Regel gewährleistet. + +In diesem Artikel erfahren Sie, **wie** Sie die Datenintegrität gewährleisten, ohne die Daten auf der Blockchain zu speichern, indem Sie +[Merkle-Beweise](https://computersciencewiki.org/index.php/Merkle_proof) verwenden. + +## Wie funktioniert das? {#how-does-it-work} + +Theoretisch könnten wir einfach den Hash der Daten onchain speichern und alle Daten in Transaktionen senden, die sie benötigen. Allerdings ist das immer noch zu teuer. Ein Byte Daten zu einer Transaktion kostet etwa 16 Gas, derzeit etwa einen halben Cent, oder etwa 5 USD pro Kilobyte. Mit 5000 USD pro Megabyte ist dies für viele Anwendungen immer noch zu teuer, selbst ohne die zusätzlichen Kosten für das Hashing der Daten. + +Die Lösung ist, verschiedene Teilmengen der Daten wiederholt zu hashen, so dass Sie für die Daten, die Sie nicht zu senden brauchen, nur einen Hash senden können. Dazu verwenden Sie einen Merkle Tree, eine Baum Datenstruktur, bei der jeder Knoten ein Hash der darunter liegenden Knoten ist: + +![Merkle-Baum](tree.png) + +Der Root-Hash ist der einzige Teil, der onchain gespeichert werden muss. Um einen bestimmten Wert zu beweisen, geben Sie alle Hashes an, die damit kombiniert werden müssen, um die Wurzel (Hash-Root) zu erhalten. Um zum Beispiel `C` zu beweisen, stellen Sie `D`, `H(A-B)` und `H(E-H)` zur Verfügung. + +![Beweis für den Wert von C](proof-c.png) + +## Implementierung {#implementation} + +[Der Beispielcode wird hier zur Verfügung gestellt](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity). + +### Offchain-Code {#offchain-code} + +In diesem Artikel verwenden wir JavaScript für die Offchain-Berechnungen. Die meisten dezentralisierten Anwendungen haben ihre Offchain-Komponente in JavaScript. + +#### Erstellen der Merkle-Root {#creating-the-merkle-root} + +Als erstes müssen wir die Merkle-Wurzel für die Chain bereitstellen. + +```javascript +const ethers = require("ethers") +``` + +[Wir verwenden die Hash-Funktion aus dem Ethers-Paket](https://docs.ethers.io/v5/api/utils/hashing/#utils-keccak256). + +```javascript +// Die Rohdaten, deren Integrität wir überprüfen müssen. Die ersten beiden Bytes +// sind eine Benutzerkennung, und die letzten beiden Bytes sind die Menge der Tokens, die +// der Benutzer derzeit besitzt. +const dataArray = [ + 0x0bad0010, 0x60a70020, 0xbeef0030, 0xdead0040, 0xca110050, 0x0e660060, + 0xface0070, 0xbad00080, 0x060d0091, +] +``` + +Die Kodierung jedes Eintrags in eine einzelne 256-Bit-Integerzahl führt zu weniger lesbarem Code als z. B. die Verwendung von JSON. Allerdings bedeutet dies einen deutlich geringeren Verarbeitungsaufwand für die Abfrage der Vertragsdaten und damit deutlich niedrigere Gaskosten. [Man kann JSON onchain lesen](https://github.com/chrisdotn/jsmnSol), es ist nur eine schlechte Idee, wenn es vermeidbar ist. + +```javascript +// Das Array der Hash-Werte als BigInts +const hashArray = dataArray +``` + +In diesem Fall handelt es sich bei unseren Daten um 256 Bit-Werte, so dass keine Verarbeitung erforderlich ist. Wenn wir eine kompliziertere Datenstruktur verwenden, wie z. B. Strings, müssen wir sicherstellen, dass wir die Daten zuerst hashen, um ein Array von Hashes zu erhalten. Das liegt auch daran, weil es uns nicht interessiert, ob Benutzer die Informationen anderer Benutzer kennen. Andernfalls hätten wir einen Hash verwenden müssen, damit Benutzer 1 den Wert für Benutzer 0 nicht kennt, Benutzer 2 den Wert für Benutzer 3 nicht kennt usw. + +```javascript +// Konvertieren zwischen dem String, den die Hash-Funktion erwartet, und dem +// BigInt, das wir überall sonst verwenden. +const hash = (x) => + BigInt(ethers.utils.keccak256("0x" + x.toString(16).padStart(64, 0))) +``` + +Die Ethers-Hash-Funktion erwartet einen JavaScript-String mit einer hexadezimalen Zahl, wie z. B. `0x60A7`, und gibt einen anderen String mit der gleichen Struktur zurück. Für den Rest des Codes ist es jedoch einfacher, `BigInt` zu verwenden, also konvertieren wir es in einen hexadezimalen String und wieder zurück. + +```javascript +// Symmetrischer Hash eines Paares, sodass die umgekehrte Reihenfolge keine Rolle spielt. +const pairHash = (a, b) => hash(hash(a) ^ hash(b)) +``` + +Diese Funktion ist symmetrisch (Hash von a [xor](https://en.wikipedia.org/wiki/Exclusive_or) b). Das bedeutet, dass wir uns bei der Überprüfung des Merkle-Beweises keine Gedanken darüber machen müssen, ob wir den Wert aus dem Beweis vor oder nach dem berechneten Wert setzen sollen. Die Überprüfung von Merkle-Beweisen wird onchain durchgeführt. Je weniger wir dort tun müssen, desto besser. + +Warnung: +Kryptographie ist schwieriger als es aussieht. +Die ursprüngliche Version dieses Artikels hatte die Hash-Funktion `hash(a^b)`. +Das war eine **schlechte** Idee, denn es bedeutete, dass man, wenn man die legitimen Werte von `a` und `b` kannte, `b' = a^b^a'` verwenden konnte, um einen beliebigen `a'`-Wert zu beweisen. +Mit dieser Funktion müsste man `b'` so berechnen, dass `hash(a') ^ hash(b')` gleich einem bekannten Wert ist (der nächste Zweig auf dem Weg zur Root), was viel schwieriger ist. + +```javascript +// Der Wert, der anzeigt, dass ein bestimmter Zweig leer ist und keinen +// Wert hat +const empty = 0n +``` + +Wenn die Anzahl der Werte keine ganzzahlige Zweierpotenz ist, müssen wir leere Zweige behandeln. Bei diesem Programm wird die Null als Platzhalter eingesetzt. + +![Merkle-Baum mit fehlenden Zweigen](merkle-empty-hash.png) + +```javascript +// Berechnet eine Ebene im Baum eines Hash-Arrays, indem der Hash +// jedes Paares in der Sequenz genommen wird +const oneLevelUp = (inputArray) => { + var result = [] + var inp = [...inputArray] // Um das Überschreiben der Eingabe zu vermeiden // Fügt bei Bedarf einen leeren Wert hinzu (wir benötigen alle Blätter // als Paare) + + if (inp.length % 2 === 1) inp.push(empty) + + for (var i = 0; i < inp.length; i += 2) + result.push(pairHash(inp[i], inp[i + 1])) + + return result +} // oneLevelUp +``` + +Diese Funktion "klettert" eine Ebene im Merkle-Baum hoch, indem sie die Wertepaare auf der aktuellen Ebene hasht. Beachten Sie, dass dies nicht die effizienteste Implementierung ist. Wir hätten das Kopieren der Eingabe vermeiden und einfach `hashEmpty` an der entsprechenden Stelle in der Schleife hinzufügen können, aber dieser Code ist auf Lesbarkeit optimiert. + +```javascript +const getMerkleRoot = (inputArray) => { + var result + + result = [...inputArray] // Klettere den Baum hinauf, bis es nur noch einen Wert gibt, das ist die // Root. // // Wenn eine Ebene eine ungerade Anzahl von Einträgen hat, fügt der // Code in oneLevelUp einen leeren Wert hinzu. Wenn wir also zum Beispiel // 10 Blätter haben, haben wir 5 Zweige in der zweiten Ebene, 3 // Zweige in der dritten, 2 in der vierten und die Root ist die fünfte + + while (result.length > 1) result = oneLevelUp(result) + + return result[0] +} +``` + +Um die Wurzel zu bekommen, mache so lange, bis nur noch ein Wert übrig ist. + +#### Erstellen eines Merkle-Beweises {#creating-a-merkle-proof} + +Ein Merkle-Beweis besteht aus den Werten, die zusammen mit dem zu beweisenden Wert gehasht werden müssen, um die Merkle-Wurzel zu erhalten. Der zu beweisende Wert ist oft aus anderen Daten verfügbar, daher ziehe ich es vor, ihn separat und nicht als Teil des Codes bereitzustellen. + +```javascript +// Ein Merkle-Beweis besteht aus dem Wert der Liste der Einträge, mit denen +// gehasht werden soll. Da wir eine symmetrische Hash-Funktion verwenden, benötigen wir +// den Speicherort des Elements nicht, um den Beweis zu verifizieren, sondern nur, um ihn zu erstellen +const getMerkleProof = (inputArray, n) => { +    var result = [], currentLayer = [...inputArray], currentN = n + +    // Bis wir die Spitze erreichen +    while (currentLayer.length > 1) { +        // Keine Ebenen mit ungerader Länge +        if (currentLayer.length % 2) +            currentLayer.push(empty) + +        result.push(currentN % 2 +               // Wenn currentN ungerade ist, füge den Wert davor zum Beweis hinzu +            ? currentLayer[currentN-1] +               // Wenn es gerade ist, füge den Wert danach hinzu +            : currentLayer[currentN+1]) + +``` + +Wir hashen `(v[0],v[1])`, `(v[2],v[3])` usw. Für gerade Werte benötigen wir also den nächsten, für ungerade Werte den vorherigen Wert. + +```javascript +        // Auf die nächste Ebene aufsteigen +        currentN = Math.floor(currentN/2) +        currentLayer = oneLevelUp(currentLayer) +    }   // while currentLayer.length > 1 + +    return result +}   // getMerkleProof +``` + +### Onchain-Code {#onchain-code} + +Schließlich haben wir den Code, der den Beweis überprüft. Der Onchain-Code ist in [Solidity](https://docs.soliditylang.org/en/v0.8.11/) geschrieben. Die Optimierung ist hier sehr viel wichtiger, weil Gas relativ teuer ist. + +```solidity +//SPDX-License-Identifier: Public Domain +pragma solidity ^0.8.0; + +import "hardhat/console.sol"; +``` + +Ich habe dies mit der [Hardhat-Entwicklungsumgebung](https://hardhat.org/) geschrieben, die es uns ermöglicht, während der Entwicklung [Konsolenausgaben von Solidity](https://hardhat.org/docs/cookbook/debug-logs) zu haben. + +```solidity + +contract MerkleProof { +    uint merkleRoot; + +    function getRoot() public view returns (uint) { +      return merkleRoot; +    } + +    // Äußerst unsicher, im Produktionscode muss der Zugriff auf +    // diese Funktion STRENG limitiert sein, wahrscheinlich auf einen +    // Besitzer +    function setRoot(uint _merkleRoot) external { +      merkleRoot = _merkleRoot; +    }   // setRoot +``` + +Set- und Get-Funktionen für die Merkle-Wurzel. Jeden die Merkle-Root aktualisieren zu lassen, ist eine _extrem schlechte Idee_ in einem Produktionssystem. Ich tue es hier der Einfachheit halber für den Beispielcode. **Tun Sie das nicht auf einem System, bei dem die Datenintegrität wirklich wichtig ist**. + +```solidity +    function hash(uint _a) internal pure returns(uint) { +      return uint(keccak256(abi.encode(_a))); +    } + +    function pairHash(uint _a, uint _b) internal pure returns(uint) { +      return hash(hash(_a) ^ hash(_b)); +    } +``` + +Diese Funktion erzeugt einen Paar-Hash. Es ist nur die Solidity-Übersetzung des JavaScript-Codes für `hash` und `pairHash`. + +**Hinweis:** Dies ist ein weiterer Fall der Optimierung auf Lesbarkeit. Basierend auf [der Funktionsdefinition](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm) wäre es möglich, die Daten als [`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays)-Wert zu speichern und die Konvertierungen zu vermeiden. + +```solidity +    // Überprüfen eines Merkle-Beweises +    function verifyProof(uint _value, uint[] calldata _proof) +        public view returns (bool) { +      uint temp = _value; +      uint i; + +      for(i=0; i<_proof.length; i++) { +        temp = pairHash(temp, _proof[i]); +      } + +      return temp == merkleRoot; +    } + +}  // MarkleProof +``` + +In mathematischer Notation sieht die Verifizierung eines Merkle-Beweises so aus: `H(proof_n, H(proof_n-1, H(proof_n-2, ...` H(proof_1, H(proof_0, value))...)))\`. Dieser Code implementiert sie. + +## Merkle-Beweise und Rollups vertragen sich nicht {#merkle-proofs-and-rollups} + +Merkle-Beweise funktionieren nicht gut mit [Rollups](/developers/docs/scaling/#rollups). Der Grund dafür ist, dass Rollups alle Transaktionsdaten auf L1 schreiben, aber auf L2 verarbeiten. Die Kosten für die Übermittlung eines Merkle-Beweises mit einer Transaktion belaufen sich auf durchschnittlich 638 Gas pro Ebene (derzeit kostet ein Byte in Call Data 16 Gas, wenn es nicht Null ist, und 4, wenn es Null ist). Bei einer Datenmenge von 1024 Wörtern sind für einen Merkle-Beweis zehn Ebenen erforderlich, also insgesamt 6380 Gas. + +Wenn man sich zum Beispiel [Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m) ansieht, kostet das Schreiben von L1-Gas etwa 100 Gwei und L2-Gas 0,001 Gwei (das ist der normale Preis, er kann bei Überlastung steigen). Für die Kosten von einem L1 Gas können wir also hunderttausend Gas für die L2 Verarbeitung ausgeben. Wenn wir davon ausgehen, dass wir den Speicher nicht überschreiben, bedeutet das, dass wir für den Preis von einem L1 Gas etwa fünf Wörter in den L2 Speicher schreiben können. Für einen einzelnen Merkle-Beweis können wir die gesamten 1024 Wörter in den Speicher schreiben (vorausgesetzt, sie können von Anfang an onchain berechnet werden, anstatt in einer Transaktion bereitgestellt zu werden) und haben immer noch den größten Teil des Gases übrig. + +## Fazit {#conclusion} + +Im echten Leben werden Sie Merkle-Bäume vielleicht nie selbst implementieren. Es gibt bekannte und geprüfte Bibliotheken, die Sie verwenden können, wobei es im Allgemeinen nicht ratsam ist, kryptographische Primitive selbst zu implementieren. Aber ich hoffe, dass Sie jetzt die Merkle-Beweise besser verstehen und entscheiden können, wann es sich lohnt, sie einzusetzen. + +Beachten Sie, dass Merkle-Beweise zwar die _Integrität_, nicht aber die _Verfügbarkeit_ erhalten. Zu wissen, dass niemand sonst Ihre Assets nehmen kann, ist ein schwacher Trost, wenn der Datenspeicher beschließt, den Zugriff zu verweigern, und Sie auch keinen Merkle-Baum erstellen können, um darauf zuzugreifen. Merkle-Bäume werden daher am besten mit einer Art dezentralem Speicher wie IPFS verwendet. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). diff --git a/public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md b/public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md new file mode 100644 index 00000000000..7f1a167d61d --- /dev/null +++ b/public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md @@ -0,0 +1,151 @@ +--- +title: Überwachung von Geth mit InfluxDB und Grafana +description: Richten Sie die Überwachung für Ihren Geth-Node mit InfluxDB und Grafana ein, um die Leistung zu verfolgen und Probleme zu identifizieren. +author: "Mario Havel" +tags: [ "Clients", "Nodes" ] +skill: intermediate +lang: de +published: 2021-01-13 +--- + +Dieses Tutorial hilft Ihnen dabei, die Überwachung für Ihren Geth-Node einzurichten, damit Sie dessen Leistung besser verstehen und potenzielle Probleme erkennen können. + +## Voraussetzungen {#prerequisites} + +- Sie sollten bereits eine Instanz von Geth ausführen. +- Die meisten Schritte und Beispiele sind für eine Linux-Umgebung, grundlegende Terminalkenntnisse sind dabei hilfreich. +- Sehen Sie sich diesen Videoüberblick über die Metrik-Suite von Geth an: [Monitoring an Ethereum infrastructure by Péter Szilágyi](https://www.youtube.com/watch?v=cOBab8IJMYI). + +## Überwachungs-Stack {#monitoring-stack} + +Ein Ethereum-Client sammelt eine Menge Daten, die in Form einer chronologischen Datenbank gelesen werden können. Um die Überwachung zu erleichtern, können Sie diese in eine Datenvisualisierungssoftware einspeisen. Es gibt mehrere verfügbare Optionen: + +- [Prometheus](https://prometheus.io/) (Pull-Modell) +- [InfluxDB](https://www.influxdata.com/get-influxdb/) (Push-Modell) +- [Telegraf](https://www.influxdata.com/get-influxdb/) +- [Grafana](https://www.grafana.com/) +- [Datadog](https://www.datadoghq.com/) +- [Chronograf](https://www.influxdata.com/time-series-platform/chronograf/) + +Es gibt auch [Geth Prometheus Exporter](https://github.com/hunterlong/gethexporter), eine mit InfluxDB und Grafana vorkonfigurierte Option. + +In diesem Tutorial richten wir Ihren Geth-Client ein, um Daten an InfluxDB zur Erstellung einer Datenbank zu senden und mit Grafana eine Diagrammvisualisierung der Daten zu erstellen. Die manuelle Durchführung wird Ihnen helfen, den Prozess besser zu verstehen, ihn zu ändern und in verschiedenen Umgebungen bereitzustellen. + +## Einrichten von InfluxDB {#setting-up-influxdb} + +Lassen Sie uns zunächst InfluxDB herunterladen und installieren. Verschiedene Download-Optionen finden Sie auf der [Influxdata-Release-Seite](https://portal.influxdata.com/downloads/). Wählen Sie die für Ihre Umgebung passende aus. +Sie können es auch aus einem [Repository](https://repos.influxdata.com/) installieren. Zum Beispiel in einer Debian-basierten Distribution: + +``` +curl -tlsv1.3 --proto =https -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add +source /etc/lsb-release +echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list +sudo apt update +sudo apt install influxdb -y +sudo systemctl enable influxdb +sudo systemctl start influxdb +sudo apt install influxdb-client +``` + +Nach der erfolgreichen Installation von InfluxDB, stellen Sie sicher, dass es im Hintergrund läuft. Standardmäßig ist es unter `localhost:8086` erreichbar. +Bevor Sie den `Influx`-Client verwenden, müssen Sie einen neuen Benutzer mit Administratorrechten erstellen. Dieser Benutzer dient der übergeordneten Verwaltung, der Erstellung von Datenbanken und Benutzern. + +``` +curl -XPOST "http://localhost:8086/query" --data-urlencode "q=CREATE USER username WITH PASSWORD 'password' WITH ALL PRIVILEGES" +``` + +Jetzt können Sie den Influx-Client verwenden, um mit diesem Benutzer die [InfluxDB-Shell](https://docs.influxdata.com/influxdb/v1.8/tools/shell/) zu betreten. + +``` +influx -username 'username' -password 'password' +``` + +Indem Sie direkt mit InfluxDB in seiner Shell kommunizieren, können Sie eine Datenbank und einen Benutzer für Geth-Metriken erstellen. + +``` +create database geth +create user geth with password choosepassword +``` + +Überprüfen Sie die erstellten Einträge mit: + +``` +show databases +show users +``` + +Verlassen Sie die InfluxDB-Shell. + +``` +exit +``` + +InfluxDB läuft und ist konfiguriert, um Metriken von Geth zu speichern. + +## Geth vorbereiten {#preparing-geth} + +Nachdem die Datenbank eingerichtet ist, müssen wir die Metrikerfassung in Geth aktivieren. Achten Sie auf `METRICS AND STATS OPTIONS` in `geth --help`. Dort finden Sie mehrere Optionen, in diesem Fall möchten wir, dass Geth Daten in InfluxDB pusht. +Die Grundeinrichtung gibt den Endpunkt an, an dem InfluxDB erreichbar ist, und die Authentifizierung für die Datenbank. + +``` +geth --metrics --metrics.influxdb --metrics.influxdb.endpoint "http://0.0.0.0:8086" --metrics.influxdb.username "geth" --metrics.influxdb.password "chosenpassword" +``` + +Diese Flags können an einen Befehl zum Starten des Clients angehängt oder in der Konfigurationsdatei gespeichert werden. + +Sie können überprüfen, ob Geth erfolgreich Daten pusht, indem Sie zum Beispiel die Metriken in der Datenbank auflisten. In der InfluxDB-Shell: + +``` +use geth +show measurements +``` + +## Einrichten von Grafana {#setting-up-grafana} + +Der nächste Schritt ist die Installation von Grafana, das die Daten grafisch interpretieren wird. Folgen Sie dem Installationsprozess für Ihre Umgebung in der Grafana-Dokumentation. Stellen Sie sicher, dass Sie die OSS-Version installieren, wenn nicht anders gewünscht. +Beispielhafte Installationsschritte für Debian-Distributionen unter Verwendung des Repositorys: + +``` +curl -tlsv1.3 --proto =https -sL https://packages.grafana.com/gpg.key | sudo apt-key add - +echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list +sudo apt update +sudo apt install grafana +sudo systemctl enable grafana-server +sudo systemctl start grafana-server +``` + +Wenn Grafana läuft, sollte es unter `localhost:3000` erreichbar sein. +Verwenden Sie Ihren bevorzugten Browser, um auf diesen Pfad zuzugreifen, und melden Sie sich dann mit den Standard-Anmeldeinformationen an (Benutzer: `admin` und Passwort: `admin`). Wenn Sie dazu aufgefordert werden, ändern Sie das Standardpasswort und speichern Sie es. + +![](./grafana1.png) + +Sie werden zur Grafana-Startseite weitergeleitet. Richten Sie zunächst Ihre Quelldaten ein. Klicken Sie auf das Konfigurationssymbol in der linken Leiste und wählen Sie "Datenquellen" aus. + +![](./grafana2.png) + +Es sind noch keine Datenquellen erstellt worden. Klicken Sie auf "Datenquelle hinzufügen", um eine zu definieren. + +![](./grafana3.png) + +Wählen Sie für dieses Setup "InfluxDB" aus und fahren Sie fort. + +![](./grafana4.png) + +Die Konfiguration der Datenquelle ist ziemlich einfach, wenn Sie die Tools auf demselben Rechner ausführen. Sie müssen die InfluxDB-Adresse und die Details für den Zugriff auf die Datenbank festlegen. Beachten Sie die Abbildung unten. + +![](./grafana5.png) + +Wenn alles vollständig ist und InfluxDB erreichbar ist, klicken Sie auf "Speichern und testen" und warten Sie, bis die Bestätigung erscheint. + +![](./grafana6.png) + +Grafana ist jetzt so eingerichtet, dass es Daten aus InfluxDB lesen kann. Jetzt müssen Sie ein Dashboard erstellen, das sie interpretiert und anzeigt. Dashboard-Eigenschaften sind in JSON-Dateien kodiert, die von jedermann erstellt und einfach importiert werden können. Klicken Sie in der linken Leiste auf "Erstellen und Importieren". + +![](./grafana7.png) + +Für ein Geth-Überwachungs-Dashboard kopieren Sie die ID von [diesem Dashboard](https://grafana.com/grafana/dashboards/13877/) und fügen Sie sie auf der "Importseite" in Grafana ein. Nach dem Speichern des Dashboards sollte es so aussehen: + +![](./grafana8.png) + +Sie können Ihre Dashboards ändern. Jedes Panel kann bearbeitet, verschoben, entfernt oder hinzugefügt werden. Sie können Ihre Konfigurationen ändern. Es liegt ganz bei Ihnen! Um mehr darüber zu erfahren, wie Dashboards funktionieren, lesen Sie die [Dokumentation von Grafana](https://grafana.com/docs/grafana/latest/dashboards/). +Sie könnten auch an [Alerting](https://grafana.com/docs/grafana/latest/alerting/) interessiert sein. Damit können Sie Warnmeldungen für den Fall einrichten, dass Metriken bestimmte Werte erreichen. Verschiedene Kommunikationskanäle werden unterstützt. diff --git a/public/content/translations/de/developers/tutorials/nft-minter/index.md b/public/content/translations/de/developers/tutorials/nft-minter/index.md new file mode 100644 index 00000000000..639817b074a --- /dev/null +++ b/public/content/translations/de/developers/tutorials/nft-minter/index.md @@ -0,0 +1,876 @@ +--- +title: NFT-Minter Tutorial +description: In diesem Tutorial erstellst du einen NFT-Minter und lernst, wie man eine Full-Stack-Dapp erstellt, indem du deinen Smart Contract mit einem React-Frontend unter Verwendung von MetaMask und Web3-Tools verbindest. +author: "smudgil" +tags: + [ + "solidity", + "NFT", + "Alchemy", + "Smart Contracts", + "Frontend", + "Pinata" + ] +skill: intermediate +lang: de +published: 2021-10-06 +--- + +Eine der größten Herausforderungen für Entwickler mit einem Web2-Hintergrund ist herauszufinden, wie sie ihren Smart Contract mit einem Frontend Projekt verbinden und mit ihm interagieren können. + +Durch den Bau eines NFT-Minters - eine einfache Benutzeroberfläche, auf welcher ein Link den Nutzer zu seinen digitalen Vermögenswerten führt, ein Titel und eine Beschreibung - werden Sie Folgendes lernen: + +- Verbinden von MetaMask mit Ihrem Frontend-Projekt +- Rufen von Smart-Contract Methoden von Ihrem Frontend +- Transaktionen mit MetaMask signieren + +In diesem Tutorial werden wir [React](https://react.dev/) als unser Frontend-Framework verwenden. Da sich dieses Tutorial in erster Linie auf die Web3-Entwicklung konzentriert, werden wir nicht viel Zeit darauf verwenden, die React Grundlagen zu behandeln. Stattdessen konzentrieren wir uns darauf, Funktionalität in unser Projekt zu bringen. + +Als Voraussetzung solltest du ein grundlegendes Verständnis von React haben – du solltest wissen, wie Komponenten, Props, useState/useEffect und grundlegende Funktionsaufrufe funktionieren. Wenn du noch nie von diesen Begriffen gehört hast, solltest du dir dieses [Einführungstutorial zu React](https://react.dev/learn/tutorial-tic-tac-toe) ansehen. Für diejenigen, die eher visuell lernen, empfehlen wir diese ausgezeichnete Videoreihe [Full Modern React Tutorial](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d) von Net Ninja. + +Und wenn Sie sich noch nicht angemeldet haben, dann benötigen Sie auf jeden Fall einen Alchemy Account, um dieses Tutorial zu beenden und um etwas auf der Blockchain bauen zu können. Registriere dich [hier](https://alchemy.com/) für ein kostenloses Konto. + +Lass uns ohne weiteres starten! + +## NFTs erstellen 101 {#making-nfts-101} + +Bevor wir uns überhaupt einen Code anschauen, ist es wichtig zu verstehen, wie das erstellen von NFTs überhaupt funktioniert. Es benötigt dafür zwei Schritte: + +### Einen NFT-Smart-Contract auf der Ethereum-Blockchain veröffentlichen {#publish-nft} + +Der größte Unterschied zwischen den beiden NFT smart Kontrakt Standards ist, dass der ERC-1155 ein Multi-Token Standard ist und eine Handvoll Funktionalitäten beinhaltet, wobei man mit dem ERC-721, welcher ein Single-Token Standard ist, nur eine Token-Transaktion gleichzeitig ausführen kann. + +### Die Minting-Funktion aufrufen {#minting-function} + +Normalerweise verlangt diese Minting-Funktion, dass du zwei Variablen als Parameter übergibst: erstens den `recipient` (Empfänger), der die Adresse angibt, die deinen frisch geminteten NFT erhält, und zweitens die `tokenURI` des NFTs, eine Zeichenfolge, die zu einem JSON-Dokument aufgelöst wird, das die Metadaten des NFTs beschreibt. + +Die NFT Metadaten sind das, was Leben hineinbringt, welches Ihnen erlaubt Eigenschaften zu haben, wie zum Beispiel: Namen, eine Beschreibung, ein Bild (oder andere digitale Vermögenswerte), und andere Attribute. [Hier ist ein Beispiel für eine tokenURI](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2), die die Metadaten eines NFT enthält. + +In diesem Tutorial werden wir uns auf den 2 Teil fokussieren, das Aufrufen von einer bereits existierenden NFT smart Kontrakt Prägungs Funktion, indem wir unsere React UI benutzen. + +[Hier ist ein Link](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) zu dem ERC-721-NFT-Smart-Contract, den wir in diesem Tutorial aufrufen werden. Wenn du lernen möchtest, wie wir ihn erstellt haben, empfehlen wir dir dringend unser anderes Tutorial [„Wie man einen NFT erstellt“](https://www.alchemy.com/docs/how-to-create-an-nft). + +Cool, nun verstehen wir wie die Erstellung von NFTS funktioniert, lass uns nun unsere Startdateien klonen! + +## Die Starter-Dateien klonen {#clone-the-starter-files} + +Gehe zuerst zum [nft-minter-tutorial GitHub-Repository](https://github.com/alchemyplatform/nft-minter-tutorial), um die Starter-Dateien für dieses Projekt zu erhalten. Klone dieses Repository in deine lokale Umgebung. + +Wenn du dieses geklonte `nft-minter-tutorial`-Repository öffnest, wirst du feststellen, dass es zwei Ordner enthält: `minter-starter-files` und `nft-minter`. + +- `minter-starter-files` enthält die Starter-Dateien (im Wesentlichen die React-UI) für dieses Projekt. In diesem Tutorial **werden wir in diesem Verzeichnis arbeiten**, während du lernst, wie du diese Benutzeroberfläche zum Leben erweckst, indem du sie mit deiner Ethereum-Wallet und einem NFT-Smart-Contract verbindest. +- `nft-minter` enthält das gesamte, vollständige Tutorial und dient dir als **Referenz**, **falls du nicht weiterkommst.** + +Öffne als Nächstes deine Kopie von `minter-starter-files` in deinem Code-Editor und navigiere dann in deinen `src`-Ordner. + +Der gesamte Code, den wir schreiben werden, befindet sich im Ordner `src`. Wir werden die `Minter.js`-Komponente bearbeiten und zusätzliche JavaScript-Dateien schreiben, um unserem Projekt Web3-Funktionalität zu verleihen. + +## Schritt 2: Unsere Starter-Dateien ansehen {#step-2-check-out-our-starter-files} + +Bevor wir mit dem Programmieren beginnen, ist es wichtig, sich anzusehen, was uns in den Starter-Dateien bereits zur Verfügung gestellt wird. + +### Dein React-Projekt zum Laufen bringen {#get-your-react-project-running} + +Beginnen wir damit, das React-Projekt in unserem Browser auszuführen. Das Schöne an React ist, dass alle Änderungen, die wir speichern, live in unserem Browser aktualisiert werden, sobald unser Projekt im Browser läuft. + +Um das Projekt zum Laufen zu bringen, navigiere zum Stammverzeichnis des Ordners `minter-starter-files` und führe `npm install` in deinem Terminal aus, um die Abhängigkeiten des Projekts zu installieren: + +```bash +cd minter-starter-files +npm install +``` + +Sobald die Installation abgeschlossen ist, führe `npm start` in deinem Terminal aus: + +```bash +npm start +``` + +Dadurch sollte sich http://localhost:3000/ in deinem Browser öffnen, wo du das Frontend für unser Projekt siehst. Es sollte aus 3 Feldern bestehen: einem Feld zur Eingabe eines Links zum Asset deines NFTs, einem Feld zur Eingabe des Namens deines NFTs und einem Feld zur Angabe einer Beschreibung. + +Wenn du versuchst, auf die Schaltflächen „Wallet verbinden“ oder „NFT minten“ zu klicken, wirst du feststellen, dass sie nicht funktionieren – das liegt daran, dass wir ihre Funktionalität noch programmieren müssen! :\) + +### Die Minter.js-Komponente {#minter-js} + +**HINWEIS:** Stelle sicher, dass du dich im Ordner `minter-starter-files` und nicht im Ordner `nft-minter` befindest! + +Gehen wir zurück in den `src`-Ordner in unserem Editor und öffnen die Datei `Minter.js`. Es ist sehr wichtig, dass wir alles in dieser Datei verstehen, da es sich um die primäre React-Komponente handelt, an der wir arbeiten werden. + +Oben in dieser Datei befinden sich unsere Zustandsvariablen, die wir nach bestimmten Ereignissen aktualisieren werden. + +```javascript +//Zustandsvariablen +const [walletAddress, setWallet] = useState("") +const [status, setStatus] = useState("") +const [name, setName] = useState("") +const [description, setDescription] = useState("") +const [url, setURL] = useState("") +``` + +Noch nie von React-Zustandsvariablen oder State-Hooks gehört? Sieh dir [diese](https://legacy.reactjs.org/docs/hooks-state.html) Dokumentation an. + +Hier ist, was die einzelnen Variablen darstellen: + +- `walletAddress` - eine Zeichenfolge, die die Wallet-Adresse des Benutzers speichert +- `status` - eine Zeichenfolge, die eine Nachricht enthält, die am unteren Rand der Benutzeroberfläche angezeigt wird +- `name` - eine Zeichenfolge, die den Namen des NFT speichert +- `description` - eine Zeichenfolge, die die Beschreibung des NFT speichert +- `url` - eine Zeichenfolge, die ein Link zum digitalen Asset des NFT ist + +Nach den Zustandsvariablen siehst du drei nicht implementierte Funktionen: `useEffect`, `connectWalletPressed` und `onMintPressed`. Du wirst feststellen, dass alle diese Funktionen `async` sind, weil wir in ihnen asynchrone API-Aufrufe tätigen werden! Ihre Namen sind gleichbedeutend mit ihren Funktionalitäten: + +```javascript +useEffect(async () => { + //TODO: implementieren +}, []) + +const connectWalletPressed = async () => { + //TODO: implementieren +} + +const onMintPressed = async () => { + //TODO: implementieren +} +``` + +- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html) – dies ist ein React-Hook, der aufgerufen wird, nachdem deine Komponente gerendert wurde. Da ihm ein leeres Array `[]` als Prop übergeben wird (siehe Zeile 3), wird er nur beim _ersten_ Rendern der Komponente aufgerufen. Hier rufen wir unseren Wallet-Listener und eine weitere Wallet-Funktion auf, um unsere Benutzeroberfläche zu aktualisieren und anzuzeigen, ob eine Wallet bereits verbunden ist. +- `connectWalletPressed` – diese Funktion wird aufgerufen, um die MetaMask-Wallet des Benutzers mit unserer Dapp zu verbinden. +- `onMintPressed` – diese Funktion wird aufgerufen, um den NFT des Benutzers zu minten. + +Gegen Ende dieser Datei haben wir die Benutzeroberfläche unserer Komponente. Wenn du diesen Code sorgfältig durchgehst, wirst du feststellen, dass wir unsere `url`-, `name`- und `description`-Zustandsvariablen aktualisieren, wenn sich die Eingabe in den entsprechenden Textfeldern ändert. + +Du wirst auch sehen, dass `connectWalletPressed` und `onMintPressed` aufgerufen werden, wenn die Schaltflächen mit den IDs `mintButton` bzw. `walletButton` angeklickt werden. + +```javascript +//die Benutzeroberfläche unserer Komponente +return ( +
+ + +

+

🧙‍♂️ Alchemy NFT Minter

+

+ Füge einfach den Link, den Namen und die Beschreibung deines Assets hinzu und drücke dann auf „Minten“. +

+
+

🖼 Link zum Asset:

+ setURL(event.target.value)} + /> +

🤔 Name:

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

✍️ Beschreibung:

+ setDescription(event.target.value)} + /> +
+ +

{status}

+
+) +``` + +Schließlich wollen wir uns ansehen, wo diese Minter-Komponente hinzugefügt wird. + +Wenn du zur Datei `App.js` gehst, der Hauptkomponente in React, die als Container für alle anderen Komponenten fungiert, siehst du, dass unsere Minter-Komponente in Zeile 7 eingefügt wird. + +**In diesem Tutorial werden wir nur die `Minter.js`-Datei bearbeiten und Dateien in unserem `src`-Ordner hinzufügen.** + +Nachdem wir nun verstanden haben, womit wir arbeiten, richten wir unsere Ethereum-Wallet ein! + +## Richte deine Ethereum-Wallet ein {#set-up-your-ethereum-wallet} + +Damit Benutzer mit deinem Smart Contract interagieren können, müssen sie ihre Ethereum-Wallet mit deiner Dapp verbinden. + +### MetaMask herunterladen {#download-metamask} + +In diesem Tutorial verwenden wir MetaMask, eine virtuelle Wallet im Browser, mit der Sie Ihre Ethereum-Kontoadresse verwalten können. Wenn du mehr darüber erfahren möchtest, wie Transaktionen auf Ethereum funktionieren, sieh dir [diese Seite](/developers/docs/transactions/) an. + +Sie können MetaMask [hier](https://metamask.io/download) kostenlos herunterladen und ein Konto erstellen. Wenn du ein Konto erstellst oder bereits eines hast, wechsle unbedingt zum „Ropsten Test Network“ oben rechts (damit wir nicht mit echtem Geld hantieren). + +### Ether von einem Faucet hinzufügen {#add-ether-from-faucet} + +Um unsere NFTs zu minten (oder Transaktionen auf der Ethereum-Blockchain zu signieren), benötigen wir einige gefälschte ETH. Um ETH zu erhalten, kannst du zum [Ropsten-Faucet](https://faucet.ropsten.be/) gehen und deine Ropsten-Kontoadresse eingeben und dann auf „Send Ropsten ETH“ klicken. Kurz darauf solltest du ETH in deinem MetaMask-Konto sehen! + +### Deinen Kontostand überprüfen {#check-your-balance} + +Um zu überprüfen, ob unser Guthaben vorhanden ist, machen wir eine [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)-Anfrage mit dem [Composer-Tool von Alchemy](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Dies gibt den Betrag an ETH in unserer Wallet zurück. Nachdem Sie die Adresse Ihres MetaMask-Kontos eingegeben und auf “Send Request” (Anforderung senden) geklickt haben, sollten Sie eine Antwort ähnlich der Folgenden erhalten: + +```text +{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} +``` + +**HINWEIS:** Dieses Ergebnis ist in Wei, nicht in ETH. Wei ist die kleinste Einheit von Ether. Die Umrechnung von Wei in ETH ist: 1 ETH = 10¹⁸ Wei. Wenn wir also 0xde0b6b3a7640000 in eine Dezimalzahl umwandeln, erhalten wir 1\*10¹⁸, was 1 ETH entspricht. + +Puh! Unser Falschgeld ist da! + +## MetaMask mit deiner Benutzeroberfläche verbinden {#connect-metamask-to-your-UI} + +Nachdem unsere MetaMask-Wallet nun eingerichtet ist, verbinden wir unsere Dapp damit! + +Da wir uns an das [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)-Paradigma halten wollen, werden wir eine separate Datei erstellen, die unsere Funktionen zur Verwaltung der Logik, der Daten und der Regeln unserer Dapp enthält, und diese Funktionen dann an unser Frontend (unsere Minter.js-Komponente) übergeben. + +### Die `connectWallet`-Funktion {#connect-wallet-function} + +Dazu erstellen wir einen neuen Ordner namens `utils` in deinem `src`-Verzeichnis und fügen eine Datei namens `interact.js` hinzu, die alle unsere Interaktionsfunktionen für Wallets und Smart Contracts enthalten wird. + +In unserer `interact.js`-Datei schreiben wir eine `connectWallet`-Funktion, die wir dann in unsere `Minter.js`-Komponente importieren und aufrufen. + +Füge in deine `interact.js`-Datei Folgendes ein + +```javascript +export const connectWallet = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_requestAccounts", + }) + const obj = { + status: "👆🏽 Schreibe eine Nachricht in das Textfeld oben.", + address: addressArray[0], + } + return obj + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

+ {" "} + 🦊 + Du musst MetaMask, eine virtuelle Ethereum-Wallet, in deinem + Browser installieren. + +

+
+ ), + } + } +} +``` + +Schauen wir uns an, was dieser Code bewirkt: + +Zuerst prüft unsere Funktion, ob `window.ethereum` in deinem Browser aktiviert ist. + +`window.ethereum` ist eine globale API, die von MetaMask und anderen Wallet-Anbietern eingeschleust wird und es Websites ermöglicht, die Ethereum-Konten von Benutzern anzufordern. Wenn dies genehmigt wird, kann sie Daten aus den Blockchains lesen, mit denen der Benutzer verbunden ist, und dem Benutzer vorschlagen, Nachrichten und Transaktionen zu signieren. Weitere Informationen findest du in der [MetaMask-Dokumentation](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents)! + +Wenn `window.ethereum` _nicht_ vorhanden ist, bedeutet das, dass MetaMask nicht installiert ist. Dies führt dazu, dass ein JSON-Objekt zurückgegeben wird, bei dem die zurückgegebene `address` eine leere Zeichenfolge ist und das `status`-JSX-Objekt meldet, dass der Benutzer MetaMask installieren muss. + +**Die meisten Funktionen, die wir schreiben, geben JSON-Objekte zurück, mit denen wir unsere Zustandsvariablen und die Benutzeroberfläche aktualisieren können.** + +Wenn `window.ethereum` jedoch vorhanden _ist_, dann wird es interessant. + +Mithilfe einer try/catch-Schleife versuchen wir, eine Verbindung zu MetaMask herzustellen, indem wir [`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts) aufrufen. Der Aufruf dieser Funktion öffnet MetaMask im Browser, woraufhin der Benutzer aufgefordert wird, seine Wallet mit deiner Dapp zu verbinden. + +- Wenn der Benutzer die Verbindung herstellt, gibt `method: "eth_requestAccounts"` ein Array zurück, das alle Adressen der Benutzerkonten enthält, die mit der Dapp verbunden sind. Insgesamt gibt unsere `connectWallet`-Funktion ein JSON-Objekt zurück, das die _erste_ `address` in diesem Array (siehe Zeile 9) und eine `status`-Nachricht enthält, die den Benutzer auffordert, eine Nachricht an den Smart Contract zu schreiben. +- Wenn der Benutzer die Verbindung ablehnt, enthält das JSON-Objekt eine leere Zeichenfolge für die zurückgegebene `address` und eine `status`-Nachricht, die widerspiegelt, dass der Benutzer die Verbindung abgelehnt hat. + +### Hinzufügen der connectWallet-Funktion zur Minter.js-UI-Komponente {#add-connect-wallet} + +Nachdem wir diese `connectWallet`-Funktion geschrieben haben, verbinden wir sie mit unserer `Minter.js.`-Komponente. + +Zuerst müssen wir unsere Funktion in unsere `Minter.js`-Datei importieren, indem wir `import { connectWallet } from "./utils/interact.js";` am Anfang der `Minter.js`-Datei hinzufügen. Deine ersten 11 Zeilen von `Minter.js` sollten nun so aussehen: + +```javascript +import { useEffect, useState } from "react"; +import { connectWallet } from "./utils/interact.js"; + +const Minter = (props) => { + + //Zustandsvariablen + const [walletAddress, setWallet] = useState(""); + const [status, setStatus] = useState(""); + const [name, setName] = useState(""); + const [description, setDescription] = useState(""); + const [url, setURL] = useState(""); +``` + +Dann rufen wir in unserer `connectWalletPressed`-Funktion unsere importierte `connectWallet`-Funktion auf, wie folgt: + +```javascript +const connectWalletPressed = async () => { + const walletResponse = await connectWallet() + setStatus(walletResponse.status) + setWallet(walletResponse.address) +} +``` + +Fällt dir auf, wie der größte Teil unserer Funktionalität von unserer `Minter.js`-Komponente in die `interact.js`-Datei abstrahiert wird? Dies geschieht, damit wir dem M-V-C-Paradigma entsprechen! + +In `connectWalletPressed` machen wir einfach einen Await-Aufruf an unsere importierte `connectWallet`-Funktion, und mit ihrer Antwort aktualisieren wir unsere `status`- und `walletAddress`-Variablen über ihre State-Hooks. + +Speichern wir nun beide Dateien, `Minter.js` und `interact.js`, und testen unsere Benutzeroberfläche. + +Öffne deinen Browser unter localhost:3000 und drücke die Schaltfläche „Wallet verbinden“ oben rechts auf der Seite. + +Wenn du MetaMask installiert hast, solltest du aufgefordert werden, deine Wallet mit deiner Dapp zu verbinden. Akzeptiere die Aufforderung, eine Verbindung herzustellen. + +Du solltest sehen, dass die Wallet-Schaltfläche nun anzeigt, dass deine Adresse verbunden ist. + +Als Nächstes versuche, die Seite neu zu laden ... Das ist seltsam. Unsere Wallet-Schaltfläche fordert uns auf, MetaMask zu verbinden, obwohl es bereits verbunden ist ... + +Aber keine Sorge! Das können wir leicht beheben, indem wir eine Funktion namens `getCurrentWalletConnected` implementieren, die prüft, ob eine Adresse bereits mit unserer Dapp verbunden ist, und unsere Benutzeroberfläche entsprechend aktualisiert! + +### Die getCurrentWalletConnected-Funktion {#get-current-wallet} + +Füge in deine `interact.js`-Datei die folgende `getCurrentWalletConnected`-Funktion ein: + +```javascript +export const getCurrentWalletConnected = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_accounts", + }) + if (addressArray.length > 0) { + return { + address: addressArray[0], + status: "👆🏽 Schreibe eine Nachricht in das Textfeld oben.", + } + } else { + return { + address: "", + status: "🦊 Verbinde dich mit MetaMask über die Schaltfläche oben rechts.", + } + } + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

+ {" "} + 🦊 + Du musst MetaMask, eine virtuelle Ethereum-Wallet, in deinem + Browser installieren. + +

+
+ ), + } + } +} +``` + +Dieser Code ist der `connectWallet`-Funktion, die wir gerade geschrieben haben, _sehr_ ähnlich. + +Der Hauptunterschied besteht darin, dass wir anstelle der Methode `eth_requestAccounts`, die MetaMask für den Benutzer öffnet, um seine Wallet zu verbinden, hier die Methode `eth_accounts` aufrufen, die einfach ein Array zurückgibt, das die MetaMask-Adressen enthält, die derzeit mit unserer Dapp verbunden sind. + +Um diese Funktion in Aktion zu sehen, rufen wir sie in der `useEffect`-Funktion unserer `Minter.js`-Komponente auf. + +Wie bei `connectWallet` müssen wir diese Funktion aus unserer `interact.js`-Datei in unsere `Minter.js`-Datei importieren, und zwar so: + +```javascript +import { useEffect, useState } from "react" +import { + connectWallet, + getCurrentWalletConnected, //hier importieren +} from "./utils/interact.js" +``` + +Jetzt rufen wir sie einfach in unserer `useEffect`-Funktion auf: + +```javascript +useEffect(async () => { + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) +}, []) +``` + +Beachte, dass wir die Antwort unseres Aufrufs an `getCurrentWalletConnected` verwenden, um unsere `walletAddress`- und `status`-Zustandsvariablen zu aktualisieren. + +Nachdem du diesen Code hinzugefügt hast, versuche, unser Browserfenster zu aktualisieren. Die Schaltfläche sollte anzeigen, dass du verbunden bist, und eine Vorschau der Adresse deiner verbundenen Wallet anzeigen – auch nach dem Aktualisieren! + +### addWalletListener implementieren {#implement-add-wallet-listener} + +Der letzte Schritt in der Einrichtung unserer Dapp-Wallet ist die Implementierung des Wallet-Listeners, damit unsere Benutzeroberfläche aktualisiert wird, wenn sich der Zustand unserer Wallet ändert, z. B. wenn der Benutzer die Verbindung trennt oder das Konto wechselt. + +Füge in deine `Minter.js`-Datei eine Funktion `addWalletListener` hinzu, die wie folgt aussieht: + +```javascript +function addWalletListener() { + if (window.ethereum) { + window.ethereum.on("accountsChanged", (accounts) => { + if (accounts.length > 0) { + setWallet(accounts[0]) + setStatus("👆🏽 Schreibe eine Nachricht in das Textfeld oben.") + } else { + setWallet("") + setStatus("🦊 Verbinde dich mit MetaMask über die Schaltfläche oben rechts.") + } + }) + } else { + setStatus( +

+ {" "} + 🦊 + Du musst MetaMask, eine virtuelle Ethereum-Wallet, in deinem Browser installieren. + +

+ ) + } +} +``` + +Lass uns kurz aufschlüsseln, was hier passiert: + +- Zuerst prüft unsere Funktion, ob `window.ethereum` aktiviert ist (d. h. MetaMask ist installiert). + - Wenn nicht, setzen wir einfach unsere `status`-Zustandsvariable auf eine JSX-Zeichenfolge, die den Benutzer auffordert, MetaMask zu installieren. + - Wenn es aktiviert ist, richten wir den Listener `window.ethereum.on("accountsChanged")` in Zeile 3 ein, der auf Zustandsänderungen in der MetaMask-Wallet lauscht. Dazu gehören, wenn der Benutzer ein zusätzliches Konto mit der Dapp verbindet, Konten wechselt oder ein Konto trennt. Wenn mindestens ein Konto verbunden ist, wird die Zustandsvariable `walletAddress` als das erste Konto im `accounts`-Array aktualisiert, das vom Listener zurückgegeben wird. Andernfalls wird `walletAddress` als leere Zeichenfolge festgelegt. + +Schließlich müssen wir sie in unserer `useEffect`-Funktion aufrufen: + +```javascript +useEffect(async () => { + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) + + addWalletListener() +}, []) +``` + +Und voilà! Wir haben die Programmierung all unserer Wallet-Funktionalitäten abgeschlossen! Nachdem unsere Wallet nun eingerichtet ist, finden wir heraus, wie wir unser NFT minten können! + +## NFT-Metadaten 101 {#nft-metadata-101} + +Erinnerst du dich an die NFT-Metadaten, über die wir in Schritt 0 dieses Tutorials gesprochen haben? Sie erwecken einen NFT zum Leben und ermöglichen es ihm, Eigenschaften wie ein digitales Asset, einen Namen, eine Beschreibung und andere Attribute zu haben. + +Wir müssen diese Metadaten als JSON-Objekt konfigurieren und speichern, damit wir sie als `tokenURI`-Parameter übergeben können, wenn wir die `mintNFT`-Funktion unseres Smart Contracts aufrufen. + +Der Text in den Feldern „Link zum Asset“, „Name“, „Beschreibung“ wird die verschiedenen Eigenschaften der Metadaten unseres NFTs umfassen. Wir werden diese Metadaten als JSON-Objekt formatieren, aber es gibt ein paar Optionen, wo wir dieses JSON-Objekt speichern können: + +- Wir könnten sie auf der Ethereum-Blockchain speichern, was jedoch sehr teuer wäre. +- Wir könnten sie auf einem zentralisierten Server wie AWS oder Firebase speichern. Aber das würde unserem Dezentralisierungs-Ethos widersprechen. +- Wir könnten IPFS verwenden, ein dezentralisiertes Protokoll und Peer-to-Peer-Netzwerk zum Speichern und Teilen von Daten in einem verteilten Dateisystem. Da dieses Protokoll dezentralisiert und kostenlos ist, ist es unsere beste Option! + +Um unsere Metadaten auf IPFS zu speichern, verwenden wir [Pinata](https://pinata.cloud/), eine praktische IPFS-API und ein Toolkit. Im nächsten Schritt erklären wir genau, wie das geht! + +## Pinata verwenden, um deine Metadaten auf IPFS zu pinnen {#use-pinata-to-pin-your-metadata-to-IPFS} + +Wenn du noch kein [Pinata](https://pinata.cloud/)-Konto hast, registriere dich [hier](https://app.pinata.cloud/auth/signup) für ein kostenloses Konto und führe die Schritte zur Verifizierung deiner E-Mail und deines Kontos durch. + +### Erstelle deinen Pinata-API-Schlüssel {#create-pinata-api-key} + +Navigiere zur Seite [https://pinata.cloud/keys](https://pinata.cloud/keys), wähle dann oben die Schaltfläche „New Key“ (Neuer Schlüssel), setze das Admin-Widget auf „Enabled“ (Aktiviert) und benenne deinen Schlüssel. + +Dir wird dann ein Popup mit deinen API-Informationen angezeigt. Bewahre diese an einem sicheren Ort auf. + +Nachdem unser Schlüssel nun eingerichtet ist, fügen wir ihn zu unserem Projekt hinzu, damit wir ihn verwenden können. + +### Eine .env-Datei erstellen {#create-a-env} + +Wir können unseren Pinata-Schlüssel und das Geheimnis sicher in einer Umgebungsdatei speichern. Installieren wir das [dotenv-Paket](https://www.npmjs.com/package/dotenv) in deinem Projektverzeichnis. + +Öffne einen neuen Tab in deinem Terminal (getrennt von dem, auf dem der Localhost läuft) und stelle sicher, dass du dich im Ordner `minter-starter-files` befindest. Führe dann den folgenden Befehl in deinem Terminal aus: + +```text +npm install dotenv --save +``` + +Als Nächstes erstelle eine `.env`-Datei im Stammverzeichnis deiner `minter-starter-files`, indem du Folgendes in deiner Befehlszeile eingibst: + +```javascript +vim.env +``` + +Dadurch wird deine `.env`-Datei in vim (einem Texteditor) geöffnet. Um sie zu speichern, drücke „esc“ + „:“ + „q“ in dieser Reihenfolge auf deiner Tastatur. + +Navigiere als Nächstes in VSCode zu deiner `.env`-Datei und füge deinen Pinata-API-Schlüssel und dein API-Geheimnis hinzu, und zwar so: + +```text +REACT_APP_PINATA_KEY = +REACT_APP_PINATA_SECRET = +``` + +Speichere die Datei, und dann kannst du damit beginnen, die Funktion zum Hochladen deiner JSON-Metadaten auf IPFS zu schreiben! + +### pinJSONToIPFS implementieren {#pin-json-to-ipfs} + +Glücklicherweise hat Pinata eine [API speziell für das Hochladen von JSON-Daten auf IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) und ein praktisches JavaScript-Beispiel mit Axios, das wir mit leichten Änderungen verwenden können. + +Erstellen wir in deinem `utils`-Ordner eine weitere Datei namens `pinata.js` und importieren dann unser Pinata-Geheimnis und den Schlüssel aus der .env-Datei wie folgt: + +```javascript +require("dotenv").config() +const key = process.env.REACT_APP_PINATA_KEY +const secret = process.env.REACT_APP_PINATA_SECRET +``` + +Füge als Nächstes den zusätzlichen Code von unten in deine `pinata.js`-Datei ein. Keine Sorge, wir werden aufschlüsseln, was alles bedeutet! + +```javascript +require("dotenv").config() +const key = process.env.REACT_APP_PINATA_KEY +const secret = process.env.REACT_APP_PINATA_SECRET + +const axios = require("axios") + +export const pinJSONToIPFS = async (JSONBody) => { + const url = `https://api.pinata.cloud/pinning/pinJSONToIPFS` + //axios-POST-Anfrage an Pinata stellen ⬇️ + return axios + .post(url, JSONBody, { + headers: { + pinata_api_key: key, + pinata_secret_api_key: secret, + }, + }) + .then(function (response) { + return { + success: true, + pinataUrl: + "https://gateway.pinata.cloud/ipfs/" + response.data.IpfsHash, + } + }) + .catch(function (error) { + console.log(error) + return { + success: false, + message: error.message, + } + }) +} +``` + +Was genau macht dieser Code also? + +Zuerst importiert er [axios](https://www.npmjs.com/package/axios), einen Promise-basierten HTTP-Client für den Browser und node.js, den wir verwenden werden, um eine Anfrage an Pinata zu stellen. + +Dann haben wir unsere asynchrone Funktion `pinJSONToIPFS`, die einen `JSONBody` als Eingabe und den Pinata-API-Schlüssel und das Geheimnis in ihrem Header entgegennimmt, um eine POST-Anfrage an ihre `pinJSONToIPFS`-API zu stellen. + +- Wenn diese POST-Anfrage erfolgreich ist, gibt unsere Funktion ein JSON-Objekt zurück, bei dem der `success`-Boole’sche Wert auf „true“ gesetzt ist und die `pinataUrl` angibt, wo unsere Metadaten angeheftet wurden. Wir werden diese zurückgegebene `pinataUrl` als `tokenURI`-Eingabe für die Mint-Funktion unseres Smart Contracts verwenden. +- Wenn diese Post-Anfrage fehlschlägt, gibt unsere Funktion ein JSON-Objekt zurück, bei dem der `success`-Boole’sche Wert auf „false“ gesetzt ist und eine `message`-Zeichenfolge unseren Fehler weitergibt. + +Wie bei unseren `connectWallet`-Funktionsrückgabetypen geben wir JSON-Objekte zurück, damit wir ihre Parameter zur Aktualisierung unserer Zustandsvariablen und der Benutzeroberfläche verwenden können. + +## Lade deinen Smart Contract {#load-your-smart-contract} + +Nachdem wir nun eine Möglichkeit haben, unsere NFT-Metadaten über unsere `pinJSONToIPFS`-Funktion auf IPFS hochzuladen, benötigen wir eine Möglichkeit, eine Instanz unseres Smart Contracts zu laden, damit wir seine `mintNFT`-Funktion aufrufen können. + +Wie bereits erwähnt, werden wir in diesem Tutorial [diesen bestehenden NFT-Smart-Contract](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) verwenden. Wenn du jedoch lernen möchtest, wie wir ihn erstellt haben oder selbst einen erstellen möchtest, empfehlen wir dir dringend, unser anderes Tutorial [„Wie man einen NFT erstellt“](https://www.alchemy.com/docs/how-to-create-an-nft) anzusehen. + +### Das Contract-ABI {#contract-abi} + +Wenn du unsere Dateien genau untersucht hast, wirst du bemerkt haben, dass es in unserem `src`-Verzeichnis eine `contract-abi.json`-Datei gibt. Ein ABI ist notwendig, um anzugeben, welche Funktion ein Vertrag aufrufen wird, und um sicherzustellen, dass die Funktion Daten in dem von dir erwarteten Format zurückgibt. + +Wir werden auch einen Alchemy-API-Schlüssel und die Alchemy-Web3-API benötigen, um uns mit der Ethereum-Blockchain zu verbinden und unseren Smart Contract zu laden. + +### Erstelle deinen Alchemy-API-Schlüssel {#create-alchemy-api} + +Wenn du noch kein Alchemy-Konto hast, [registriere dich hier kostenlos](https://alchemy.com/?a=eth-org-nft-minter). + +Sobald Sie ein Alchemy-Konto erstellt haben, können Sie einen API-Schlüssel generieren. Erstellen Sie dafür eine App. Dadurch können wir Anfragen an das Ropsten-Testnet stellen. + +Navigiere zur Seite „App erstellen“ in deinem Alchemy-Dashboard, indem du in der Navigationsleiste über „Apps“ fährst und auf „App erstellen“ klickst. + +Benenne deine App – wir haben „Mein erster NFT!“ gewählt –, gib eine kurze Beschreibung, wähle „Staging“ für die Umgebung, die für die Buchführung deiner App verwendet wird, und wähle „Ropsten“ als dein Netzwerk. + +Klicken Sie auf “Create app” (App erstellen) und schon sind Sie fertig. Die App sollte in der untenstehenden Tabelle erscheinen. + +Super, jetzt, da wir unsere HTTP-Alchemy-API-URL erstellt haben, kopiere sie in deine Zwischenablage ... + +… und fügen wir sie zu unserer `.env`-Datei hinzu. Insgesamt sollte deine .env-Datei so aussehen: + +```text +REACT_APP_PINATA_KEY = +REACT_APP_PINATA_SECRET = +REACT_APP_ALCHEMY_KEY = https://eth-ropsten.alchemyapi.io/v2/ +``` + +Jetzt, da wir unser Contract-ABI und unseren Alchemy-API-Schlüssel haben, sind wir bereit, unseren Smart Contract mit [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) zu laden. + +### Richte deinen Alchemy-Web3-Endpunkt und deinen Vertrag ein {#setup-alchemy-endpoint} + +Wenn du es noch nicht hast, musst du zuerst [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) installieren, indem du im Terminal zum Stammverzeichnis navigierst: `nft-minter-tutorial`: + +```text +cd .. +npm install @alch/alchemy-web3 +``` + +Als Nächstes kehren wir zu unserer `interact.js`-Datei zurück. Füge am Anfang der Datei den folgenden Code hinzu, um deinen Alchemy-Schlüssel aus deiner .env-Datei zu importieren und deinen Alchemy-Web3-Endpunkt einzurichten: + +```javascript +require("dotenv").config() +const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3(alchemyKey) +``` + +[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) ist ein Wrapper um [Web3.js](https://docs.web3js.org/) und bietet erweiterte API-Methoden und andere entscheidende Vorteile, um dir das Leben als Web3-Entwickler zu erleichtern. Es ist so konzipiert, dass es eine minimale Konfiguration erfordert, sodass du es sofort in deiner App verwenden kannst! + +Als Nächstes fügen wir unser Contract-ABI und unsere Contract-Adresse zu unserer Datei hinzu. + +```javascript +require("dotenv").config() +const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3(alchemyKey) + +const contractABI = require("../contract-abi.json") +const contractAddress = "0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE" +``` + +Sobald wir beides haben, sind wir bereit, unsere Mint-Funktion zu programmieren! + +## Die mintNFT-Funktion implementieren {#implement-the-mintnft-function} + +Definieren wir in deiner `interact.js`-Datei unsere Funktion `mintNFT`, die gleichnamig unseren NFT minten wird. + +Da wir zahlreiche asynchrone Aufrufe machen werden (an Pinata, um unsere Metadaten auf IPFS zu pinnen, an Alchemy Web3, um unseren Smart Contract zu laden, und an MetaMask, um unsere Transaktionen zu signieren), wird unsere Funktion ebenfalls asynchron sein. + +Die drei Eingaben für unsere Funktion sind die `url` unseres digitalen Assets, der `name` und die `description`. Füge die folgende Funktionssignatur unter der `connectWallet`-Funktion hinzu: + +```javascript +export const mintNFT = async (url, name, description) => {} +``` + +### Fehlerbehandlung bei der Eingabe {#input-error-handling} + +Natürlich ist es sinnvoll, am Anfang der Funktion eine Art Fehlerbehandlung für die Eingabe zu haben, damit wir diese Funktion beenden, wenn unsere Eingabeparameter nicht korrekt sind. Fügen wir in unserer Funktion den folgenden Code hinzu: + +```javascript +export const mintNFT = async (url, name, description) => { + //Fehlerbehandlung + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗Bitte stelle sicher, dass alle Felder vor dem Minten ausgefüllt sind.", + } + } +} +``` + +Im Wesentlichen, wenn einer der Eingabeparameter eine leere Zeichenfolge ist, geben wir ein JSON-Objekt zurück, bei dem der `success`-Boole'sche Wert auf „false“ gesetzt ist und die `status`-Zeichenfolge meldet, dass alle Felder in unserer Benutzeroberfläche vollständig sein müssen. + +### Hochladen der Metadaten auf IPFS {#upload-metadata-to-ipfs} + +Sobald wir wissen, dass unsere Metadaten korrekt formatiert sind, besteht der nächste Schritt darin, sie in ein JSON-Objekt zu verpacken und über die von uns geschriebene `pinJSONToIPFS`-Funktion auf IPFS hochzuladen! + +Dazu müssen wir zuerst die `pinJSONToIPFS`-Funktion in unsere `interact.js`-Datei importieren. Ganz oben in der `interact.js` fügen wir hinzu: + +```javascript +import { pinJSONToIPFS } from "./pinata.js" +``` + +Erinnere dich daran, dass `pinJSONToIPFS` einen JSON-Körper entgegennimmt. Bevor wir sie aufrufen, müssen wir also unsere `url`-, `name`- und `description`-Parameter in ein JSON-Objekt formatieren. + +Aktualisieren wir unseren Code, um ein JSON-Objekt namens `metadata` zu erstellen und dann einen Aufruf an `pinJSONToIPFS` mit diesem `metadata`-Parameter zu machen: + +```javascript +export const mintNFT = async (url, name, description) => { + //Fehlerbehandlung + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗Bitte stelle sicher, dass alle Felder vor dem Minten ausgefüllt sind.", + } + } + + //Metadaten erstellen + const metadata = new Object() + metadata.name = name + metadata.image = url + metadata.description = description + + //Pinata-Aufruf durchführen + const pinataResponse = await pinJSONToIPFS(metadata) + if (!pinataResponse.success) { + return { + success: false, + status: "😢 Etwas ist beim Hochladen deiner tokenURI schiefgelaufen.", + } + } + const tokenURI = pinataResponse.pinataUrl +} +``` + +Beachte, dass wir die Antwort unseres Aufrufs an `pinJSONToIPFS(metadata)` im `pinataResponse`-Objekt speichern. Dann analysieren wir dieses Objekt auf Fehler. + +Wenn ein Fehler auftritt, geben wir ein JSON-Objekt zurück, bei dem der `success`-Boole’sche Wert auf „false“ gesetzt ist und unsere `status`-Zeichenfolge meldet, dass unser Aufruf fehlgeschlagen ist. Andernfalls extrahieren wir die `pinataURL` aus der `pinataResponse` und speichern sie als unsere `tokenURI`-Variable. + +Jetzt ist es an der Zeit, unseren Smart Contract mit der Alchemy Web3-API zu laden, die wir am Anfang unserer Datei initialisiert haben. Füge die folgende Codezeile am Ende der `mintNFT`-Funktion hinzu, um den Vertrag auf die globale Variable `window.contract` zu setzen: + +```javascript +window.contract = await new web3.eth.Contract(contractABI, contractAddress) +``` + +Das Letzte, was wir in unserer `mintNFT`-Funktion hinzufügen müssen, ist unsere Ethereum-Transaktion: + +```javascript +//Deine Ethereum-Transaktion einrichten +const transactionParameters = { + to: contractAddress, // Erforderlich, außer bei Vertragsveröffentlichungen. + from: window.ethereum.selectedAddress, // muss mit der aktiven Adresse des Benutzers übereinstimmen. + data: window.contract.methods + .mintNFT(window.ethereum.selectedAddress, tokenURI) + .encodeABI(), //Aufruf des NFT-Smart-Contracts durchführen +} + +//die Transaktion über MetaMask signieren +try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + success: true, + status: + "✅ Sieh dir deine Transaktion auf Etherscan an: https://ropsten.etherscan.io/tx/" + + txHash, + } +} catch (error) { + return { + success: false, + status: "😥 Etwas ist schiefgelaufen: " + error.message, + } +} +``` + +Wenn du bereits mit Ethereum-Transaktionen vertraut bist, wirst du feststellen, dass die Struktur ziemlich ähnlich zu dem ist, was du bereits gesehen hast. + +- Zuerst richten wir unsere Transaktionsparameter ein. + - `to` gibt die Empfängeradresse an (unser Smart Contract) + - `from` gibt den Unterzeichner der Transaktion an (die mit MetaMask verbundene Adresse des Benutzers: `window.ethereum.selectedAddress`) + - `data` enthält den Aufruf unserer Smart-Contract-`mintNFT`-Methode, die unsere `tokenURI` und die Wallet-Adresse des Benutzers, `window.ethereum.selectedAddress`, als Eingaben erhält +- Dann machen wir einen Await-Aufruf, `window.ethereum.request,`, bei dem wir MetaMask bitten, die Transaktion zu signieren. Beachte, dass wir in dieser Anfrage unsere eth-Methode (eth_SentTransaction) angeben und unsere `transactionParameters` übergeben. An diesem Punkt öffnet sich MetaMask im Browser und fordert den Benutzer auf, die Transaktion zu signieren oder abzulehnen. + - Wenn die Transaktion erfolgreich ist, gibt die Funktion ein JSON-Objekt zurück, bei dem der Boole’sche Wert `success` auf „true“ gesetzt ist und die `status`-Zeichenfolge den Benutzer auffordert, Etherscan für weitere Informationen zu seiner Transaktion zu besuchen. + - Wenn die Transaktion fehlschlägt, gibt die Funktion ein JSON-Objekt zurück, bei dem der `success`-Boole’sche Wert auf „false“ gesetzt ist und die `status`-Zeichenfolge die Fehlermeldung weitergibt. + +Insgesamt sollte unsere `mintNFT`-Funktion so aussehen: + +```javascript +export const mintNFT = async (url, name, description) => { + //Fehlerbehandlung + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗Bitte stelle sicher, dass alle Felder vor dem Minten ausgefüllt sind.", + } + } + + //Metadaten erstellen + const metadata = new Object() + metadata.name = name + metadata.image = url + metadata.description = description + + //Pinata-Pin-Anfrage + const pinataResponse = await pinJSONToIPFS(metadata) + if (!pinataResponse.success) { + return { + success: false, + status: "😢 Etwas ist beim Hochladen deiner tokenURI schiefgelaufen.", + } + } + const tokenURI = pinataResponse.pinataUrl + + //Smart Contract laden + window.contract = await new web3.eth.Contract(contractABI, contractAddress) //loadContract(); + + //Deine Ethereum-Transaktion einrichten + const transactionParameters = { + to: contractAddress, // Erforderlich, außer bei Vertragsveröffentlichungen. + from: window.ethereum.selectedAddress, // muss mit der aktiven Adresse des Benutzers übereinstimmen. + data: window.contract.methods + .mintNFT(window.ethereum.selectedAddress, tokenURI) + .encodeABI(), //Aufruf des NFT-Smart-Contracts durchführen + } + + //Transaktion über MetaMask signieren + try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + success: true, + status: + "✅ Sieh dir deine Transaktion auf Etherscan an: https://ropsten.etherscan.io/tx/" + + txHash, + } + } catch (error) { + return { + success: false, + status: "😥 Etwas ist schiefgelaufen: " + error.message, + } + } +} +``` + +Das ist eine riesige Funktion! Jetzt müssen wir nur noch unsere `mintNFT`-Funktion mit unserer `Minter.js`-Komponente verbinden ... + +## Verbinde mintNFT mit unserem Minter.js-Frontend {#connect-our-frontend} + +Öffne deine `Minter.js`-Datei und aktualisiere die Zeile `import { connectWallet, getCurrentWalletConnected } from "./utils/interact.js";` am Anfang zu: + +```javascript +import { + connectWallet, + getCurrentWalletConnected, + mintNFT, +} from "./utils/interact.js" +``` + +Implementiere schließlich die `onMintPressed`-Funktion, um einen Await-Aufruf an deine importierte `mintNFT`-Funktion zu machen und die `status`-Zustandsvariable zu aktualisieren, um widerzuspiegeln, ob unsere Transaktion erfolgreich war oder fehlgeschlagen ist: + +```javascript +const onMintPressed = async () => { + const { status } = await mintNFT(url, name, description) + setStatus(status) +} +``` + +## Stelle deinen NFT auf einer Live-Website bereit {#deploy-your-NFT} + +Bereit, dein Projekt live zu schalten, damit Benutzer damit interagieren können? Sieh dir [dieses Tutorial](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online) an, um deinen Minter auf einer Live-Website bereitzustellen. + +Ein letzter Schritt ... + +## Erobere die Blockchain-Welt im Sturm {#take-the-blockchain-world-by-storm} + +Nur ein Scherz, du hast es bis zum Ende des Tutorials geschafft! + +Zusammenfassend lässt sich sagen, dass du durch den Bau eines NFT-Minters erfolgreich gelernt hast, wie man: + +- Verbinden von MetaMask mit Ihrem Frontend-Projekt +- Rufen von Smart-Contract Methoden von Ihrem Frontend +- Transaktionen mit MetaMask signieren + +Vermutlich möchtest du die über deine Dapp geminteten NFTs in deiner Wallet präsentieren können – sieh dir also unbedingt unser kurzes Tutorial [So zeigst du dein NFT in deiner Wallet an](https://www.alchemy.com/docs/how-to-view-your-nft-in-your-mobile-wallet) an! + +Und wie immer, wenn du Fragen hast, sind wir hier, um im [Alchemy Discord](https://discord.gg/gWuC7zB) zu helfen. Wir können es kaum erwarten zu sehen, wie du die Konzepte aus diesem Tutorial auf deine zukünftigen Projekte anwendest! diff --git a/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md new file mode 100644 index 00000000000..59a7e410e1c --- /dev/null +++ b/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -0,0 +1,1357 @@ +--- +title: "Walkthrough zum Vertrag der Optimism-Standard-Brücke" +description: Wie funktioniert die Standard-Brücke für Optimism? Warum funktioniert sie auf diese Weise? +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +tags: [ "solidity", "Brücke", "Layer 2" ] +skill: intermediate +published: 2022-03-30 +lang: de +--- + +[Optimism](https://www.optimism.io/) ist ein [Optimistic Rollup](/developers/docs/scaling/optimistic-rollups/). +Optimistic Rollups können Transaktionen zu einem viel niedrigeren Preis als das Ethereum Mainnet (auch bekannt als Layer 1 oder L1) verarbeiten, da Transaktionen nur von einigen wenigen Knoten anstatt von jedem Knoten im Netzwerk verarbeitet werden. +Gleichzeitig werden alle Daten auf L1 geschrieben, sodass alles mit der Integrität und Verfügbarkeit des Mainnets nachgewiesen und rekonstruiert werden kann. + +Um L1-Assets auf Optimism (oder einem anderen L2) zu verwenden, müssen die Assets [überbrückt](/bridges/#prerequisites) werden. +Eine Möglichkeit, dies zu erreichen, besteht darin, dass Benutzer Assets (ETH und [ERC-20-Tokens](/developers/docs/standards/tokens/erc-20/) sind die häufigsten) auf L1 sperren und gleichwertige Assets zur Verwendung auf L2 erhalten. +Schließlich möchte derjenige, der sie am Ende besitzt, sie vielleicht wieder auf L1 zurückbrücken. +Dabei werden die Assets auf L2 verbrannt und dann auf L1 wieder an den Benutzer freigegeben. + +So funktioniert die [Optimism Standard-Brücke](https://docs.optimism.io/app-developers/bridging/standard-bridge). +In diesem Artikel gehen wir den Quellcode für diese Brücke durch, um zu sehen, wie sie funktioniert, und um sie als Beispiel für gut geschriebenen Solidity-Code zu studieren. + +## Kontrollflüsse {#control-flows} + +Die Brücke hat zwei Hauptabläufe: + +- Einzahlung (von L1 nach L2) +- Auszahlung (von L2 nach L1) + +### Einzahlungsablauf {#deposit-flow} + +#### Layer 1 {#deposit-flow-layer-1} + +1. Bei der Einzahlung eines ERC-20 erteilt der Einzahler der Brücke eine Freigabe, den eingezahlten Betrag auszugeben. +2. Der Einzahler ruft die L1-Brücke auf (`depositERC20`, `depositERC20To`, `depositETH` oder `depositETHTo`) +3. Die L1-Brücke nimmt das überbrückte Asset in Besitz. + - ETH: Das Asset wird vom Einzahler als Teil des Aufrufs übertragen. + - ERC-20: Das Asset wird von der Brücke unter Verwendung der vom Einzahler erteilten Freigabe an sich selbst übertragen. +4. Die L1-Brücke verwendet den domänenübergreifenden Nachrichtenmechanismus, um `finalizeDeposit` auf der L2-Brücke aufzurufen. + +#### Layer 2 {#deposit-flow-layer-2} + +5. Die L2-Brücke überprüft, ob der Aufruf von `finalizeDeposit` rechtmäßig ist: + - Kam vom domänenübergreifenden Nachrichtenvertrag + - War ursprünglich von der Brücke auf L1 +6. Die L2-Brücke prüft, ob der ERC-20-Token-Vertrag auf L2 der richtige ist: + - Der L2-Vertrag meldet, dass sein L1-Gegenstück dasselbe ist wie das, von dem die Tokens auf L1 kamen + - Der L2-Vertrag meldet, dass er die richtige Schnittstelle unterstützt ([unter Verwendung von ERC-165](https://eips.ethereum.org/EIPS/eip-165)). +7. Wenn der L2-Vertrag der richtige ist, rufen Sie ihn auf, um die entsprechende Anzahl von Tokens an die entsprechende Adresse zu prägen. Wenn nicht, starten Sie einen Auszahlungsprozess, damit der Benutzer die Tokens auf L1 beanspruchen kann. + +### Auszahlungsablauf {#withdrawal-flow} + +#### Layer 2 {#withdrawal-flow-layer-2} + +1. Der Auszahlende ruft die L2-Brücke auf (`withdraw` oder `withdrawTo`) +2. Die L2-Brücke verbrennt die entsprechende Anzahl von Tokens, die `msg.sender` gehören. +3. Die L2-Brücke verwendet den domänenübergreifenden Nachrichtenmechanismus, um `finalizeETHWithdrawal` oder `finalizeERC20Withdrawal` auf der L1-Brücke aufzurufen. + +#### Layer 1 {#withdrawal-flow-layer-1} + +4. Die L1-Brücke überprüft, ob der Aufruf von `finalizeETHWithdrawal` oder `finalizeERC20Withdrawal` rechtmäßig ist: + - Kam vom domänenübergreifenden Nachrichtenmechanismus + - War ursprünglich von der Brücke auf L2 +5. Die L1-Brücke überträgt das entsprechende Asset (ETH oder ERC-20) an die entsprechende Adresse. + +## Layer-1-Code {#layer-1-code} + +Dies ist der Code, der auf L1, dem Ethereum Mainnet, läuft. + +### IL1ERC20Bridge {#IL1ERC20Bridge} + +[Diese Schnittstelle ist hier definiert](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1ERC20Bridge.sol). +Sie enthält Funktionen und Definitionen, die für die Überbrückung von ERC-20-Tokens erforderlich sind. + +```solidity +// SPDX-License-Identifier: MIT +``` + +[Der größte Teil des Codes von Optimism wird unter der MIT-Lizenz veröffentlicht](https://help.optimism.io/hc/en-us/articles/4411908707995-What-software-license-does-Optimism-use-). + +```solidity +pragma solidity >0.5.0 <0.9.0; +``` + +Zum Zeitpunkt des Schreibens ist die neueste Version von Solidity 0.8.12. +Bis zur Veröffentlichung von Version 0.9.0 wissen wir nicht, ob dieser Code damit kompatibel ist oder nicht. + +```solidity +/** + * @title IL1ERC20Bridge + */ +interface IL1ERC20Bridge { + /********** + * Ereignisse * + **********/ + + event ERC20DepositInitiated( +``` + +In der Terminologie der Optimism-Brücke bedeutet _Einzahlung_ eine Übertragung von L1 nach L2 und _Auszahlung_ eine Übertragung von L2 nach L1. + +```solidity + address indexed _l1Token, + address indexed _l2Token, +``` + +In den meisten Fällen ist die Adresse eines ERC-20 auf L1 nicht dieselbe wie die Adresse des entsprechenden ERC-20 auf L2. +[Sie können die Liste der Token-Adressen hier einsehen](https://static.optimism.io/optimism.tokenlist.json). +Die Adresse mit `chainId` 1 befindet sich auf L1 (Mainnet) und die Adresse mit `chainId` 10 auf L2 (Optimism). +Die anderen beiden `chainId`-Werte sind für das Kovan-Testnetz (42) und das Optimistic Kovan-Testnetz (69). + +```solidity + address indexed _from, + address _to, + uint256 _amount, + bytes _data + ); +``` + +Es ist möglich, Notizen zu Übertragungen hinzuzufügen, in diesem Fall werden sie zu den Ereignissen hinzugefügt, die sie melden. + +```solidity + event ERC20WithdrawalFinalized( + address indexed _l1Token, + address indexed _l2Token, + address indexed _from, + address _to, + uint256 _amount, + bytes _data + ); +``` + +Derselbe Brückenvertrag behandelt Übertragungen in beide Richtungen. +Im Fall der L1-Brücke bedeutet dies die Initiierung von Einzahlungen und die Finalisierung von Auszahlungen. + +```solidity + + /******************** + * Öffentliche Funktionen * + ********************/ + + /** + * @dev Ruft die Adresse des entsprechenden L2-Brückenvertrags ab. + * @return Adresse des entsprechenden L2-Brückenvertrags. + */ + function l2TokenBridge() external returns (address); +``` + +Diese Funktion wird nicht wirklich benötigt, da es sich auf L2 um einen vorab bereitgestellten Vertrag (predeployed contract) handelt, der sich also immer an der Adresse `0x4200000000000000000000000000000000000010` befindet. +Sie ist hier aus Symmetriegründen zur L2-Brücke, da die Adresse der L1-Brücke _nicht_ trivial zu kennen ist. + +```solidity + /** + * @dev Zahlt einen Betrag des ERC20 auf das Guthaben des Aufrufers auf L2 ein. + * @param _l1Token Adresse des L1 ERC20, das wir einzahlen. + * @param _l2Token Adresse des entsprechenden L2 ERC20. + * @param _amount Einzuzahlender Betrag des ERC20. + * @param _l2Gas Erforderliches Gaslimit, um die Einzahlung auf L2 abzuschließen. + * @param _data Optionale Daten zur Weiterleitung an L2. Diese Daten werden + * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über ihren Inhalt. + */ + function depositERC20( + address _l1Token, + address _l2Token, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) external; +``` + +Der Parameter `_l2Gas` ist die Menge an L2-Gas, die die Transaktion verbrauchen darf. +[Bis zu einem bestimmten (hohen) Limit ist dies kostenlos](https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions-2), daher sollte es kein Problem sein, es sei denn, der ERC-20-Vertrag macht beim Prägen etwas wirklich Seltsames. +Diese Funktion kümmert sich um das übliche Szenario, bei dem ein Benutzer Assets an dieselbe Adresse auf einer anderen Blockchain überbrückt. + +```solidity + /** + * @dev zahlt einen Betrag von ERC20 auf das Guthaben eines Empfängers auf L2 ein. + * @param _l1Token Adresse des L1 ERC20, den wir einzahlen + * @param _l2Token Adresse des entsprechenden L2 ERC20 auf L1 + * @param _to L2-Adresse, auf die die Abhebung gutgeschrieben werden soll. + * @param _amount Einzuzahlender Betrag des ERC20. + * @param _l2Gas Gaslimit, das erforderlich ist, um die Einzahlung auf L2 abzuschließen. + * @param _data Optionale Daten zur Weiterleitung an L2. Diese Daten werden + * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über ihren Inhalt. + */ + function depositERC20To( + address _l1Token, + address _l2Token, + address _to, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) external; +``` + +Diese Funktion ist fast identisch mit `depositERC20`, aber sie ermöglicht es Ihnen, den ERC-20 an eine andere Adresse zu senden. + +```solidity + /************************* + * Cross-Chain-Funktionen * + *************************/ + + /** + * @dev Schließt eine Auszahlung von L2 nach L1 ab und schreibt den Betrag dem Guthaben des + * L1-ERC20-Tokens des Empfängers gut. + * Dieser Aufruf schlägt fehl, wenn die initiierte Auszahlung von L2 noch nicht finalisiert wurde. + * + * @param _l1Token Adresse des L1-Tokens, für das finalizeWithdrawal ausgeführt wird. + * @param _l2Token Adresse des L2-Tokens, auf dem die Auszahlung eingeleitet wurde. + * @param _from L2-Adresse, die die Übertragung initiiert. + * @param _to L1-Adresse, der die Auszahlung gutgeschrieben werden soll. + * @param _amount Einzuzahlender Betrag des ERC20. + * @param _data Vom Absender auf L2 bereitgestellte Daten. Diese Daten werden + * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über ihren Inhalt. + */ + function finalizeERC20Withdrawal( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external; +} +``` + +Auszahlungen (und andere Nachrichten von L2 nach L1) in Optimism sind ein zweistufiger Prozess: + +1. Eine initiierende Transaktion auf L2. +2. Eine finalisierende oder beanspruchende Transaktion auf L1. + Diese Transaktion muss nach dem Ende des [Fehler-Anfechtungszeitraums](https://community.optimism.io/docs/how-optimism-works/#fault-proofs) für die L2-Transaktion erfolgen. + +### IL1StandardBridge {#il1standardbridge} + +[Diese Schnittstelle ist hier definiert](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1StandardBridge.sol). +Diese Datei enthält Ereignis- und Funktionsdefinitionen für ETH. +Diese Definitionen sind sehr ähnlich zu denen, die oben in `IL1ERC20Bridge` für ERC-20 definiert wurden. + +Die Brückenschnittstelle ist auf zwei Dateien aufgeteilt, da einige ERC-20-Tokens eine benutzerdefinierte Verarbeitung erfordern und nicht von der Standardbrücke verarbeitet werden können. +Auf diese Weise kann die benutzerdefinierte Brücke, die einen solchen Token verarbeitet, `IL1ERC20Bridge` implementieren und muss nicht auch ETH überbrücken. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >0.5.0 <0.9.0; + +import "./IL1ERC20Bridge.sol"; + +/** + * @title IL1StandardBridge + */ +interface IL1StandardBridge is IL1ERC20Bridge { + /********** + * Ereignisse * + **********/ + event ETHDepositInitiated( + address indexed _from, + address indexed _to, + uint256 _amount, + bytes _data + ); +``` + +Dieses Ereignis ist fast identisch mit der ERC-20-Version (`ERC20DepositInitiated`), jedoch ohne die L1- und L2-Token-Adressen. +Dasselbe gilt für die anderen Ereignisse und die Funktionen. + +```solidity + event ETHWithdrawalFinalized( + . + . + . + ); + + /******************** + * Öffentliche Funktionen * + ********************/ + + /** + * @dev Einzahlung eines ETH-Betrags in das Guthaben des Aufrufers auf L2. + . + . + . + */ + function depositETH(uint32 _l2Gas, bytes calldata _data) external payable; + + /** + * @dev Einzahlung eines ETH-Betrags in das Guthaben eines Empfängers auf L2. + . + . + . + */ + function depositETHTo( + address _to, + uint32 _l2Gas, + bytes calldata _data + ) external payable; + + /************************* + * Cross-Chain-Funktionen * + *************************/ + + /** + * @dev Schließen Sie eine Auszahlung von L2 nach L1 ab und schreiben Sie den Betrag dem Guthaben des L1-ETH-Tokens des Empfängers gut. + * Da nur der xDomainMessenger diese Funktion aufrufen kann, wird sie niemals aufgerufen + * bevor die Auszahlung finalisiert ist. + . + . + . + */ + function finalizeETHWithdrawal( + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external; +} +``` + +### CrossDomainEnabled {#crossdomainenabled} + +[Dieser Vertrag](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol) wird von beiden Brücken ([L1](#the-l1-bridge-contract) und [L2](#the-l2-bridge-contract)) geerbt, um Nachrichten an den anderen Layer zu senden. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >0.5.0 <0.9.0; + +/* Schnittstellen-Importe */ +import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol"; +``` + +[Diese Schnittstelle](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/ICrossDomainMessenger.sol) teilt dem Vertrag mit, wie Nachrichten an den anderen Layer gesendet werden sollen, indem der Cross-Domain-Messenger verwendet wird. +Dieser Cross-Domain-Messenger ist ein ganz anderes System und verdient einen eigenen Artikel, den ich hoffentlich in Zukunft schreiben werde. + +```solidity +/** + * @title CrossDomainEnabled + * @dev Hilfsvertrag für Verträge, die domänenübergreifende Kommunikation durchführen + * + * Verwendeter Compiler: definiert durch vererbenden Vertrag + */ +contract CrossDomainEnabled { + /************* + * Variablen * + *************/ + + // Messenger-Vertrag, der zum Senden und Empfangen von Nachrichten aus der anderen Domäne verwendet wird. + address public messenger; + + /*************** + * Konstruktor * + ***************/ + + /** + * @param _messenger Adresse des CrossDomainMessenger auf der aktuellen Ebene. + */ + constructor(address _messenger) { + messenger = _messenger; + } +``` + +Der eine Parameter, den der Vertrag kennen muss, ist die Adresse des Cross-Domain-Messengers auf diesem Layer. +Dieser Parameter wird einmal im Konstruktor gesetzt und ändert sich nie. + +```solidity + + /********************** + * Funktionsmodifikatoren * + **********************/ + + /** + * Erzwingt, dass die modifizierte Funktion nur von einem bestimmten domänenübergreifenden Konto aufgerufen werden kann. + * @param _sourceDomainAccount Das einzige Konto in der Ursprungsdomäne, das + * zur Ausführung dieser Funktion berechtigt ist. + */ + modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) { +``` + +Das domänenübergreifende Messaging ist für jeden Vertrag auf der Blockchain zugänglich, auf der es läuft (entweder Ethereum Mainnet oder Optimism). +Aber wir brauchen die Brücke auf jeder Seite, um _nur_ bestimmten Nachrichten zu vertrauen, wenn sie von der Brücke auf der anderen Seite kommen. + +```solidity + require( + msg.sender == address(getCrossDomainMessenger()), + "OVM_XCHAIN: messenger contract unauthenticated" + ); +``` + +Nur Nachrichten vom entsprechenden Cross-Domain-Messenger (`messenger`, wie Sie unten sehen) können als vertrauenswürdig eingestuft werden. + +```solidity + + require( + getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount, + "OVM_XCHAIN: wrong sender of cross-domain message" + ); +``` + +Die Art und Weise, wie der Cross-Domain-Messenger die Adresse bereitstellt, die eine Nachricht mit dem anderen Layer gesendet hat, ist [die Funktion `.xDomainMessageSender()`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1CrossDomainMessenger.sol#L122-L128). +Solange sie in der Transaktion aufgerufen wird, die durch die Nachricht initiiert wurde, kann sie diese Information bereitstellen. + +Wir müssen sicherstellen, dass die Nachricht, die wir erhalten haben, von der anderen Brücke kam. + +```solidity + + _; + } + + /********************** + * Interne Funktionen * + **********************/ + + /** + * Ruft den Messenger ab, normalerweise aus dem Speicher. Diese Funktion wird für den Fall verfügbar gemacht, dass ein untergeordneter Vertrag + * sie überschreiben muss. + * @return Die Adresse des Cross-Domain-Messenger-Vertrags, der verwendet werden sollte. + */ + function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) { + return ICrossDomainMessenger(messenger); + } +``` + +Diese Funktion gibt den Cross-Domain-Messenger zurück. +Wir verwenden eine Funktion anstelle der Variable `messenger`, um Verträgen, die von diesem erben, zu ermöglichen, einen Algorithmus zu verwenden, um anzugeben, welcher Cross-Domain-Messenger verwendet werden soll. + +```solidity + + /** + * Sendet eine Nachricht an ein Konto in einer anderen Domäne + * @param _crossDomainTarget Der beabsichtigte Empfänger in der Zieldomäne + * @param _message Die an das Ziel zu sendenden Daten (normalerweise Calldata an eine Funktion mit + * `onlyFromCrossDomainAccount()`) + * @param _gasLimit Das GasLimit für den Empfang der Nachricht in der Zieldomäne. + */ + function sendCrossDomainMessage( + address _crossDomainTarget, + uint32 _gasLimit, + bytes memory _message +``` + +Schließlich die Funktion, die eine Nachricht an den anderen Layer sendet. + +```solidity + ) internal { + // slither-disable-next-line reentrancy-events, reentrancy-benign +``` + +[Slither](https://github.com/crytic/slither) ist ein statischer Analysator, den Optimism auf jedem Vertrag ausführt, um nach Schwachstellen und anderen potenziellen Problemen zu suchen. +In diesem Fall löst die folgende Zeile zwei Schwachstellen aus: + +1. [Reentrancy-Ereignisse](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3) +2. [Gutartige Wiedereintrittsfähigkeit](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2) + +```solidity + getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit); + } +} +``` + +In diesem Fall machen wir uns keine Sorgen über Wiedereintrittsfähigkeit, da wir wissen, dass `getCrossDomainMessenger()` eine vertrauenswürdige Adresse zurückgibt, auch wenn Slither keine Möglichkeit hat, das zu wissen. + +### Der L1-Brückenvertrag {#the-l1-bridge-contract} + +[Der Quellcode für diesen Vertrag befindet sich hier](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1StandardBridge.sol). + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; +``` + +Die Schnittstellen können Teil anderer Verträge sein, daher müssen sie eine breite Palette von Solidity-Versionen unterstützen. +Aber die Brücke selbst ist unser Vertrag, und wir können streng sein, welche Solidity-Version sie verwendet. + +```solidity +/* Schnittstellen-Importe */ +import { IL1StandardBridge } from "./IL1StandardBridge.sol"; +import { IL1ERC20Bridge } from "./IL1ERC20Bridge.sol"; +``` + +[IL1ERC20Bridge](#IL1ERC20Bridge) und [IL1StandardBridge](#IL1StandardBridge) werden oben erklärt. + +```solidity +import { IL2ERC20Bridge } from "../../L2/messaging/IL2ERC20Bridge.sol"; +``` + +[Diese Schnittstelle](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) ermöglicht es uns, Nachrichten zu erstellen, um die Standardbrücke auf L2 zu steuern. + +```solidity +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +``` + +[Diese Schnittstelle](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) ermöglicht es uns, ERC-20-Verträge zu steuern. +[Hier können Sie mehr darüber lesen](/developers/tutorials/erc20-annotated-code/#the-interface). + +```solidity +/* Bibliotheks-Importe */ +import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; +``` + +[Wie oben erklärt](#crossdomainenabled), wird dieser Vertrag für die Interlayer-Nachrichtenübermittlung verwendet. + +```solidity +import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol"; +``` + +`Lib_PredeployAddresses` (https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/constants/Lib_PredeployAddresses.sol) hat die Adressen für die L2-Verträge, die immer dieselbe Adresse haben. Dies schließt die Standard-Brücke auf L2 mit ein. + +```solidity +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +``` + +[OpenZeppelins Address-Dienstprogramme](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol). Es wird verwendet, um zwischen Vertragsadressen und solchen zu unterscheiden, die zu extern besessenen Konten (EOA) gehören. + +Beachten Sie, dass dies keine perfekte Lösung ist, da es keine Möglichkeit gibt, zwischen direkten Aufrufen und Aufrufen aus dem Konstruktor eines Vertrags zu unterscheiden, aber zumindest können wir so einige häufige Benutzerfehler identifizieren und verhindern. + +```solidity +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +``` + +[Der ERC-20-Standard](https://eips.ethereum.org/EIPS/eip-20) unterstützt zwei Möglichkeiten für einen Vertrag, einen Fehler zu melden: + +1. Zurücksetzen (revert) +2. `false` zurückgeben + +Die Handhabung beider Fälle würde unseren Code komplizierter machen, daher verwenden wir stattdessen [OpenZeppelins `SafeERC20`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol), das sicherstellt, dass [alle Fehler zu einem Revert führen](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol#L96). + +```solidity +/** + * @title L1StandardBridge + * @dev Die L1-ETH- und ERC20-Brücke ist ein Vertrag, der hinterlegte L1-Mittel und Standard-Token + * speichert, die auf L2 verwendet werden. Sie synchronisiert eine entsprechende L2-Brücke, informiert sie über Einzahlungen + * und hört auf sie für neu finalisierte Auszahlungen. + * + */ +contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled { + using SafeERC20 for IERC20; +``` + +Diese Zeile gibt an, dass der `SafeERC20`-Wrapper jedes Mal verwendet werden soll, wenn wir die `IERC20`-Schnittstelle verwenden. + +```solidity + + /******************************** + * Externe Vertragsreferenzen * + ********************************/ + + address public l2TokenBridge; +``` + +Die Adresse von [L2StandardBridge](#the-l2-bridge-contract). + +```solidity + + // Ordnet L1-Token zu L2-Token zu Saldo des hinterlegten L1-Tokens zu + mapping(address => mapping(address => uint256)) public deposits; +``` + +Ein doppeltes [Mapping](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) wie dieses ist die Art und Weise, wie Sie ein [zweidimensionales dünn besetztes Array](https://en.wikipedia.org/wiki/Sparse_matrix) definieren. +Werte in dieser Datenstruktur werden als `deposit[L1-Token-Adresse][L2-Token-Adresse]` identifiziert. +Der Standardwert ist Null. +Nur Zellen, die auf einen anderen Wert gesetzt sind, werden in den Speicher geschrieben. + +```solidity + + /*************** + * Konstruktor * + ***************/ + + // Dieser Vertrag lebt hinter einem Proxy, daher werden die Konstruktorparameter ungenutzt bleiben. + constructor() CrossDomainEnabled(address(0)) {} +``` + +Wir wollen diesen Vertrag aktualisieren können, ohne alle Variablen im Speicher kopieren zu müssen. +Dazu verwenden wir einen [`Proxy`](https://docs.openzeppelin.com/contracts/3.x/api/proxy), einen Vertrag, der `delegatecall` verwendet, um Aufrufe an einen separaten Vertrag zu übertragen, dessen Adresse vom Proxy-Vertrag gespeichert wird (wenn Sie ein Upgrade durchführen, weisen Sie den Proxy an, diese Adresse zu ändern). +Wenn Sie `delegatecall` verwenden, bleibt der Speicher der Speicher des _aufrufenden_ Vertrags, sodass die Werte aller Vertragszustandsvariablen unberührt bleiben. + +Ein Effekt dieses Musters ist, dass der Speicher des Vertrags, der der _Aufgerufene_ von `delegatecall` ist, nicht verwendet wird und daher die an ihn übergebenen Konstruktorwerte keine Rolle spielen. +Dies ist der Grund, warum wir dem `CrossDomainEnabled`-Konstruktor einen unsinnigen Wert übergeben können. +Dies ist auch der Grund, warum die folgende Initialisierung vom Konstruktor getrennt ist. + +```solidity + /****************** + * Initialisierung * + ******************/ + + /** + * @param _l1messenger L1 Messenger-Adresse, die für die Cross-Chain-Kommunikation verwendet wird. + * @param _l2TokenBridge L2-Standard-Brückenadresse. + */ + // slither-disable-next-line external-function +``` + +Dieser [Slither-Test](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external) identifiziert Funktionen, die nicht aus dem Vertragscode aufgerufen werden und daher als `external` anstatt `public` deklariert werden könnten. +Die Gaskosten von `external`-Funktionen können niedriger sein, da sie mit Parametern in den Calldata versorgt werden können. +Als `public` deklarierte Funktionen müssen innerhalb des Vertrags zugänglich sein. +Verträge können ihre eigenen Calldata nicht ändern, daher müssen sich die Parameter im Speicher befinden. +Wenn eine solche Funktion extern aufgerufen wird, ist es notwendig, die Calldata in den Speicher zu kopieren, was Gas kostet. +In diesem Fall wird die Funktion nur einmal aufgerufen, sodass die Ineffizienz für uns keine Rolle spielt. + +```solidity + function initialize(address _l1messenger, address _l2TokenBridge) public { + require(messenger == address(0), "Vertrag wurde bereits initialisiert."); +``` + +Die `initialize`-Funktion sollte nur einmal aufgerufen werden. +Wenn sich die Adresse des L1-Cross-Domain-Messengers oder der L2-Token-Brücke ändert, erstellen wir einen neuen Proxy und eine neue Brücke, die ihn aufruft. +Dies wird wahrscheinlich nur bei einem Upgrade des gesamten Systems geschehen, ein sehr seltenes Ereignis. + +Beachten Sie, dass diese Funktion keinen Mechanismus hat, der einschränkt, _wer_ sie aufrufen kann. +Das bedeutet, dass ein Angreifer theoretisch warten könnte, bis wir den Proxy und die erste Version der Brücke deployen, und dann [Front-Running betreiben](https://solidity-by-example.org/hacks/front-running/) könnte, um zur `initialize`-Funktion zu gelangen, bevor der legitime Benutzer dies tut. Es gibt jedoch zwei Methoden, um dies zu verhindern: + +1. Wenn die Verträge nicht direkt von einem EOA, sondern [in einer Transaktion bereitgestellt werden, in der ein anderer Vertrag sie erstellt](https://medium.com/upstate-interactive/creating-a-contract-with-a-smart-contract-bdb67c5c8595), kann der gesamte Prozess atomar sein und abgeschlossen werden, bevor eine andere Transaktion ausgeführt wird. +2. Wenn der legitime Aufruf von `initialize` fehlschlägt, ist es immer möglich, den neu erstellten Proxy und die Brücke zu ignorieren und neue zu erstellen. + +```solidity + messenger = _l1messenger; + l2TokenBridge = _l2TokenBridge; + } +``` + +Dies sind die beiden Parameter, die die Brücke kennen muss. + +```solidity + + /************** + * Einzahlung * + **************/ + + /** @dev Modifikator, der erfordert, dass der Absender ein EOA ist. Diese Prüfung könnte von einem bösartigen + * Vertrag über initcode umgangen werden, aber sie kümmert sich um den Benutzerfehler, den wir vermeiden wollen. + */ + modifier onlyEOA() { + // Wird verwendet, um Einzahlungen von Verträgen zu stoppen (verhindert versehentlich verlorene Tokens) + require(!Address.isContract(msg.sender), "Konto nicht EOA"); + _; + } +``` + +Dies ist der Grund, warum wir die `Address`-Dienstprogramme von OpenZeppelin benötigten. + +```solidity + /** + * @dev Diese Funktion kann ohne Daten aufgerufen werden + * um einen Betrag von ETH auf das Guthaben des Aufrufers auf L2 einzuzahlen. + * Da die Empfangsfunktion keine Daten entgegennimmt, wird ein konservativer + * Standardbetrag an L2 weitergeleitet. + */ + receive() external payable onlyEOA { + _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes("")); + } +``` + +Diese Funktion existiert zu Testzwecken. +Beachten Sie, dass sie nicht in den Schnittstellendefinitionen erscheint – sie ist nicht für den normalen Gebrauch bestimmt. + +```solidity + /** + * @inheritdoc IL1StandardBridge + */ + function depositETH(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA { + _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data); + } + + /** + * @inheritdoc IL1StandardBridge + */ + function depositETHTo( + address _to, + uint32 _l2Gas, + bytes calldata _data + ) external payable { + _initiateETHDeposit(msg.sender, _to, _l2Gas, _data); + } +``` + +Diese beiden Funktionen sind Wrapper um `_initiateETHDeposit`, die Funktion, die die eigentliche ETH-Einzahlung abwickelt. + +```solidity + /** + * @dev Führt die Logik für Einzahlungen durch, indem der ETH gespeichert und das L2-ETH-Gateway + * über die Einzahlung informiert wird. + * @param _from Konto, von dem die Einzahlung auf L1 abgezogen wird. + * @param _to Konto, dem die Einzahlung auf L2 gutgeschrieben wird. + * @param _l2Gas Gaslimit, das erforderlich ist, um die Einzahlung auf L2 abzuschließen. + * @param _data Optionale Daten zur Weiterleitung an L2. Diese Daten werden + * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über ihren Inhalt. + */ + function _initiateETHDeposit( + address _from, + address _to, + uint32 _l2Gas, + bytes memory _data + ) internal { + // Konstruiere Calldata für den finalizeDeposit-Aufruf + bytes memory message = abi.encodeWithSelector( +``` + +Die Funktionsweise von Cross-Domain-Nachrichten besteht darin, dass der Zielvertrag mit der Nachricht als Calldata aufgerufen wird. +Solidity-Verträge interpretieren ihre Calldata immer gemäß +[den ABI-Spezifikationen](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html). +Die Solidity-Funktion [`abi.encodeWithSelector`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#abi-encoding-and-decoding-functions) erstellt diese Calldata. + +```solidity + IL2ERC20Bridge.finalizeDeposit.selector, + address(0), + Lib_PredeployAddresses.OVM_ETH, + _from, + _to, + msg.value, + _data + ); +``` + +Die Nachricht hier ist, [die Funktion `finalizeDeposit`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148) mit diesen Parametern aufzurufen: + +| Parameter | Wert | Bedeutung | +| ------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| \_l1Token | Adresse(0) | Sonderwert für ETH (das kein ERC-20-Token ist) auf L1 | +| \_l2Token | Lib_PredeployAddresses.OVM_ETH | Der L2-Vertrag, der ETH auf Optimism verwaltet, `0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000` (dieser Vertrag ist nur für den internen Gebrauch von Optimism bestimmt) | +| \_from | \_from | Die Adresse auf L1, die die ETH sendet | +| \_to | \_to | Die Adresse auf L2, die die ETH empfängt | +| Betrag | msg.value | Gesendeter Betrag in Wei (der bereits an die Brücke gesendet wurde) | +| \_data | \_data | Zusätzliche Daten, die an die Einzahlung angehängt werden | + +```solidity + // Senden Sie Calldata nach L2 + // slither-disable-next-line reentrancy-events + sendCrossDomainMessage(l2TokenBridge, _l2Gas, message); +``` + +Senden Sie die Nachricht über den Cross-Domain-Messenger. + +```solidity + // slither-disable-next-line reentrancy-events + emit ETHDepositInitiated(_from, _to, msg.value, _data); + } +``` + +Ein Ereignis auslösen, um jede dezentralisierte Anwendung, die zuhört, über diese Übertragung zu informieren. + +```solidity + /** + * @inheritdoc IL1ERC20Bridge + */ + function depositERC20( + . + . + . + ) external virtual onlyEOA { + _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data); + } + + /** + * @inheritdoc IL1ERC20Bridge + */ + function depositERC20To( + . + . + . + ) external virtual { + _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data); + } +``` + +Diese beiden Funktionen sind Wrapper um `_initiateERC20Deposit`, die Funktion, die die eigentliche ERC-20-Einzahlung abwickelt. + +```solidity + /** + * @dev Führt die Logik für Einzahlungen durch, indem der L2 Deposited Token + * Vertrag über die Einzahlung informiert wird und ein Handler aufgerufen wird, um die L1-Mittel zu sperren. (z. B. transferFrom) + * + * @param _l1Token Adresse des L1 ERC20, den wir einzahlen + * @param _l2Token Adresse des entsprechenden L2 ERC20 auf L1 + * @param _from Konto, von dem die Einzahlung auf L1 abgezogen wird + * @param _to Konto, dem die Einzahlung auf L2 gutgeschrieben wird + * @param _amount Einzuzahlender Betrag des ERC20. + * @param _l2Gas Gaslimit, das erforderlich ist, um die Einzahlung auf L2 abzuschließen. + * @param _data Optionale Daten zur Weiterleitung an L2. Diese Daten werden + * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über ihren Inhalt. + */ + function _initiateERC20Deposit( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) internal { +``` + +Diese Funktion ist ähnlich wie `_initiateETHDeposit` oben, mit einigen wichtigen Unterschieden. +Der erste Unterschied besteht darin, dass diese Funktion die Token-Adressen und den zu übertragenden Betrag als Parameter erhält. +Im Fall von ETH enthält der Aufruf der Brücke bereits die Übertragung des Assets auf das Brückenkonto (`msg.value`). + +```solidity + // Wenn eine Einzahlung auf L1 initiiert wird, überträgt die L1-Brücke die Mittel an sich selbst für zukünftige + // Auszahlungen. safeTransferFrom prüft auch, ob der Vertrag Code hat, sodass dies fehlschlägt, wenn + // _from ein EOA oder address(0) ist. + // slither-disable-next-line reentrancy-events, reentrancy-benign + IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount); +``` + +Übertragungen von ERC-20-Token folgen einem anderen Prozess als ETH: + +1. Der Benutzer (`_from`) erteilt der Brücke eine Freigabe, um die entsprechenden Tokens zu übertragen. +2. Der Benutzer ruft die Brücke mit der Adresse des Token-Vertrags, dem Betrag usw. auf. +3. Die Brücke überträgt die Tokens (an sich selbst) als Teil des Einzahlungsprozesses. + +Der erste Schritt kann in einer separaten Transaktion von den letzten beiden erfolgen. +Front-Running ist jedoch kein Problem, da die beiden Funktionen, die `_initiateERC20Deposit` aufrufen (`depositERC20` und `depositERC20To`), diese Funktion nur mit `msg.sender` als `_from`-Parameter aufrufen. + +```solidity + // Konstruiere Calldata für _l2Token.finalizeDeposit(_to, _amount) + bytes memory message = abi.encodeWithSelector( + IL2ERC20Bridge.finalizeDeposit.selector, + _l1Token, + _l2Token, + _from, + _to, + _amount, + _data + ); + + // Sende Calldata nach L2 + // slither-disable-next-line reentrancy-events, reentrancy-benign + sendCrossDomainMessage(l2TokenBridge, _l2Gas, message); + + // slither-disable-next-line reentrancy-benign + deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount; +``` + +Fügen Sie den eingezahlten Betrag an Tokens zur `deposits`-Datenstruktur hinzu. +Es könnten mehrere Adressen auf L2 vorhanden sein, die demselben L1-ERC-20-Token entsprechen, daher ist es nicht ausreichend, das Guthaben der Brücke am L1-ERC-20-Token zu verwenden, um die Einzahlungen zu verfolgen. + +```solidity + + // slither-disable-next-line reentrancy-events + emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data); + } + + /************************* + * Cross-Chain-Funktionen * + *************************/ + + /** + * @inheritdoc IL1StandardBridge + */ + function finalizeETHWithdrawal( + address _from, + address _to, + uint256 _amount, + bytes calldata _data +``` + +Die L2-Brücke sendet eine Nachricht an den L2-Cross-Domain-Messenger, der bewirkt, dass der L1-Cross-Domain-Messenger diese Funktion aufruft (natürlich sobald die [Transaktion, die die Nachricht finalisiert](https://community.optimism.io/docs/developers/bridge/messaging/#fees-for-l2-%E2%87%92-l1-transactions), auf L1 übermittelt wurde). + +```solidity + ) external onlyFromCrossDomainAccount(l2TokenBridge) { +``` + +Stellen Sie sicher, dass dies eine _legitime_ Nachricht ist, die vom Cross-Domain-Messenger kommt und von der L2-Token-Brücke stammt. +Diese Funktion wird verwendet, um ETH von der Brücke abzuheben, daher müssen wir sicherstellen, dass sie nur vom autorisierten Aufrufer aufgerufen wird. + +```solidity + // slither-disable-next-line reentrancy-events + (bool success, ) = _to.call{ value: _amount }(new bytes(0)); +``` + +Die Art und Weise, ETH zu übertragen, besteht darin, den Empfänger mit dem Betrag in Wei im `msg.value` aufzurufen. + +```solidity + require(success, "TransferHelper::safeTransferETH: ETH transfer failed"); + + // slither-disable-next-line reentrancy-events + emit ETHWithdrawalFinalized(_from, _to, _amount, _data); +``` + +Ein Ereignis über die Auszahlung auslösen. + +```solidity + } + + /** + * @inheritdoc IL1ERC20Bridge + */ + function finalizeERC20Withdrawal( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external onlyFromCrossDomainAccount(l2TokenBridge) { +``` + +Diese Funktion ist ähnlich wie `finalizeETHWithdrawal` oben, mit den notwendigen Änderungen für ERC-20-Tokens. + +```solidity + deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount; +``` + +Aktualisieren Sie die `deposits`-Datenstruktur. + +```solidity + + // Wenn eine Auszahlung auf L1 finalisiert wird, überträgt die L1-Brücke die Mittel an den Auszahlenden + // slither-disable-next-line reentrancy-events + IERC20(_l1Token).safeTransfer(_to, _amount); + + // slither-disable-next-line reentrancy-events + emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data); + } + + + /***************************** + * Vorübergehend - Migration von ETH * + *****************************/ + + /** + * @dev Fügt ETH-Guthaben zum Konto hinzu. Dies soll ermöglichen, dass ETH + * von einem alten Gateway zu einem neuen Gateway migriert wird. + * HINWEIS: Dies wird nur für ein Upgrade beibehalten, damit wir die migrierte ETH aus dem + * alten Vertrag empfangen können + */ + function donateETH() external payable {} +} +``` + +Es gab eine frühere Implementierung der Brücke. +Als wir von dieser Implementierung zu dieser wechselten, mussten wir alle Assets verschieben. +ERC-20-Tokens können einfach verschoben werden. +Um jedoch ETH an einen Vertrag zu übertragen, benötigen Sie die Zustimmung dieses Vertrags, was uns `donateETH` bietet. + +## ERC-20-Tokens auf L2 {#erc-20-tokens-on-l2} + +Damit ein ERC-20-Token in die Standardbrücke passt, muss es der Standardbrücke und _nur_ der Standardbrücke erlauben, Token zu prägen. +Dies ist notwendig, weil die Brücken sicherstellen müssen, dass die Anzahl der auf Optimism zirkulierenden Tokens gleich der Anzahl der im L1-Brückenvertrag gesperrten Tokens ist. +Wenn es zu viele Tokens auf L2 gibt, könnten einige Benutzer ihre Assets nicht zurück auf L1 überbrücken. +Anstelle einer vertrauenswürdigen Brücke würden wir im Wesentlichen [Mindestreservebanking](https://www.investopedia.com/terms/f/fractionalreservebanking.asp) nachbilden. +Wenn es zu viele Tokens auf L1 gibt, würden einige dieser Tokens für immer im Brückenvertrag gesperrt bleiben, weil es keine Möglichkeit gibt, sie ohne das Verbrennen von L2-Tokens freizugeben. + +### IL2StandardERC20 {#il2standarderc20} + +Jeder ERC-20-Token auf L2, der die Standardbrücke verwendet, muss [diese Schnittstelle](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/IL2StandardERC20.sol) bereitstellen, die die Funktionen und Ereignisse enthält, die die Standardbrücke benötigt. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +``` + +[Die Standard-ERC-20-Schnittstelle](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) enthält nicht die Funktionen `mint` und `burn`. +Diese Methoden sind nicht durch [den ERC-20-Standard](https://eips.ethereum.org/EIPS/eip-20) vorgeschrieben, der die Mechanismen zur Erstellung und Zerstörung von Tokens nicht spezifiziert. + +```solidity +import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +``` + +[Die ERC-165-Schnittstelle](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol) wird verwendet, um anzugeben, welche Funktionen ein Vertrag bereitstellt. +[Sie können den Standard hier lesen](https://eips.ethereum.org/EIPS/eip-165). + +```solidity +interface IL2StandardERC20 is IERC20, IERC165 { + function l1Token() external returns (address); +``` + +Diese Funktion gibt die Adresse des L1-Tokens an, das auf diesen Vertrag überbrückt wird. +Beachten Sie, dass wir keine ähnliche Funktion in die entgegengesetzte Richtung haben. +Wir müssen in der Lage sein, jeden L1-Token zu überbrücken, unabhängig davon, ob bei seiner Implementierung eine L2-Unterstützung geplant war oder nicht. + +```solidity + + function mint(address _to, uint256 _amount) external; + + function burn(address _from, uint256 _amount) external; + + event Mint(address indexed _account, uint256 _amount); + event Burn(address indexed _account, uint256 _amount); +} +``` + +Funktionen und Ereignisse zum Prägen (Erstellen) und Verbrennen (Zerstören) von Tokens. +Die Brücke sollte die einzige Entität sein, die diese Funktionen ausführen kann, um sicherzustellen, dass die Anzahl der Tokens korrekt ist (gleich der Anzahl der auf L1 gesperrten Tokens). + +### L2StandardERC20 {#L2StandardERC20} + +[Dies ist unsere Implementierung der `IL2StandardERC20`-Schnittstelle](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/L2StandardERC20.sol). +Sofern Sie keine benutzerdefinierte Logik benötigen, sollten Sie diese verwenden. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +``` + +[Der OpenZeppelin ERC-20-Vertrag](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). +Optimism glaubt nicht daran, das Rad neu zu erfinden, besonders wenn das Rad gut geprüft ist und vertrauenswürdig genug sein muss, um Vermögenswerte zu halten. + +```solidity +import "./IL2StandardERC20.sol"; + +contract L2StandardERC20 is IL2StandardERC20, ERC20 { + address public l1Token; + address public l2Bridge; +``` + +Dies sind die beiden zusätzlichen Konfigurationsparameter, die wir benötigen und die ERC-20 normalerweise nicht hat. + +```solidity + + /** + * @param _l2Bridge Adresse der L2-Standardbrücke. + * @param _l1Token Adresse des entsprechenden L1-Tokens. + * @param _name ERC20-Name. + * @param _symbol ERC20-Symbol. + */ + constructor( + address _l2Bridge, + address _l1Token, + string memory _name, + string memory _symbol + ) ERC20(_name, _symbol) { + l1Token = _l1Token; + l2Bridge = _l2Bridge; + } +``` + +Zuerst den Konstruktor für den Vertrag aufrufen, von dem wir erben (`ERC20(_name, _symbol)`) und dann unsere eigenen Variablen setzen. + +```solidity + + modifier onlyL2Bridge() { + require(msg.sender == l2Bridge, "Nur die L2-Brücke kann prägen und verbrennen"); + _; + } + + + // slither-disable-next-line external-function + function supportsInterface(bytes4 _interfaceId) public pure returns (bool) { + bytes4 firstSupportedInterface = bytes4(keccak256("supportsInterface(bytes4)")); // ERC165 + bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^ + IL2StandardERC20.mint.selector ^ + IL2StandardERC20.burn.selector; + return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface; + } +``` + +So funktioniert [ERC-165](https://eips.ethereum.org/EIPS/eip-165). +Jede Schnittstelle ist eine Anzahl von unterstützten Funktionen und wird als [Exklusiv-Oder](https://en.wikipedia.org/wiki/Exclusive_or) der [ABI-Funktionsselektoren](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html#function-selector) dieser Funktionen identifiziert. + +Die L2-Brücke verwendet ERC-165 als Plausibilitätsprüfung, um sicherzustellen, dass der ERC-20-Vertrag, an den sie Assets sendet, ein `IL2StandardERC20` ist. + +**Hinweis:** Es gibt nichts, was betrügerische Verträge daran hindert, falsche Antworten auf `supportsInterface` zu geben, daher ist dies ein Plausibilitätsprüfungsmechanismus, _kein_ Sicherheitsmechanismus. + +```solidity + // slither-disable-next-line external-function + function mint(address _to, uint256 _amount) public virtual onlyL2Bridge { + _mint(_to, _amount); + + emit Mint(_to, _amount); + } + + // slither-disable-next-line external-function + function burn(address _from, uint256 _amount) public virtual onlyL2Bridge { + _burn(_from, _amount); + + emit Burn(_from, _amount); + } +} +``` + +Nur die L2-Brücke darf Assets prägen und verbrennen. + +`_mint` und `_burn` sind tatsächlich im [OpenZeppelin ERC-20-Vertrag](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn) definiert. +Dieser Vertrag macht sie nur nicht extern zugänglich, weil die Bedingungen zum Prägen und Verbrennen von Tokens so vielfältig sind wie die Anzahl der Verwendungsmöglichkeiten von ERC-20. + +## L2-Brücken-Code {#l2-bridge-code} + +Dies ist der Code, der die Brücke auf Optimism ausführt. +[Die Quelle für diesen Vertrag befindet sich hier](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol). + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +/* Schnittstellen-Importe */ +import { IL1StandardBridge } from "../../L1/messaging/IL1StandardBridge.sol"; +import { IL1ERC20Bridge } from "../../L1/messaging/IL1ERC20Bridge.sol"; +import { IL2ERC20Bridge } from "./IL2ERC20Bridge.sol"; +``` + +Die [IL2ERC20Bridge](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol)-Schnittstelle ist dem [L1-Äquivalent](#IL1ERC20Bridge), das wir oben gesehen haben, sehr ähnlich. +Es gibt zwei wesentliche Unterschiede: + +1. Auf L1 initiieren Sie Einzahlungen und finalisieren Auszahlungen. + Hier initiieren Sie Auszahlungen und finalisieren Einzahlungen. +2. Auf L1 ist es notwendig, zwischen ETH- und ERC-20-Tokens zu unterscheiden. + Auf L2 können wir dieselben Funktionen für beide verwenden, da intern ETH-Guthaben auf Optimism als ERC-20-Token mit der Adresse [0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://explorer.optimism.io/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000) behandelt werden. + +```solidity +/* Bibliotheks-Importe */ +import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; +import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; +import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol"; + +/* Vertrags-Importe */ +import { IL2StandardERC20 } from "../../standards/IL2StandardERC20.sol"; + +/** + * @title L2StandardBridge + * @dev Die L2-Standardbrücke ist ein Vertrag, der zusammen mit der L1-Standardbrücke + * ETH- und ERC20-Übergänge zwischen L1 und L2 ermöglicht. + * Dieser Vertrag fungiert als Minter für neue Tokens, wenn er von Einzahlungen in die L1-Standardbrücke + * erfährt. + * Dieser Vertrag fungiert auch als Burner der für die Auszahlung vorgesehenen Tokens und informiert die L1- + * Brücke, L1-Mittel freizugeben. + */ +contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled { + /******************************** + * Externe Vertragsreferenzen * + ********************************/ + + address public l1TokenBridge; +``` + +Die Adresse der L1-Brücke im Auge behalten. +Beachten Sie, dass wir im Gegensatz zum L1-Äquivalent hier diese Variable _brauchen_. +Die Adresse der L1-Brücke ist nicht im Voraus bekannt. + +```solidity + + /*************** + * Konstruktor * + ***************/ + + /** + * @param _l2CrossDomainMessenger Von diesem Vertrag verwendeter domänenübergreifender Messenger. + * @param _l1TokenBridge Adresse der auf der Hauptkette bereitgestellten L1-Brücke. + */ + constructor(address _l2CrossDomainMessenger, address _l1TokenBridge) + CrossDomainEnabled(_l2CrossDomainMessenger) + { + l1TokenBridge = _l1TokenBridge; + } + + /*************** + * Auszahlung * + ***************/ + + /** + * @inheritdoc IL2ERC20Bridge + */ + function withdraw( + address _l2Token, + uint256 _amount, + uint32 _l1Gas, + bytes calldata _data + ) external virtual { + _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data); + } + + /** + * @inheritdoc IL2ERC20Bridge + */ + function withdrawTo( + address _l2Token, + address _to, + uint256 _amount, + uint32 _l1Gas, + bytes calldata _data + ) external virtual { + _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data); + } +``` + +Diese beiden Funktionen leiten Auszahlungen ein. +Beachten Sie, dass die L1-Token-Adresse nicht angegeben werden muss. +Es wird erwartet, dass L2-Tokens uns die Adresse des L1-Äquivalents mitteilen. + +```solidity + + /** + * @dev Führt die Logik für Auszahlungen durch, indem der Token verbrannt und + * das L1-Token-Gateway über die Auszahlung informiert wird. + * @param _l2Token Adresse des L2-Tokens, bei dem die Auszahlung eingeleitet wird. + * @param _from Konto, von dem die Auszahlung auf L2 abgezogen wird. + * @param _to Konto, dem die Auszahlung auf L1 gutgeschrieben wird. + * @param _amount Betrag des abzuhebenden Tokens. + * @param _l1Gas Unbenutzt, aber aus Gründen der potenziellen Vorwärtskompatibilität enthalten. + * @param _data Optionale Daten zur Weiterleitung an L1. Diese Daten werden + * lediglich als Annehmlichkeit für externe Verträge zur Verfügung gestellt. Abgesehen von der Durchsetzung einer maximalen + * Länge geben diese Verträge keine Garantien über ihren Inhalt. + */ + function _initiateWithdrawal( + address _l2Token, + address _from, + address _to, + uint256 _amount, + uint32 _l1Gas, + bytes calldata _data + ) internal { + // Wenn eine Auszahlung eingeleitet wird, verbrennen wir die Mittel des Auszahlenden, um eine nachfolgende L2- + // Nutzung zu verhindern + // slither-disable-next-line reentrancy-events + IL2StandardERC20(_l2Token).burn(msg.sender, _amount); +``` + +Beachten Sie, dass wir uns _nicht_ auf den `_from`-Parameter verlassen, sondern auf `msg.sender`, was viel schwerer zu fälschen ist (soweit ich weiß, unmöglich). + +```solidity + + // Konstruiere Calldata für l1TokenBridge.finalizeERC20Withdrawal(_to, _amount) + // slither-disable-next-line reentrancy-events + address l1Token = IL2StandardERC20(_l2Token).l1Token(); + bytes memory message; + + if (_l2Token == Lib_PredeployAddresses.OVM_ETH) { +``` + +Auf L1 ist es notwendig, zwischen ETH und ERC-20 zu unterscheiden. + +```solidity + message = abi.encodeWithSelector( + IL1StandardBridge.finalizeETHWithdrawal.selector, + _from, + _to, + _amount, + _data + ); + } else { + message = abi.encodeWithSelector( + IL1ERC20Bridge.finalizeERC20Withdrawal.selector, + l1Token, + _l2Token, + _from, + _to, + _amount, + _data + ); + } + + // Nachricht an L1-Brücke senden + // slither-disable-next-line reentrancy-events + sendCrossDomainMessage(l1TokenBridge, _l1Gas, message); + + // slither-disable-next-line reentrancy-events + emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data); + } + + /************************************ + * Cross-Chain-Funktion: Einzahlung * + ************************************/ + + /** + * @inheritdoc IL2ERC20Bridge + */ + function finalizeDeposit( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data +``` + +Diese Funktion wird von `L1StandardBridge` aufgerufen. + +```solidity + ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) { +``` + +Stellen Sie sicher, dass die Quelle der Nachricht legitim ist. +Dies ist wichtig, da diese Funktion `_mint` aufruft und verwendet werden könnte, um Tokens auszugeben, die nicht durch Tokens gedeckt sind, die die Brücke auf L1 besitzt. + +```solidity + // Prüfen Sie, ob der Ziel-Token konform ist und + // überprüfen Sie, ob der eingezahlte Token auf L1 mit der L2-Darstellung des eingezahlten Tokens hier übereinstimmt + if ( + // slither-disable-next-line reentrancy-events + ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) && + _l1Token == IL2StandardERC20(_l2Token).l1Token() +``` + +Plausibilitätsprüfungen: + +1. Die richtige Schnittstelle wird unterstützt +2. Die L1-Adresse des L2-ERC-20-Vertrags stimmt mit der L1-Quelle der Tokens überein + +```solidity + ) { + // Wenn eine Einzahlung abgeschlossen ist, schreiben wir dem Konto auf L2 den gleichen Betrag an + // Tokens gut. + // slither-disable-next-line reentrancy-events + IL2StandardERC20(_l2Token).mint(_to, _amount); + // slither-disable-next-line reentrancy-events + emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data); +``` + +Wenn die Plausibilitätsprüfungen erfolgreich sind, schließen Sie die Einzahlung ab: + +1. Prägen Sie die Tokens +2. Das entsprechende Ereignis auslösen + +```solidity + } else { + // Entweder ist der L2-Token, in den eingezahlt wird, mit der korrekten Adresse + // seines L1-Tokens nicht einverstanden oder er unterstützt nicht die korrekte Schnittstelle. + // Dies sollte nur passieren, wenn es einen bösartigen L2-Token gibt oder wenn ein Benutzer irgendwie + // die falsche L2-Token-Adresse für die Einzahlung angegeben hat. + // In jedem Fall stoppen wir den Prozess hier und erstellen eine Auszahlungsnachricht + //, damit Benutzer in einigen Fällen ihre Gelder abheben können. + // Es gibt keine Möglichkeit, bösartige Token-Verträge vollständig zu verhindern, aber dies begrenzt + // Benutzerfehler und mildert einige Formen von bösartigem Vertragsverhalten. +``` + +Wenn ein Benutzer einen erkennbaren Fehler gemacht hat, indem er die falsche L2-Token-Adresse verwendet hat, möchten wir die Einzahlung stornieren und die Tokens auf L1 zurückgeben. +Der einzige Weg, wie wir dies von L2 aus tun können, ist das Senden einer Nachricht, die den Fehler-Anfechtungszeitraum abwarten muss, aber das ist für den Benutzer viel besser als der dauerhafte Verlust der Tokens. + +```solidity + bytes memory message = abi.encodeWithSelector( + IL1ERC20Bridge.finalizeERC20Withdrawal.selector, + _l1Token, + _l2Token, + _to, // hier _to und _from vertauscht, um die Einzahlung an den Absender zurückzuspringen + _from, + _amount, + _data + ); + + // Nachricht an die L1-Brücke senden + // slither-disable-next-line reentrancy-events + sendCrossDomainMessage(l1TokenBridge, 0, message); + // slither-disable-next-line reentrancy-events + emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data); + } + } +} +``` + +## Fazit {#conclusion} + +Die Standard-Brücke ist der flexibelste Mechanismus für Asset-Übertragungen. +Da er jedoch so generisch ist, ist er nicht immer der einfachste zu verwendende Mechanismus. +Insbesondere für Auszahlungen bevorzugen die meisten Benutzer [Drittanbieter-Brücken](https://optimism.io/apps#bridge), die nicht auf den Anfechtungszeitraum warten und keinen Merkle-Beweis benötigen, um die Auszahlung abzuschließen. + +Diese Brücken funktionieren typischerweise, indem sie Assets auf L1 haben, die sie sofort gegen eine geringe Gebühr (oft weniger als die Gaskosten für eine Standard-Brückenauszahlung) zur Verfügung stellen. +Wenn die Brücke (oder die Personen, die sie betreiben) erwartet, dass sie auf L1 knapp bei Kasse ist, überträgt sie ausreichend Vermögenswerte von L2. Da es sich hierbei um sehr große Auszahlungen handelt, werden die Auszahlungskosten auf einen großen Betrag verteilt und machen einen viel kleineren Prozentsatz aus. + +Hoffentlich hat Ihnen dieser Artikel geholfen, besser zu verstehen, wie Layer 2 funktioniert und wie man klaren und sicheren Solidity-Code schreibt. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). diff --git a/public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md new file mode 100644 index 00000000000..1309b7bf0a5 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md @@ -0,0 +1,744 @@ +--- +title: "Reverse Engineering eines Contracts" +description: Wie Sie einen Contract verstehen, wenn Sie den Quellcode nicht haben +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +lang: de +tags: [ "evm", "Opcodes" ] +skill: advanced +published: 2021-12-30 +--- + +## Einführung {#introduction} + +_Auf der Blockchain gibt es keine Geheimnisse_, alles, was geschieht, ist konsistent, nachprüfbar und öffentlich zugänglich. Idealerweise sollten [Contracts ihren Quellcode auf Etherscan veröffentlichen und verifizieren lassen](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code). [Das ist jedoch nicht immer der Fall](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code). In diesem Artikel lernen Sie, wie Sie Contracts per Reverse Engineering analysieren, indem Sie sich einen Contract ohne Quellcode ansehen: [`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f). + +Es gibt Reverse-Compiler, aber sie liefern nicht immer [brauchbare Ergebnisse](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f). In diesem Artikel lernen Sie, wie Sie einen Contract manuell per Reverse Engineering analysieren und anhand [der Opcodes](https://github.com/wolflo/evm-opcodes) verstehen können, und wie Sie die Ergebnisse eines Decompilers interpretieren. + +Um diesen Artikel zu verstehen, sollten Sie bereits die Grundlagen der EVM kennen und zumindest einigermaßen mit EVM-Assembler vertraut sein. [Hier können Sie mehr über diese Themen lesen](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e). + +## Vorbereitung des ausführbaren Codes {#prepare-the-executable-code} + +Sie können die Opcodes abrufen, indem Sie auf Etherscan zum Contract navigieren, auf den Tab **Contract** und dann auf **Switch to Opcodes View** klicken. Sie erhalten eine Ansicht mit einem Opcode pro Zeile. + +![Opcode-Ansicht von Etherscan](opcode-view.png) + +Um Sprünge (Jumps) zu verstehen, müssen Sie jedoch wissen, wo sich die einzelnen Opcodes im Code befinden. Eine Möglichkeit besteht darin, ein Google Spreadsheet zu öffnen und die Opcodes in Spalte C einzufügen. [Sie können die folgenden Schritte überspringen, indem Sie eine Kopie dieser bereits vorbereiteten Tabelle erstellen](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing). + +Der nächste Schritt besteht darin, die korrekten Code-Positionen zu ermitteln, damit wir die Sprünge verstehen können. Wir tragen die Opcode-Größe in Spalte B und die Position (in hexadezimaler Schreibweise) in Spalte A ein. Geben Sie diese Funktion in Zelle `B1` ein und kopieren Sie sie dann für den Rest von Spalte B bis zum Ende des Codes. Danach können Sie Spalte B ausblenden. + +``` +=1+IF(REGEXMATCH(C1,"PUSH"),REGEXEXTRACT(C1,"PUSH(\d+)"),0) +``` + +Zuerst fügt diese Funktion ein Byte für den Opcode selbst hinzu und sucht dann nach `PUSH`. Push-Opcodes sind besonders, da sie zusätzliche Bytes für den Wert benötigen, der gepusht wird. Wenn der Opcode ein `PUSH` ist, extrahieren wir die Anzahl der Bytes und addieren sie. + +In `A1` setzen Sie den ersten Offset, Null. Geben Sie dann in `A2` diese Funktion ein und kopieren Sie sie wieder für den Rest der Spalte A: + +``` +=dec2hex(hex2dec(A1)+B1) +``` + +Wir benötigen diese Funktion, um den hexadezimalen Wert zu erhalten, da die Werte, die vor Sprüngen (`JUMP` und `JUMPI`) gepusht werden, in hexadezimaler Form angegeben werden. + +## Der Einstiegspunkt (0x00) {#the-entry-point-0x00} + +Contracts werden immer ab dem ersten Byte ausgeführt. Dies ist der erste Teil des Codes: + +| Offset | Opcode | Stack (nach dem Opcode) | +| -----: | ------------ | ---------------------------------------------- | +| 0 | PUSH1 0x80 | 0x80 | +| 2 | PUSH1 0x40 | 0x40, 0x80 | +| 4 | MSTORE | Leer | +| 5 | PUSH1 0x04 | 0x04 | +| 7 | CALLDATASIZE | CALLDATASIZE 0x04 | +| 8 | LT | CALLDATASIZE\<4 | +| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 | +| C | JUMPI | Leer | + +Dieser Code macht zwei Dinge: + +1. Schreibt 0x80 als 32-Byte-Wert in die Speicherstellen 0x40-0x5F (0x80 wird in 0x5F gespeichert, und 0x40-0x5E sind alle Nullen). +2. Liest die Calldata-Größe. Normalerweise folgen die Calldata für einen Ethereum-Contract [dem ABI (Application Binary Interface)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html), das mindestens vier Bytes für den Funktions-Selektor erfordert. Wenn die Calldata-Größe kleiner als vier ist, springe zu 0x5E. + +![Flussdiagramm für diesen Abschnitt](flowchart-entry.png) + +### Der Handler bei 0x5E (für Nicht-ABI-Calldata) {#the-handler-at-0x5e-for-non-abi-call-data} + +| Offset | Opcode | +| -----: | ------------ | +| 5E | JUMPDEST | +| 5F | CALLDATASIZE | +| 60 | PUSH2 0x007c | +| 63 | JUMPI | + +Dieses Snippet beginnt mit einem `JUMPDEST`. EVM-Programme (Ethereum Virtual Machine) lösen eine Ausnahme aus, wenn Sie zu einem Opcode springen, der nicht `JUMPDEST` ist. Dann prüft er die CALLDATASIZE und springt, wenn sie „wahr“ ist (d. h. nicht null), zu 0x7C. Darauf kommen wir unten zu sprechen. + +| Offset | Opcode | Stack (nach Opcode) | +| -----: | ---------- | --------------------------------------------------------------------------------------------------------------------- | +| 64 | CALLVALUE | [Wei](/glossary/#wei), der durch den Aufruf bereitgestellt wird. Wird in Solidity `msg.value` genannt | +| 65 | PUSH1 0x06 | 6 CALLVALUE | +| 67 | PUSH1 0x00 | 0 6 CALLVALUE | +| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE | +| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE | +| 6B | SLOAD | Speicher[6] CALLVALUE 0 6 CALLVALUE | + +Wenn es also keine Calldata gibt, lesen wir den Wert von Speicher[6]. Wir wissen noch nicht, was dieser Wert ist, aber wir können nach Transaktionen suchen, die der Contract ohne Calldata erhalten hat. Transaktionen, die nur ETH ohne Calldata (und damit ohne Methode) übertragen, haben in Etherscan die Methode `Transfer`. Tatsächlich ist [die allererste Transaktion, die der Contract erhalten hat](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7), ein Transfer. + +Wenn wir uns diese Transaktion ansehen und auf **Click to see More** klicken, sehen wir, dass die Calldata, als Input Data bezeichnet, tatsächlich leer sind (`0x`). Beachten Sie auch, dass der Wert 1,559 ETH beträgt, was später relevant sein wird. + +![Die Calldata sind leer](calldata-empty.png) + +Klicken Sie als Nächstes auf den Tab **State** und erweitern Sie den Contract, den wir per Reverse Engineering analysieren (0x2510...). Sie können sehen, dass sich `Speicher[6]` während der Transaktion geändert hat, und wenn Sie Hex auf **Number** ändern, sehen Sie, dass es 1.559.000.000.000.000.000 wurde, der in Wei übertragene Wert (ich habe die Kommas zur besseren Lesbarkeit hinzugefügt), der dem nächsten Contract-Wert entspricht. + +![Die Änderung in Speicher[6]](storage6.png) + +Wenn wir uns die Zustandsänderungen ansehen, die durch [andere `Transfer`-Transaktionen aus demselben Zeitraum](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange) verursacht wurden, sehen wir, dass `Speicher[6]` den Wert des Contracts eine Zeit lang nachverfolgt hat. Vorerst nennen wir es `Wert*`. Das Sternchen (`*`) erinnert uns daran, dass wir noch nicht _wissen_, was diese Variable tut, aber sie kann nicht nur dazu dienen, den Contract-Wert zu verfolgen, da es nicht nötig ist, Speicher zu verwenden, der sehr teuer ist, wenn man den Kontostand seines Accounts mit `ADDRESS BALANCE` abrufen kann. Der erste Opcode pusht die eigene Adresse des Contracts. Der zweite liest die Adresse an der Spitze des Stacks und ersetzt sie durch das Guthaben dieser Adresse. + +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------ | +| 6C | PUSH2 0x0075 | 0x75 Wert\* CALLVALUE 0 6 CALLVALUE | +| 6F | SWAP2 | CALLVALUE Wert\* 0x75 0 6 CALLVALUE | +| 70 | SWAP1 | Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| 71 | PUSH2 0x01a7 | 0x01A7 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| 74 | JUMP | | + +Wir werden diesen Code am Sprungziel weiterverfolgen. + +| Offset | Opcode | Stack | +| -----: | ---------- | ---------------------------------------------------------- | +| 1A7 | JUMPDEST | Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1A8 | PUSH1 0x00 | 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AA | DUP3 | CALLVALUE 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AB | NOT | 2^256-CALLVALUE-1 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | + +Das `NOT` ist bitweise, also kehrt es den Wert jedes Bits im Aufrufwert um. + +| Offset | Opcode | Stack | +| -----: | ------------ | ---------------------------------------------------------------------------------------------------- | +| 1AC | DUP3 | Wert\* 2^256-CALLVALUE-1 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AD | GT | Wert\*>2^256-CALLVALUE-1 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AE | ISZERO | Wert\*\<=2^256-CALLVALUE-1 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AF | PUSH2 0x01df | 0x01DF Wert\*\<=2^256-CALLVALUE-1 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1B2 | JUMPI | | + +Wir springen, wenn `Wert*` kleiner oder gleich 2^256-CALLVALUE-1 ist. Das sieht nach einer Logik zur Vermeidung von Überläufen aus. Und tatsächlich sehen wir, dass der Contract nach ein paar unsinnigen Operationen (z. B. das Schreiben in den Speicher, der gleich gelöscht wird) bei Offset 0x01DE zurückgesetzt wird, wenn der Überlauf erkannt wird, was ein normales Verhalten ist. + +Beachten Sie, dass ein solcher Überlauf extrem unwahrscheinlich ist, da der Aufrufwert plus `Wert*` vergleichbar mit 2^256 Wei sein müsste, was etwa 10^59 ETH entspricht. [Die gesamte ETH-Menge beträgt zum Zeitpunkt der Erstellung dieses Artikels weniger als zweihundert Millionen](https://etherscan.io/stat/supply). + +| Offset | Opcode | Stack | +| -----: | -------- | ---------------------------------------- | +| 1DF | JUMPDEST | 0x00 Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1E0 | POP | Wert\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1E1 | ADD | Wert\*+CALLVALUE 0x75 0 6 CALLVALUE | +| 1E2 | SWAP1 | 0x75 Wert\*+CALLVALUE 0 6 CALLVALUE | +| 1E3 | JUMP | | + +Wenn wir hier angekommen sind, erhalten wir `Wert* + CALLVALUE` und springen zu Offset 0x75. + +| Offset | Opcode | Stack | +| -----: | -------- | ------------------------------ | +| 75 | JUMPDEST | Wert\*+CALLVALUE 0 6 CALLVALUE | +| 76 | SWAP1 | 0 Wert\*+CALLVALUE 6 CALLVALUE | +| 77 | SWAP2 | 6 Wert\*+CALLVALUE 0 CALLVALUE | +| 78 | SSTORE | 0 CALLVALUE | + +Wenn wir hier ankommen (was leere Calldata voraussetzt), addieren wir den Aufrufwert zu `Wert*`. Dies stimmt mit dem überein, was `Transfer`-Transaktionen laut unserer Aussage tun. + +| Offset | Opcode | +| -----: | ------ | +| 79 | POP | +| 7A | POP | +| 7B | STOP | + +Leeren Sie schließlich den Stack (was nicht notwendig ist) und signalisieren Sie das erfolgreiche Ende der Transaktion. + +Zusammenfassend finden Sie hier ein Flussdiagramm für den ursprünglichen Code. + +![Flussdiagramm für den Einstiegspunkt](flowchart-entry.png) + +## Der Handler bei 0x7C {#the-handler-at-0x7c} + +Ich habe absichtlich nicht in die Überschrift geschrieben, was dieser Handler tut. Der Punkt ist nicht, Ihnen beizubringen, wie dieser spezielle Contract funktioniert, sondern wie man Contracts per Reverse Engineering analysiert. Sie werden auf die gleiche Weise wie ich lernen, was er tut, indem Sie dem Code folgen. + +Wir gelangen von mehreren Stellen hierher: + +- Wenn Calldata von 1, 2 oder 3 Bytes vorhanden sind (von Offset 0x63) +- Wenn die Methodensignatur unbekannt ist (von Offsets 0x42 und 0x5D) + +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------------------------------------- | +| 7C | JUMPDEST | | +| 7D | PUSH1 0x00 | 0x00 | +| 7F | PUSH2 0x009d | 0x9D 0x00 | +| 82 | PUSH1 0x03 | 0x03 0x9D 0x00 | +| 84 | SLOAD | Speicher[3] 0x9D 0x00 | + +Dies ist eine weitere Speicherzelle, die ich in keiner Transaktion finden konnte, so dass es schwieriger ist zu wissen, was sie bedeutet. Der folgende Code wird dies verdeutlichen. + +| Offset | Opcode | Stack | +| -----: | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff Speicher[3] 0x9D 0x00 | +| 9A | AND | Speicher[3]-als-Adresse 0x9D 0x00 | + +Diese Opcodes kürzen den Wert, den wir aus Speicher[3] lesen, auf 160 Bit, die Länge einer Ethereum-Adresse. + +| Offset | Opcode | Stack | +| -----: | ------ | ------------------------------------------------------------------------------------- | +| 9B | SWAP1 | 0x9D Speicher[3]-als-Adresse 0x00 | +| 9C | JUMP | Speicher[3]-als-Adresse 0x00 | + +Dieser Sprung ist überflüssig, da wir zum nächsten Opcode gehen. Dieser Code ist bei weitem nicht so gas-effizient, wie er sein könnte. + +| Offset | Opcode | Stack | +| -----: | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| 9D | JUMPDEST | Speicher[3]-als-Adresse 0x00 | +| 9E | SWAP1 | 0x00 Speicher[3]-als-Adresse | +| 9F | POP | Speicher[3]-als-Adresse | +| A0 | PUSH1 0x40 | 0x40 Speicher[3]-als-Adresse | +| A2 | MLOAD | Mem[0x40] Speicher[3]-als-Adresse | + +Ganz am Anfang des Codes setzen wir Mem[0x40] auf 0x80. Wenn wir später nach 0x40 suchen, sehen wir, dass wir es nicht ändern - wir können also davon ausgehen, dass es 0x80 ist. + +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------------------------------------------------------------------- | +| A3 | CALLDATASIZE | CALLDATASIZE 0x80 Speicher[3]-als-Adresse | +| A4 | PUSH1 0x00 | 0x00 CALLDATASIZE 0x80 Speicher[3]-als-Adresse | +| A6 | DUP3 | 0x80 0x00 CALLDATASIZE 0x80 Speicher[3]-als-Adresse | +| A7 | CALLDATACOPY | 0x80 Speicher[3]-als-Adresse | + +Kopieren Sie alle Calldata in den Speicher, beginnend bei 0x80. + +| Offset | Opcode | Stack | +| -----: | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| A8 | PUSH1 0x00 | 0x00 0x80 Speicher[3]-als-Adresse | +| AA | DUP1 | 0x00 0x00 0x80 Speicher[3]-als-Adresse | +| AB | CALLDATASIZE | CALLDATASIZE 0x00 0x00 0x80 Speicher[3]-als-Adresse | +| AC | DUP4 | 0x80 CALLDATASIZE 0x00 0x00 0x80 Speicher[3]-als-Adresse | +| AD | DUP6 | Speicher[3]-als-Adresse 0x80 CALLDATASIZE 0x00 0x00 0x80 Speicher[3]-als-Adresse | +| AE | GAS | GAS Speicher[3]-als-Adresse 0x80 CALLDATASIZE 0x00 0x00 0x80 Speicher[3]-als-Adresse | +| AF | DELEGATE_CALL | | + +Jetzt sind die Dinge viel klarer. Dieser Contract kann als [Proxy](https://blog.openzeppelin.com/proxy-patterns/) fungieren und die Adresse in Speicher[3] aufrufen, um die eigentliche Arbeit zu erledigen. `DELEGATE_CALL` ruft einen separaten Contract auf, bleibt aber im selben Speicher. Das bedeutet, dass der delegierte Contract, für den wir ein Proxy sind, auf denselben Speicherplatz zugreift. Die Parameter für den Aufruf sind: + +- _Gas_: Das gesamte verbleibende Gas +- _Aufgerufene Adresse_: Speicher[3]-als-Adresse +- _Calldata_: Die CALLDATASIZE-Bytes, die bei 0x80 beginnen, wo wir die ursprünglichen Calldata platziert haben +- _Rückgabedaten_: Keine (0x00 - 0x00) Wir erhalten die Rückgabedaten auf andere Weise (siehe unten) + +| Offset | Opcode | Stack | +| -----: | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| B0 | RETURNDATASIZE | RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| B1 | DUP1 | RETURNDATASIZE RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| B2 | PUSH1 0x00 | 0x00 RETURNDATASIZE RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| B4 | DUP5 | 0x80 0x00 RETURNDATASIZE RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| B5 | RETURNDATACOPY | RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | + +Hier kopieren wir alle Rückgabedaten in den Speicherpuffer, beginnend bei 0x80. + +| Offset | Opcode | Stack | +| -----: | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| B6 | DUP2 | (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| B7 | DUP1 | (((Aufruf erfolgreich/fehlgeschlagen))) (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| B8 | ISZERO | (((ist der Aufruf fehlgeschlagen))) (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| B9 | PUSH2 0x00c0 | 0xC0 (((ist der Aufruf fehlgeschlagen))) (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| BC | JUMPI | (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| BD | DUP2 | RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| BE | DUP5 | 0x80 RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| BF | RETURN | | + +Nach dem Aufruf kopieren wir also die Rückgabedaten in den Puffer 0x80 - 0x80+RETURNDATASIZE, und wenn der Aufruf erfolgreich ist, führen wir `RETURN` mit genau diesem Puffer aus. + +### DELEGATECALL fehlgeschlagen {#delegatecall-failed} + +Wenn wir hier, bei 0xC0, ankommen, bedeutet das, dass der aufgerufene Contract zurückgesetzt wurde. Da wir nur ein Proxy für diesen Contract sind, wollen wir dieselben Daten zurückgeben und ebenfalls zurücksetzen. + +| Offset | Opcode | Stack | +| -----: | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| C0 | JUMPDEST | (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| C1 | DUP2 | RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| C2 | DUP5 | 0x80 RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) RETURNDATASIZE (((Aufruf erfolgreich/fehlgeschlagen))) 0x80 Speicher[3]-als-Adresse | +| C3 | REVERT | | + +Wir führen also `REVERT` mit demselben Puffer aus, den wir zuvor für `RETURN` verwendet haben: 0x80 - 0x80+RETURNDATASIZE + +![Aufruf an Proxy-Flussdiagramm](flowchart-proxy.png) + +## ABI-Aufrufe {#abi-calls} + +Wenn die Calldata-Größe vier Bytes oder mehr beträgt, könnte dies ein gültiger ABI-Aufruf sein. + +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------------------------------------------------------------------------------------- | +| D | PUSH1 0x00 | 0x00 | +| F | CALLDATALOAD | (((Erstes Wort (256 Bit) der Calldata))) | +| 10 | PUSH1 0xe0 | 0xE0 (((Erstes Wort (256 Bit) der Calldata))) | +| 12 | SHR | (((erste 32 Bits (4 Bytes) der Calldata))) | + +Etherscan teilt uns mit, dass `1C` ein unbekannter Opcode ist, da [er hinzugefügt wurde, nachdem Etherscan diese Funktion geschrieben hat](https://eips.ethereum.org/EIPS/eip-145) und sie sie nicht aktualisiert haben. Eine [aktuelle Opcode-Tabelle](https://github.com/wolflo/evm-opcodes) zeigt uns, dass dies eine Rechtsverschiebung ist + +| Offset | Opcode | Stack | +| -----: | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 13 | DUP1 | (((erste 32 Bits (4 Bytes) der Calldata))) (((erste 32 Bits (4 Bytes) der Calldata))) | +| 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((erste 32 Bits (4 Bytes) der Calldata))) (((erste 32 Bits (4 Bytes) der Calldata))) | +| 19 | GT | 0x3CD8045E>erste-32-Bits-der-Calldata (((erste 32 Bits (4 Bytes) der Calldata))) | +| 1A | PUSH2 0x0043 | 0x43 0x3CD8045E>erste-32-Bits-der-Calldata (((erste 32 Bits (4 Bytes) der Calldata))) | +| 1D | JUMPI | (((erste 32 Bits (4 Bytes) der Calldata))) | + +Indem die Tests zum Abgleich der Methodensignatur auf diese Weise in zwei Teile aufgeteilt werden, wird im Durchschnitt die Hälfte der Tests eingespart. Der Code, der unmittelbar darauf folgt, und der Code in 0x43 folgen demselben Muster: `DUP1` die ersten 32 Bits der Calldata, `PUSH4 (((Methodensignatur>`, `EQ` ausführen, um auf Gleichheit zu prüfen, und dann `JUMPI`, wenn die Methodensignatur übereinstimmt. Hier sind die Methodensignaturen, ihre Adressen und, falls bekannt, [die entsprechende Methodendefinition](https://www.4byte.directory/): + +| Methode | Methodensignatur | Offset, zu dem gesprungen wird | +| --------------------------------------------------------------------------------------------------------- | ---------------- | ------------------------------ | +| [splitter()](https://www.4byte.directory/signatures/?bytes4_signature=0x3cd8045e) | 0x3cd8045e | 0x0103 | +| ??? | 0x81e580d3 | 0x0138 | +| [currentWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0xba0bafb4) | 0xba0bafb4 | 0x0158 | +| ??? | 0x1f135823 | 0x00C4 | +| [merkleRoot()](https://www.4byte.directory/signatures/?bytes4_signature=0x2eb4a7ab) | 0x2eb4a7ab | 0x00ED | + +Wenn keine Übereinstimmung gefunden wird, springt der Code zum [Proxy-Handler bei 0x7C](#the-handler-at-0x7c) in der Hoffnung, dass der Contract, für den wir ein Proxy sind, eine Übereinstimmung hat. + +![Flussdiagramm der ABI-Aufrufe](flowchart-abi.png) + +## splitter() {#splitter} + +| Offset | Opcode | Stack | +| -----: | ------------ | ----------------------------- | +| 103 | JUMPDEST | | +| 104 | CALLVALUE | CALLVALUE | +| 105 | DUP1 | CALLVALUE CALLVALUE | +| 106 | ISZERO | CALLVALUE==0 CALLVALUE | +| 107 | PUSH2 0x010f | 0x010F CALLVALUE==0 CALLVALUE | +| 10A | JUMPI | CALLVALUE | +| 10B | PUSH1 0x00 | 0x00 CALLVALUE | +| 10D | DUP1 | 0x00 0x00 CALLVALUE | +| 10E | REVERT | | + +Als Erstes prüft diese Funktion, ob der Aufruf keine ETH gesendet hat. Diese Funktion ist nicht [`payable`](https://solidity-by-example.org/payable/). Wenn uns jemand ETH geschickt hat, muss das ein Fehler sein und wir wollen `REVERT` ausführen, um zu vermeiden, dass diese ETH dort sind, wo sie sie nicht zurückbekommen können. + +| Offset | Opcode | Stack | +| -----: | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 10F | JUMPDEST | | +| 110 | POP | | +| 111 | PUSH1 0x03 | 0x03 | +| 113 | SLOAD | (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) | +| 114 | PUSH1 0x40 | 0x40 (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) | +| 116 | MLOAD | 0x80 (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) | +| 117 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xFF...FF 0x80 (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) | +| 12C | SWAP1 | 0x80 0xFF...FF (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) | +| 12D | SWAP2 | (((Speicher[3] a.k.a. der Contract, für den wir ein Proxy sind))) 0xFF...FF 0x80 | +| 12E | AND | ProxyAddr 0x80 | +| 12F | DUP2 | 0x80 ProxyAddr 0x80 | +| 130 | MSTORE | 0x80 | + +Und 0x80 enthält nun die Proxy-Adresse + +| Offset | Opcode | Stack | +| -----: | ------------ | --------- | +| 131 | PUSH1 0x20 | 0x20 0x80 | +| 133 | ADD | 0xA0 | +| 134 | PUSH2 0x00e4 | 0xE4 0xA0 | +| 137 | JUMP | 0xA0 | + +### Der E4-Code {#the-e4-code} + +Wir sehen diese Zeilen zum ersten Mal, aber sie werden mit anderen Methoden geteilt (siehe unten). Wir nennen den Wert im Stack also X und merken uns nur, dass in `splitter()` der Wert dieses X 0xA0 ist. + +| Offset | Opcode | Stack | +| -----: | ---------- | ----------- | +| E4 | JUMPDEST | X | +| E5 | PUSH1 0x40 | 0x40 X | +| E7 | MLOAD | 0x80 X | +| E8 | DUP1 | 0x80 0x80 X | +| E9 | SWAP2 | X 0x80 0x80 | +| EA | SUB | X-0x80 0x80 | +| EB | SWAP1 | 0x80 X-0x80 | +| EC | RETURN | | + +Dieser Code empfängt also einen Speicherzeiger im Stack (X) und veranlasst den Contract, mit einem Puffer, der 0x80 - X ist, `RETURN` auszuführen. + +Im Fall von `splitter()` wird die Adresse zurückgegeben, für die wir ein Proxy sind. `RETURN` gibt den Puffer in 0x80-0x9F zurück, wo wir diese Daten geschrieben haben (Offset 0x130 oben). + +## currentWindow() {#currentwindow} + +Der Code in den Offsets 0x158-0x163 ist identisch mit dem, was wir in 0x103-0x10E in `splitter()` gesehen haben (außer dem `JUMPI`-Ziel), also wissen wir, dass `currentWindow()` auch nicht `payable` ist. + +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------------------------------------- | +| 164 | JUMPDEST | | +| 165 | POP | | +| 166 | PUSH2 0x00da | 0xDA | +| 169 | PUSH1 0x01 | 0x01 0xDA | +| 16B | SLOAD | Speicher[1] 0xDA | +| 16C | DUP2 | 0xDA Speicher[1] 0xDA | +| 16D | JUMP | Speicher[1] 0xDA | + +### Der DA-Code {#the-da-code} + +Dieser Code wird auch von anderen Methoden verwendet. Wir nennen den Wert im Stack also Y und merken uns nur, dass in `currentWindow()` der Wert dieses Y Speicher[1] ist. + +| Offset | Opcode | Stack | +| -----: | ---------- | ---------------- | +| DA | JUMPDEST | Y 0xDA | +| DB | PUSH1 0x40 | 0x40 Y 0xDA | +| DD | MLOAD | 0x80 Y 0xDA | +| DE | SWAP1 | Y 0x80 0xDA | +| DF | DUP2 | 0x80 Y 0x80 0xDA | +| E0 | MSTORE | 0x80 0xDA | + +Schreiben Sie Y nach 0x80-0x9F. + +| Offset | Opcode | Stack | +| -----: | ---------- | -------------- | +| E1 | PUSH1 0x20 | 0x20 0x80 0xDA | +| E3 | ADD | 0xA0 0xDA | + +Und der Rest wird bereits [oben](#the-e4-code) erklärt. Sprünge zu 0xDA schreiben also den obersten Stack-Wert (Y) in 0x80-0x9F und geben diesen Wert zurück. Im Fall von `currentWindow()` wird Speicher[1] zurückgegeben. + +## merkleRoot() {#merkleroot} + +Der Code in den Offsets 0xED-0xF8 ist identisch mit dem, was wir in 0x103-0x10E in `splitter()` gesehen haben (abgesehen vom `JUMPI`-Ziel), also wissen wir, dass `merkleRoot()` ebenfalls nicht `payable` ist. + +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------------------------------------- | +| F9 | JUMPDEST | | +| FA | POP | | +| FB | PUSH2 0x00da | 0xDA | +| FE | PUSH1 0x00 | 0x00 0xDA | +| 100 | SLOAD | Speicher[0] 0xDA | +| 101 | DUP2 | 0xDA Speicher[0] 0xDA | +| 102 | JUMP | Speicher[0] 0xDA | + +Was nach dem Sprung passiert, [haben wir bereits herausgefunden](#the-da-code). `merkleRoot()` gibt also Speicher[0] zurück. + +## 0x81e580d3 {#0x81e580d3} + +Der Code in den Offsets 0x138-0x143 ist identisch mit dem, was wir in 0x103-0x10E in `splitter()` gesehen haben (abgesehen vom `JUMPI`-Ziel), also wissen wir, dass diese Funktion ebenfalls nicht `payable` ist. + +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------------------------------------------- | +| 144 | JUMPDEST | | +| 145 | POP | | +| 146 | PUSH2 0x00da | 0xDA | +| 149 | PUSH2 0x0153 | 0x0153 0xDA | +| 14C | CALLDATASIZE | CALLDATASIZE 0x0153 0xDA | +| 14D | PUSH1 0x04 | 0x04 CALLDATASIZE 0x0153 0xDA | +| 14F | PUSH2 0x018f | 0x018F 0x04 CALLDATASIZE 0x0153 0xDA | +| 152 | JUMP | 0x04 CALLDATASIZE 0x0153 0xDA | +| 18F | JUMPDEST | 0x04 CALLDATASIZE 0x0153 0xDA | +| 190 | PUSH1 0x00 | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 192 | PUSH1 0x20 | 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 194 | DUP3 | 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 195 | DUP5 | CALLDATASIZE 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 196 | SUB | CALLDATASIZE-4 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 197 | SLT | CALLDATASIZE-4\<32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 198 | ISZERO | CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 199 | PUSH2 0x01a0 | 0x01A0 CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19C | JUMPI | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | + +Es sieht so aus, als ob diese Funktion mindestens 32 Bytes (ein Wort) an Calldata benötigt. + +| Offset | Opcode | Stack | +| -----: | ------ | -------------------------------------------- | +| 19D | DUP1 | 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19E | DUP2 | 0x00 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19F | REVERT | | + +Wenn sie die Calldata nicht erhält, wird die Transaktion ohne Rückgabedaten zurückgesetzt. + +Sehen wir uns an, was passiert, wenn die Funktion die benötigten Calldata _doch_ erhält. + +| Offset | Opcode | Stack | +| -----: | ------------ | ----------------------------------------------------------- | +| 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA | +| 1A2 | CALLDATALOAD | calldataload(4) CALLDATASIZE 0x0153 0xDA | + +`calldataload(4)` ist das erste Wort der Calldata _nach_ der Methodensignatur + +| Offset | Opcode | Stack | +| -----: | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 1A3 | SWAP2 | 0x0153 CALLDATASIZE calldataload(4) 0xDA | +| 1A4 | SWAP1 | CALLDATASIZE 0x0153 calldataload(4) 0xDA | +| 1A5 | POP | 0x0153 calldataload(4) 0xDA | +| 1A6 | JUMP | calldataload(4) 0xDA | +| 153 | JUMPDEST | calldataload(4) 0xDA | +| 154 | PUSH2 0x016e | 0x016E calldataload(4) 0xDA | +| 157 | JUMP | calldataload(4) 0xDA | +| 16E | JUMPDEST | calldataload(4) 0xDA | +| 16F | PUSH1 0x04 | 0x04 calldataload(4) 0xDA | +| 171 | DUP2 | calldataload(4) 0x04 calldataload(4) 0xDA | +| 172 | DUP2 | 0x04 calldataload(4) 0x04 calldataload(4) 0xDA | +| 173 | SLOAD | Speicher[4] calldataload(4) 0x04 calldataload(4) 0xDA | +| 174 | DUP2 | calldataload(4) Speicher[4] calldataload(4) 0x04 calldataload(4) 0xDA | +| 175 | LT | calldataload(4)\)`, und eine andere ist `isClaimed()`, also sieht es wie ein Airdrop-Contract aus. Anstatt den Rest Opcode für Opcode durchzugehen, können wir [den Decompiler ausprobieren](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761), der für drei Funktionen aus diesem Contract brauchbare Ergebnisse liefert. Das Reverse Engineering der anderen wird dem Leser als Übung überlassen. + +### scaleAmountByPercentage {#scaleamountbypercentage} + +Das gibt uns der Decompiler für diese Funktion aus: + +```python +def unknown8ffb5c97(uint256 _param1, uint256 _param2) payable: + require calldata.size - 4 >=′ 64 + if _param1 and _param2 > -1 / _param1: + revert with 0, 17 + return (_param1 * _param2 / 100 * 10^6) +``` + +Das erste `require` testet, ob die Calldata zusätzlich zu den vier Bytes der Funktionssignatur mindestens 64 Bytes haben, genug für die beiden Parameter. Wenn nicht, dann ist offensichtlich etwas falsch. + +Die `if`-Anweisung scheint zu prüfen, dass `_param1` nicht Null ist und dass `_param1 * _param2` nicht negativ ist. Es dient wahrscheinlich dazu, Fälle von Wrap-Around zu verhindern. + +Schließlich gibt die Funktion einen skalierten Wert zurück. + +### claim {#claim} + +Der vom Decompiler erstellte Code ist komplex und nicht alles davon ist für uns relevant. Ich werde einen Teil davon überspringen, um mich auf die Zeilen zu konzentrieren, von denen ich glaube, dass sie nützliche Informationen liefern + +```python +def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _param4) payable: + ... + require _param2 == addr(_param2) + ... + if currentWindow <= _param1: + revert with 0, 'cannot claim for a future window' +``` + +Wir sehen hier zwei wichtige Dinge: + +- `_param2` ist, obwohl als `uint256` deklariert, tatsächlich eine Adresse +- `_param1` ist das Fenster, das beansprucht wird, und muss `currentWindow` oder früher sein. + +```python + ... + if stor5[_claimWindow][addr(_claimFor)]: + revert with 0, 'Account already claimed the given window' +``` + +Jetzt wissen wir also, dass Speicher[5] ein Array von Fenstern und Adressen ist und ob die Adresse die Belohnung für dieses Fenster beansprucht hat. + +```python + ... + idx = 0 + s = 0 + while idx < _param4.length: + ... + if s + sha3(mem[(32 * _param4.length) + 328 len mem[(32 * _param4.length) + 296]]) > mem[(32 * idx) + 296]: + mem[mem[64] + 32] = mem[(32 * idx) + 296] + ... + s = sha3(mem[_62 + 32 len mem[_62]]) + continue + ... + s = sha3(mem[_66 + 32 len mem[_66]]) + continue + if unknown2eb4a7ab != s: + revert with 0, 'Invalid proof' +``` + +Wir wissen, dass `unknown2eb4a7ab` eigentlich die Funktion `merkleRoot()` ist, also sieht dieser Code so aus, als würde er einen [Merkle-Beweis](https://medium.com/crypto-0-nite/merkle-proofs-explained-6dd429623dc5) verifizieren. Das bedeutet, dass `_param4` ein Merkle-Beweis ist. + +```python + call addr(_param2) with: + value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei + gas 30000 wei +``` + +So überträgt ein Contract seine eigenen ETH an eine andere Adresse (Contract oder externer Besitz). Er ruft ihn mit einem Wert auf, der dem zu übertragenden Betrag entspricht. Es sieht also so aus, als ob dies ein Airdrop von ETH ist. + +```python + if not return_data.size: + if not ext_call.success: + require ext_code.size(stor2) + call stor2.deposit() with: + value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei +``` + +Die unteren beiden Zeilen sagen uns, dass Speicher[2] auch ein Contract ist, den wir aufrufen. Wenn wir uns [die Konstruktor-Transaktion ansehen](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange), sehen wir, dass dieser Contract [0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2) ist, ein Wrapped Ether-Contract, [dessen Quellcode auf Etherscan hochgeladen wurde](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code). + +Es sieht also so aus, als ob die Contracts versuchen, ETH an `_param2` zu senden. Wenn er es tun kann, großartig. Wenn nicht, versucht er, [WETH](https://weth.tkn.eth.limo/) zu senden. Wenn `_param2` ein Konto in externem Besitz (EOA) ist, kann es immer ETH empfangen, aber Contracts können den Empfang von ETH verweigern. WETH ist jedoch ERC-20 und Contracts können die Annahme nicht verweigern. + +```python + ... + log 0xdbd5389f: addr(_param2), unknown81e580d3[_param1] * _param3 / 100 * 10^6, bool(ext_call.success) +``` + +Am Ende der Funktion sehen wir, dass ein Log-Eintrag generiert wird. [Sehen Sie sich die generierten Log-Einträge an](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events) und filtern Sie nach dem Thema, das mit `0xdbd5...` beginnt. Wenn wir [auf eine der Transaktionen klicken, die einen solchen Eintrag generiert haben](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274), sehen wir, dass es tatsächlich wie ein Anspruch aussieht - das Konto hat eine Nachricht an den Contract gesendet, den wir per Reverse Engineering analysieren, und im Gegenzug ETH erhalten. + +![Eine Anspruchs-Transaktion](claim-tx.png) + +### 1e7df9d3 {#1e7df9d3} + +Diese Funktion ist sehr ähnlich zu [`claim`](#claim) oben. Es prüft auch einen Merkle-Beweis, versucht ETH auf den ersten zu übertragen und erzeugt die gleiche Art von Log-Eintrag. + +```python +def unknown1e7df9d3(uint256 _param1, uint256 _param2, array _param3) payable: + ... + idx = 0 + s = 0 + while idx < _param3.length: + if idx >= mem[96]: + revert with 0, 50 + _55 = mem[(32 * idx) + 128] + if s + sha3(mem[(32 * _param3.length) + 160 len mem[(32 * _param3.length) + 128]]) > mem[(32 * idx) + 128]: + ... + s = sha3(mem[_58 + 32 len mem[_58]]) + continue + mem[mem[64] + 32] = s + sha3(mem[(32 * _param3.length) + 160 len mem[(32 * _param3.length) + 128]]) + ... + if unknown2eb4a7ab != s: + revert with 0, 'Invalid proof' + ... + call addr(_param1) with: + value s wei + gas 30000 wei + if not return_data.size: + if not ext_call.success: + require ext_code.size(stor2) + call stor2.deposit() with: + value s wei + gas gas_remaining wei + ... + log 0xdbd5389f: addr(_param1), s, bool(ext_call.success) +``` + +Der Hauptunterschied besteht darin, dass der erste Parameter, das abzuhebende Fenster, nicht vorhanden ist. Stattdessen gibt es eine Schleife über alle Fenster, die beansprucht werden könnten. + +```python + idx = 0 + s = 0 + while idx < currentWindow: + ... + if stor5[mem[0]]: + if idx == -1: + revert with 0, 17 + idx = idx + 1 + s = s + continue + ... + stor5[idx][addr(_param1)] = 1 + if idx >= unknown81e580d3.length: + revert with 0, 50 + mem[0] = 4 + if unknown81e580d3[idx] and _param2 > -1 / unknown81e580d3[idx]: + revert with 0, 17 + if s > !(unknown81e580d3[idx] * _param2 / 100 * 10^6): + revert with 0, 17 + if idx == -1: + revert with 0, 17 + idx = idx + 1 + s = s + (unknown81e580d3[idx] * _param2 / 100 * 10^6) + continue +``` + +Es sieht also wie eine `claim`-Variante aus, die alle Fenster beansprucht. + +## Fazit {#conclusion} + +Inzwischen sollten Sie wissen, wie Sie Contracts verstehen können, deren Quellcode nicht verfügbar ist, indem Sie entweder die Opcodes oder (wenn es funktioniert) den Decompiler verwenden. Wie aus der Länge dieses Artikels ersichtlich ist, ist das Reverse Engineering eines Contracts nicht trivial, aber in einem System, in dem Sicherheit unerlässlich ist, ist es eine wichtige Fähigkeit, überprüfen zu können, ob Contracts wie versprochen funktionieren. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). diff --git a/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md index 38d446dbd7b..b443271c60c 100644 --- a/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md +++ b/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md @@ -1,267 +1,190 @@ --- -title: So verwandeln Sie Ihren Raspberry Pi 4 durch Überschreiben der MicroSD-Karte in einen Node -description: Verbinden Sie Ihren Raspberry Pi 4 mit einem Ethernetkabel, schließen Sie ihn anschließend an die SSD-Festplatte an und starten Sie das Gerät. Nun können Sie es als Ethereum-Node nutzen und eine Ausführungsebene oder Konsensebene (Beacon Chain/Validator) ausführen. +title: Betreibe einen Ethereum-Node auf einem Raspberry Pi 4 +description: Flashe deinen Raspberry Pi 4, stecke ein Ethernet-Kabel ein, schließe die SSD-Festplatte an und schalte das Gerät ein, um den Raspberry Pi 4 in einen vollwertigen Ethereum-Node + Validator zu verwandeln author: "EthereumOnArm" tags: - - "Clients" - - "Ausführungsebene" - - "Konsensebene" - - "Nodes" + [ + "Clients", + "Ausführungsebene", + "Konsensebene", + "Nodes" + ] lang: de -skill: advanced -published: 2020-05-07 -source: r/ethereum -sourceUrl: https://www.reddit.com/r/ethereum/comments/gf3nhg/ethereum_on_arm_raspberry_pi_4_images_release/ +skill: intermediate +published: 2022-06-10 +source: Ethereum on ARM +sourceUrl: https://ethereum-on-arm-documentation.readthedocs.io/en/latest/ --- -**TL;DR**: Verbinden Sie Ihren Raspberry Pi 4 mit einem Ethernetkabel, schließen Sie ihn anschließend an die SSD-Festplatte an und starten Sie das Gerät. Nun können Sie es als Ethereum-Node nutzen und eine Ausführungsebene oder Konsensebene (Beacon Chain/Validator) ausführen. +**Ethereum on Arm ist ein benutzerdefiniertes Linux-Image, das einen Raspberry Pi in einen Ethereum-Node verwandeln kann.** -[Mehr erfahren über Ethereum-Upgrades](/roadmap/) +Um Ethereum on Arm zu verwenden, um einen Raspberry Pi in einen Ethereum-Node zu verwandeln, wird die folgende Hardware empfohlen: -Zunächst ein paar Hintergrundinformationen: Wie Sie bereits wissen, gibt es einige Speicherprobleme [[1]](/developers/tutorials/run-node-raspberry-pi/#references) bei dem Raspberry Pi 4-Image, da die Betriebssoftware Raspbian OS bisher nur mit der 32-Bit-Version erhältlich ist [[2]](/developers/tutorials/run-node-raspberry-pi/#references) (das gilt jedenfalls für die Benutzeroberfläche). Obwohl wir das offizielle Betriebssystem bevorzugen würden, sind wir zu dem Entschluss gekommen, dass wir auf ein natives 64-Bit-Betriebssystem umsteigen müssen, um diese Probleme zu lösen. - -Außerdem unterstützen Konsens-Clients keine 32-Bit-Binärdateien, so dass die Verwendung von Raspbian den Raspberry Pi 4 vom Betrieb eines Node auf Konsensebene (und der Möglichkeit des Staking) ausschließen würde. - -Nach mehreren Tests veröffentlichen wir nun zwei verschiedene Images auf Basis von Ubuntu 20.04 64-Bit [[3]](/developers/tutorials/run-node-raspberry-pi/#references): Ausführungsebenen- und Konsensebenen-Editionen. - -Im Grunde genommen handelt es sich bei beiden um das gleiche Image, das die gleichen Funktionen wie die Raspbian-basierten Images enthält. Sie sind jedoch standardmäßig für die Ausführung von Software der Ausführungsebene oder der Konsensebene eingerichtet. - -**Images übernehmen alle notwendigen Schritte**, von der Einrichtung der Umgebung und der Formatierung der SSD-Platte über die Installation und Ausführung der Ethereum-Software bis hin zum Start der Blockchain-Synchronisation. - -## Hauptfunktionen {#main-features} - -- Basierend auf Ubuntu 20.04 64-Bit -- Automatische Partitionierung und Formatierung von USB-Festplatten -- Fügt Swap-Speicher hinzu (ZRAM-Kernel-Modul und eine Swap-Datei), basierend auf der Arbeit von Armbian [[7]](/developers/tutorials/run-node-raspberry-pi/#references) -- Ändert den Hostnamen anhand des MAC-Hashes in etwas wie "ethnode-e2a3e6fe" -- Führt Software als systemd-Dienst aus und beginnt mit der Synchronisierung der Blockchain -- Enthält ein APT-Repository für die Installation und Aktualisierung von Ethereum-Software -- Enthält ein auf Grafana/Prometheus basierendes Überwachungs-Dashboard - -## Enthaltene Software {#software-included} - -Beide Images enthalten die gleichen Pakete. Der einzige Unterschied besteht darin, dass die Ausführungsversion standardmäßig Geth und die Konsensversion standardmäßig die Prysm-Beacon Chain ausführt. - -### Ausführungs-Clients {#execution-clients} - -- Geth [[8]](/developers/tutorials/run-node-raspberry-pi/#references): 1.9.13 (offizielle Binärdatei) -- Parity [[9]](/developers/tutorials/run-node-raspberry-pi/#references): 2.7.2 (quer kompiliert) -- Nethermind [[10]](/developers/tutorials/run-node-raspberry-pi/#references): 1.8.28 (quer kompiliert) -- Hyperledger Besu [[11]](/developers/tutorials/run-node-raspberry-pi/#references): 1.4.4 (kompiliert) - -### Konsens-Clients {#consensus-clients} - -- Prysm [[12]](/developers/tutorials/run-node-raspberry-pi/#references): 1.0.0-alpha6 (offizielle Binärdatei) -- Lighthouse [[13]](/developers/tutorials/run-node-raspberry-pi/#references): 0.1.1 (kompiliert) - -### Ethereum-Framework {#ethereum-framework} - -- Swarm [[14]](/developers/tutorials/run-node-raspberry-pi/#references): 0.5.7 (offizielle Binärdatei) -- Raiden Network [[15]](/developers/tutorials/run-node-raspberry-pi/#references): 0.200.0~rc1 (offizielle Binärdatei) -- IPFS [[16]](/developers/tutorials/run-node-raspberry-pi/#references): 0.5.0 (offizielle Binärdatei) -- Statusd [[17]](/developers/tutorials/run-node-raspberry-pi/#references): 0.52.3 (kompiliert) -- Vipnode [[18]](/developers/tutorials/run-node-raspberry-pi/#references): 2.3.3 (offizielle Binärdatei) - -## Installationsanleitung und Anwendung {#installation-guide-and-usage} - -### Empfohlene Hardware und Einrichtung {#recommended-hardware-and-setup} - -- Raspberry 4 (Model B) – 4 GB -- MicroSD-Karte (mindestens 16 GB Klasse 10) -- SSD-USB-3.0-Festplatte (siehe Speicherabschnitt) +- Raspberry 4 (Modell B 8 GB), Odroid M1 oder Rock 5B (8 GB/16 GB RAM) Platine +- MicroSD-Karte (mindestens 16 GB, Klasse 10) +- Mindestens 2 TB große SSD als USB-3.0-Laufwerk oder eine SSD in einem USB-zu-SATA-Gehäuse. - Stromversorgung - Ethernet-Kabel -- 30303-Portweiterleitung (Ausführungseben) und 13000-Portweiterleitung (Konsensebene) [[4]](/developers/tutorials/run-node-raspberry-pi/#references) -- Ein Gehäuse mit Kühlkörper und Lüfter (optional, aber dringend empfohlen) -- USB-Tastatur, Monitor und HDMI-Kabel (micro-HDMI) (optional) - -## Speicher {#storage} - -Sie benötigen eine SSD, um die Ethereum-Clients auszuführen (ohne SSD-Laufwerk gibt es absolut keine Chance, die Ethereum-Blockchain zu synchronisieren). Es gibt zwei Optionen: - -- Verwenden Sie eine tragbare USB-SSD-Festplatte wie die Samsung T5 Portable SSD. -- Verwenden Sie ein externes USB 3.0-Festplattengehäuse mit einer SSD-Festplatte. In unserem Fall haben wir ein Inateck 2.5 Hard Drive Enclosure FE2011 verwendet. Achten Sie darauf, ein Gehäuse mit einem UAS-kompatiblen Chip zu kaufen, insbesondere einen der folgenden: JMicron (JMS567 oder JMS578) oder ASMedia (ASM1153E). +- Portweiterleitung (siehe Clients für weitere Informationen) +- Ein Gehäuse mit Kühlkörper und Lüfter +- USB-Tastatur, Monitor und HDMI-Kabel (Micro-HDMI) (optional) -In beiden Fällen sollten Sie vermeiden, minderwertige SSD-Festplatten zu kaufen, da sie eine Schlüsselkomponente Ihrer Nodes sind und die Leistung (und die Synchronisierungszeiten) drastisch beeinträchtigen können. +## Warum Ethereum auf ARM betreiben? {#why-run-ethereum-on-arm} -Beachten Sie, dass die Festplatte an einen USB 3.0-Anschluss (blau) angeschlossen sein muss. +ARM-Platinen sind sehr preisgünstige, flexible, kleine Computer. Sie sind eine gute Wahl für den Betrieb von Ethereum-Nodes, weil sie günstig zu erwerben sind, so konfiguriert werden können, dass alle ihre Ressourcen nur auf den Node ausgerichtet sind, was sie effizient macht, sie wenig Strom verbrauchen und physisch klein sind, sodass sie unauffällig in jedes Zuhause passen. Es ist auch sehr einfach, Nodes zu starten, da die MicroSD-Karte des Raspberry Pi einfach mit einem vorgefertigten Image geflasht werden kann, ohne dass Software heruntergeladen oder erstellt werden muss. -## Images herunterladen und Installieren {#image-download-and-installation} +## Wie funktioniert das? {#how-does-it-work} -### 1. Laden Sie die Images der Ausführungs- und Konsensebene herunter {#1-download-execution-or-consensus-images} +Die Speicherkarte des Raspberry Pi wird mit einem vorgefertigten Image geflasht. Dieses Image enthält alles, was zum Betreiben eines Ethereum-Nodes benötigt wird. Mit einer geflashten Karte musst du nur noch den Raspberry Pi einschalten. Alle Prozesse, die für den Betrieb des Nodes erforderlich sind, werden automatisch gestartet. Das funktioniert, weil die Speicherkarte ein Linux-basiertes Betriebssystem (OS) enthält, auf dem automatisch Prozesse auf Systemebene ausgeführt werden, die das Gerät in einen Ethereum-Node verwandeln. - - Image der Ausführungsebene herunterladen - +Ethereum kann nicht mit dem beliebten Raspberry Pi Linux-Betriebssystem „Raspbian“ betrieben werden, da Raspbian immer noch eine 32-Bit-Architektur verwendet, was dazu führt, dass Ethereum-Benutzer auf Speicherprobleme stoßen und Konsens-Clients keine 32-Bit-Binärdateien unterstützen. Um dies zu überwinden, ist das Ethereum-on-Arm-Team auf ein natives 64-Bit-Betriebssystem namens „Armbian“ umgestiegen. -sha256 7fa9370d13857dd6abcc8fde637c7a9a7e3a66b307d5c28b0c0d29a09c73c55c +**Images übernehmen alle notwendigen Schritte, von der Einrichtung der Umgebung und der Formatierung der SSD-Platte über die Installation und Ausführung der Ethereum-Software bis hin zum Start der Blockchain-Synchronisation.** - - Image der Konsensebene herunterladen - +## Hinweis zu Ausführungs- und Konsens-Clients {#note-on-execution-and-consensus-clients} -sha256 74c0c15b708720e5ae5cac324f1afded6316537fb17166109326755232cd316e +Das Ethereum on Arm-Image enthält vorgefertigte Ausführungs- und Konsens-Clients als Dienste. Ein Ethereum-Node erfordert, dass beide Clients synchronisiert sind und laufen. Du musst nur das Image herunterladen, es flashen und dann die Dienste starten. Das Image ist mit den folgenden Ausführungs-Clients vorinstalliert: -### 2. Das Image flashen {#2-flash-the-image} +- Geth +- Nethermind +- Besu -Stecken Sie die microSD-Karte in Ihren Desktop/Laptop und laden Sie die Datei herunter (z. B. die Ausführungsebene): +und die folgenden Konsens-Clients: -```bash -wget https://ethraspbian.com/downloads/ubuntu-20.04-preinstalled-server-arm64+raspi-eth1.img.zip -``` +- Lighthouse +- Nimbus +- Prysm +- Teku -Hinweis: Wenn Sie mit der Befehlszeile nicht vertraut sind oder unter Windows arbeiten, können Sie [Etcher](https://etcher.io) verwenden. +Du solltest einen von jedem zum Ausführen auswählen - alle Ausführungs-Clients sind mit allen Konsens-Clients kompatibel. Wenn du nicht explizit einen Client auswählst, greift der Node auf seine Standardeinstellungen - Geth und Lighthouse - zurück und führt sie automatisch aus, wenn die Platine eingeschaltet wird. Du musst Port 30303 auf deinem Router öffnen, damit Geth Peers finden und sich mit ihnen verbinden kann. -Öffnen Sie ein Terminal und überprüfen Sie den Namen Ihres MicroSD-Geräts: +## Herunterladen des Images {#downloading-the-image} -```bash -sudo fdisk -l -``` +Das Raspberry Pi 4 Ethereum-Image ist ein „Plug-and-Play“-Image, das automatisch sowohl die Ausführungs- als auch die Konsens-Clients installiert und einrichtet, sie so konfiguriert, dass sie miteinander kommunizieren und sich mit dem Ethereum-Netzwerk verbinden. Alles, was du tun musst, ist, deine Prozesse mit einem einfachen Befehl zu starten. -Sie sollten ein Gerät namens "mmcblk0" oder "sdd" sehen. Entpacken und flashen des Images: +Lade das Raspberry Pi-Image von [Ethereum on Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1) herunter und überprüfe den SHA256-Hash: -```bash -unzip ubuntu-20.04-preinstalled-server-arm64+raspi-eth1.img.zip -sudo dd bs=1M if=ubuntu-20.04-preinstalled-server-arm64+raspi-eth1.img of=/dev/mmcblk0 && sync +```sh +# Aus dem Verzeichnis, das das heruntergeladene Image enthält +shasum -a 256 ethonarm_22.04.00.img.zip +# Der Hash sollte Folgendes ausgeben: fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f ``` -### 3. Setzen Sie die MicroSD-Karte in den Raspberry Pi 4 ein. Schließen ein Ethernet-Kabel und die USB-SSD-Festplatte an (stellen Sie sicher, dass Sie einen blauen Anschluss verwenden). {#3-insert-the-microsd-into-the-raspberry-pi-4-connect-an-ethernet-cable-and-attach-the-usb-ssd-disk-make-sure-you-are-using-a-blue-port} - -### 4. Das Gerät einschalten {#4-power-on-the-device} - -Das Ubuntu-Betriebssystem wird in weniger als einer Minute hochgefahren, aber Sie müssen **etwa 10 Minuten warten**, damit das Skript die notwendigen Aufgaben durchführen kann, um das Gerät in einen Ethereum-Node zu verwandeln und den Raspberry neu zu starten. +Beachte, dass Images für Rock 5B- und Odroid M1-Platinen auf der Ethereum-on-Arm-[Download-Seite](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/quick-guide/download-and-install.html) verfügbar sind. -Je nach Image, wird das wie folgt ausgeführt: +## Flashen der MicroSD {#flashing-the-microsd} -- Ausführungs-Client: Geth als Standard-Client für die Synchronisierung der Blockchain -- Konsens-Client: Prysm als Standard-Client für die Synchronisierung der Beacon Chain (Goerli-Testnet) +Die MicroSD-Karte, die für den Raspberry Pi verwendet werden soll, sollte zuerst in einen Desktop oder Laptop eingelegt werden, damit sie geflasht werden kann. Mit den folgenden Terminalbefehlen wird das heruntergeladene Image auf die SD-Karte geflasht: -### 5. Anmelden {#5-log-in} - -Sie können sich über SSH oder über die Konsole anmelden (wenn Sie einen Monitor und eine Tastatur angeschlossen haben). +```shell +# Namen der MicroSD-Karte überprüfen +sudo fdisk -l -```bash -User: ethereum -Password: ethereum +>> sdxxx ``` -Bei der ersten Anmeldung werden Sie aufgefordert, das Passwort zu ändern, so dass Sie sich zweimal anmelden müssen. - -### 6. Öffnen Sie den Port 30303 für Geth und 13000, wenn Sie eine Prysm-Beacon Chain verwenden. Wenn Sie nicht wissen, wie das geht, geben Sie in einer Suchmaschine "Portweiterleitung" gefolgt von Ihrem Routermodell ein. {#6-open-30303-port-for-geth-and-13000-if-you-are-running-prysm-beacon-chain-if-you-dont-know-how-to-do-this-google-port-forwarding-followed-by-your-router-model} - -### 7. Konsolenausgabe abrufen {#7-get-console-output} - -Sie können sehen, was im Hintergrund passiert, indem Sie Folgendes eingeben: +Es ist sehr wichtig, den richtigen Namen zu verwenden, da der nächste Befehl `dd` enthält, der den gesamten Inhalt der Karte löscht, bevor das Image darauf geschrieben wird. Um fortzufahren, navigiere zu dem Verzeichnis, das das gezippte Image enthält: -```bash -sudo tail -f /var/log/syslog +```shell +# Image entpacken und flashen +unzip ethonarm_22.04.00.img.zip +sudo dd bs=1M if=ethonarm_22.04.00.img of=/dev/ conv=fdatasync status=progress ``` -**Herzlichen Glückwunsch. Sie betreiben nun einen vollständigen Ethereum-Node auf Ihrem Raspberry Pi 4.** +Die Karte ist nun geflasht und kann in den Raspberry Pi eingelegt werden. -## Synchronisierung mit der Blockchain {#syncing-the-blockchain} +## Den Node starten {#start-the-node} -Jetzt müssen Sie warten, bis die Blockchain synchronisiert ist. Im Falle der Ausführungsebene wird dieser Vorgang einige Tage dauern, da er von verschiedenen Faktoren abhängig ist. Sie können mit bis zu 5-7 Tagen rechnen. +Stecke die SD-Karte in den Raspberry Pi, schließe das Ethernet-Kabel und die SSD an und schalte das Gerät ein. Das Betriebssystem wird hochfahren und automatisch damit beginnen, die vorkonfigurierten Aufgaben auszuführen, die den Raspberry Pi in einen Ethereum-Node verwandeln, einschließlich der Installation und Erstellung der Client-Software. Dies wird wahrscheinlich 10-15 Minuten dauern. -Wenn Sie die Konsensebene des Goerli-Testnets verwenden, können Sie mit einer Synchronisationszeit von 1-2 Tagen für die Beacon Chain rechnen. Denken Sie daran, dass Sie den Validator später einrichten müssen, um den Staking-Prozess zu starten. [So führen Sie den Konsensebenen-Validator aus](/developers/tutorials/run-node-raspberry-pi/#validator). +Sobald alles installiert und konfiguriert ist, melde dich über eine SSH-Verbindung am Gerät an oder verwende das Terminal direkt, wenn ein Monitor und eine Tastatur an die Platine angeschlossen sind. Verwende das `ethereum`-Konto zum Anmelden, da dieses die erforderlichen Berechtigungen zum Starten des Nodes hat. -## Dashboards überwachen {#monitoring-dashboards} +```shell +Benutzer: ethereum +Passwort: ethereum +``` -Für diese erste Version haben wir 3 Überwachungs-Dashboards auf Grundlage von Prometheus [[5]](/developers/tutorials/run-node-raspberry-pi/#references)/Grafana [[6]](/developers/tutorials/run-node-raspberry-pi/#references) eingebaut, um den Node und die Daten der Clients (Geth und Besu) zu überwachen. Sie können über Ihren Webbrowser darauf zugreifen: +Der Standard-Ausführungs-Client, Geth, startet automatisch. Du kannst dies bestätigen, indem du die Protokolle mit dem folgenden Terminal-Befehl überprüfst: -```bash -URL: http://your_raspberrypi_IP:3000 -User: admin -Password: ethereum +```sh +sudo journalctl -u geth -f ``` -## Clients wechseln {#switching-clients} +Der Konsens-Client muss explizit gestartet werden. Öffne dazu zuerst Port 9000 auf deinem Router, damit Lighthouse Peers finden und eine Verbindung zu ihnen herstellen kann. Aktivieren und starten Sie dann den Lighthouse-Dienst: -Alle Clients laufen als Systemdienst. Das ist wichtig, denn wenn ein Problem auftritt, wird das System den Prozess automatisch neu starten. +```sh +sudo systemctl enable lighthouse-beacon +sudo systemctl start lighthouse-beacon +``` -Die Beacon Chain von Geth und Prysm läuft standardmäßig (je nachdem, wie Sie synchronisieren, Ausführungsebene oder Konsensebene). Wenn Sie also zu einem anderen Client wechseln möchten (z. B. von Geth zu Nethermind), müssen Sie zuerst Geth anhalten und deaktivieren und dann den anderen Client aktivieren und starten: +Überprüfe den Client anhand der Protokolle: -```bash -sudo systemctl stop geth && sudo systemctl disable geth +```sh +sudo journalctl -u lighthouse-beacon ``` -Befehle zum Aktivieren und Starten jedes Ausführungs-Clients: +Beachte, dass der Konsens-Client in wenigen Minuten synchronisiert wird, da er die Checkpoint-Synchronisierung verwendet. Der Ausführungs-Client wird länger brauchen – möglicherweise mehrere Stunden – und er startet erst, wenn der Konsens-Client bereits synchronisiert ist (das liegt daran, dass der Ausführungs-Client ein Ziel für die Synchronisierung benötigt, das der synchronisierte Konsens-Client bereitstellt). -```bash -sudo systemctl enable besu && sudo systemctl start besu -sudo systemctl enable nethermind && sudo systemctl start nethermind -sudo systemctl enable parity && sudo systemctl start parity -``` +Wenn die Dienste Geth und Lighthouse laufen und synchronisiert sind, ist dein Raspberry Pi jetzt ein Ethereum-Node! Am häufigsten wird mit dem Ethereum-Netzwerk über die Javascript-Konsole von Geth interagiert, die an den Geth-Client an Port 8545 angehängt werden kann. Es ist auch möglich, Befehle, die als JSON-Objekte formatiert sind, mit einem Anfrage-Tool wie Curl zu übermitteln. Mehr dazu findest du in der [Geth-Dokumentation](https://geth.ethereum.org/). -Konsens-Clients: +Geth ist so vorkonfiguriert, dass es Metriken an ein Grafana-Dashboard meldet, das im Browser angezeigt werden kann. Als fortgeschrittener Benutzer möchtest du diese Funktion möglicherweise nutzen, um den Zustand deines Nodes zu überwachen, indem du zu `ipaddress:3000` navigierst und `user: admin` sowie `passwd: ethereum` eingibst. -```bash -sudo systemctl stop prysm-beacon && sudo systemctl disable prysm-beacon -sudo systemctl start lighthouse && sudo systemctl enable lighthouse -``` +## Validatoren {#validators} -## Parameter ändern {#changing-parameters} +Optional kann auch ein Validator zum Konsens-Client hinzugefügt werden. Die Validator-Software ermöglicht es deinem Node, aktiv am Konsens teilzunehmen und versorgt das Netzwerk mit kryptoökonomischer Sicherheit. Für diese Arbeit wirst du in ETH belohnt. Um einen Validator zu betreiben, musst du zunächst 32 ETH besitzen, die in den Einzahlungsvertrag eingezahlt werden müssen. Die Einzahlung kann erfolgen, indem du der Schritt-für-Schritt-Anleitung auf dem [Launchpad](https://launchpad.ethereum.org/) folgst. Führe dies auf einem Desktop/Laptop durch, aber generiere keine Schlüssel – dies kann direkt auf dem Raspberry Pi erledigt werden. -Die Konfigurationsdateien der Clients befinden sich in dem Verzeichnis /etc/ethereum/. Sie können diese Dateien bearbeiten und den Systemdienst neu starten, damit die Änderungen wirksam werden. Die einzige Ausnahme ist Nethermind, das zusätzlich eine Mainnet-Konfigurationsdatei hat, die sich hier befindet: +Öffne ein Terminal auf dem Raspberry Pi und führe den folgenden Befehl aus, um die Einzahlungsschlüssel zu generieren: -```bash -/etc/nethermind/configs/mainnet.cfg +``` +sudo apt-get update +sudo apt-get install staking-deposit-cli +cd && deposit new-mnemonic --num_validators 1 ``` -Die Daten der Blockchain-Clients werden wie folgt auf dem Ethereum-Home-Konto gespeichert (beachten Sie den Punkt vor dem Verzeichnisnamen): - -### Ausführungsebene {#execution-layer} +(Oder lade das [staking-deposit-cli](https://github.com/ethereum/staking-deposit-cli) herunter, um es auf einer Air-Gapped-Maschine auszuführen, und führe den Befehl `deposit new-mnemnonic` aus) -```bash -/home/ethereum/.geth -/home/ethereum/.parity -/home/ethereum/.besu -/home/ethereum/.nethermind -``` +Bewahre die mnemonische Phrase sicher auf! Der obige Befehl hat zwei Dateien im Keystore des Nodes generiert: die Validator-Schlüssel und eine Einzahlungsdatendatei. Die Einzahlungsdaten müssen auf das Launchpad hochgeladen werden, daher müssen sie vom Raspberry Pi auf den Desktop/Laptop kopiert werden. Dies kann über eine SSH-Verbindung oder eine andere Kopieren-und-Einfügen-Methode erfolgen. -### Konsensebene {#consensus-layer} +Sobald die Einzahlungsdatendatei auf dem Computer verfügbar ist, auf dem das Launchpad läuft, kann sie auf das `+` auf dem Launchpad-Bildschirm gezogen und abgelegt werden. Folge den Anweisungen auf dem Bildschirm, um eine Transaktion an den Einzahlungsvertrag zu senden. -```bash -/home/ethereum/.eth2 -/home/ethereum/.eth2validators -/home/ethereum/.lighthouse -``` +Zurück auf dem Raspberry Pi kann ein Validator gestartet werden. Dies erfordert den Import der Validator-Schlüssel, das Festlegen der Adresse zum Sammeln von Belohnungen und dann das Starten des vorkonfigurierten Validator-Prozesses. Das folgende Beispiel gilt für Lighthouse – Anleitungen für andere Konsens-Clients sind in den [Ethereum-on-Arm-Dokumenten](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) verfügbar: -## Nethermind und Hyperledger Besu {#nethermind-and-hyperledger-besu} +```shell +# Validator-Schlüssel importieren +lighthouse account validator import --directory=/home/ethereum/validator_keys -Diese beiden großartigen Ausführungs-Clients sind eine sehr gute Alternative zu Geth und Parity geworden. Je größer die Vielfalt im Netz, desto besser. Also probieren Sie sie aus und leisten Sie damit einen Beitrag zur Gesundheit des Netzwerks. +# Belohnungsadresse festlegen +sudo sed -i 's/' /etc/ethereum/lighthouse-validator.conf -Beide Clients müssen noch weiter getestet werden. Experimentieren Sie also gerne damit und geben Sie uns Feedback dazu. +# Validator starten +sudo systemctl start lighthouse-validator +``` -## So führen Sie den Konsensvalidator aus (Staking) {#validator} +Herzlichen Glückwunsch, du hast jetzt einen vollständigen Ethereum-Node und Validator, der auf einem Raspberry Pi läuft! -Sobald die Görli-Testnet-Beacon-Chain synchronisiert ist, können Sie einen Validator in demselben Gerät ausführen. Sie müssen [diese Teilnahmeschritte](https://prylabs.net/participate) befolgen. +## Weitere Details {#more-details} -Beim ersten Mal ist es erforderlich, manuell ein Konto zu erstellen. Führen Sie dazu das Binärprogramm "validator" aus und legen Sie ein Passwort fest. Sobald Sie diesen Schritt abgeschlossen haben, können Sie das Passwort zu `/etc/ethereum/prysm-validator.conf` hinzufügen und den Validator als Systemdienst starten. +Diese Seite gab einen Überblick darüber, wie man einen Geth-Lighthouse-Node und -Validator mit einem Raspberry Pi einrichtet. Detailliertere Anweisungen sind auf der [Ethereum-on-Arm-Webseite](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/index.html) verfügbar. ## Feedback erwünscht {#feedback-appreciated} -Wir haben viel Arbeit investiert, um den Raspberry Pi 4 als vollwertigen Ethereum-Node einzurichten, da wir wissen, dass die große Nutzerbasis dieses Geräts einen sehr positiven Einfluss auf das Netzwerk haben kann. - -Beachten Sie, dass dies das erste Image auf Basis von Ubuntu 20.04 ist und es daher noch einige Fehler enthalten kann. Wenn Sie das feststellen, eröffnen Sie ein Thema auf [GitHub](https://github.com/diglos/ethereumonarm) oder kontaktieren Sie uns auf [Twitter](https://twitter.com/EthereumOnARM). +Wir wissen, dass der Raspberry Pi eine riesige Nutzerbasis hat, die einen sehr positiven Einfluss auf die Gesundheit des Ethereum-Netzwerks haben könnte. +Bitte vertiefe dich in die Details dieses Tutorials, probiere es auf Testnets aus, sieh dir das Ethereum on Arm GitHub an, gib Feedback, melde Probleme und erstelle Pull-Requests und hilf mit, die Technologie und Dokumentation voranzubringen! ## Referenzen {#references} -1. [geth stürzt wiederholt mit SIGSEGV ab](https://github.com/ethereum/go-ethereum/issues/20190) -2. [https://github.com/diglos/ethereumonarm](https://github.com/diglos/ethereumonarm) -3. https://ubuntu.com/download/raspberry-pi -4. https://wikipedia.org/wiki/Port_forwarding -5. https://prometheus.io -6. https://grafana.com -7. https://forum.armbian.com/topic/5565-zram-vs-swap/ -8. https://geth.ethereum.org -9. https://github.com/openethereum/openethereum \* **Beachten Sie, dass OpenEthereum [veraltet](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd) ist und nicht mehr gepflegt wird.** Verwenden Sie es mit Vorsicht und wechseln Sie lieber zu einer anderen Client-Implementierung. -10. https://nethermind.io -11. https://www.hyperledger.org/projects/besu -12. https://github.com/prysmaticlabs/prysm -13. https://lighthouse.sigmaprime.io -14. https://ethersphere.github.io/swarm-home -15. https://raiden.network -16. https://ipfs.io -17. https://status.im -18. https://vipnode.org +1. https://ubuntu.com/download/raspberry-pi +2. https://wikipedia.org/wiki/Port_forwarding +3. https://prometheus.io +4. https://grafana.com +5. https://forum.armbian.com/topic/5565-zram-vs-swap/ +6. https://geth.ethereum.org +7. https://nethermind.io +8. https://www.hyperledger.org/projects/besu +9. https://github.com/prysmaticlabs/prysm +10. https://lighthouse.sigmaprime.io +11. https://ethersphere.github.io/swarm-home +12. https://raiden.network +13. https://ipfs.io +14. https://status.im +15. https://vipnode.org diff --git a/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md b/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md new file mode 100644 index 00000000000..1f72cf3b464 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md @@ -0,0 +1,470 @@ +--- +title: "Einige Tricks, die von Betrugs-Tokens verwendet werden, und wie man sie erkennt" +description: In diesem Tutorial analysieren wir einen Betrugs-Token, um einige der Tricks zu sehen, die Betrüger anwenden, wie sie sie implementieren und wie wir sie erkennen können. +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +tags: + [ + "Betrug", + "Solidity", + "Erc-20", + "javascript", + "typescript" + ] +skill: intermediate +published: 15.09.2023 +lang: de +--- + +In diesem Tutorial analysieren wir [einen Betrugs-Token](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code), um einige der Tricks zu sehen, die Betrüger anwenden und wie sie sie implementieren. Am Ende des Tutorials werden Sie einen umfassenderen Überblick über ERC-20-Token-Verträge, ihre Fähigkeiten und warum Skepsis notwendig ist, haben. Dann schauen wir uns die von diesem Betrugs-Token ausgegebenen Ereignisse an und sehen, wie wir automatisch erkennen können, dass er nicht legitim ist. + +## Betrugs-Tokens – was sind sie, warum machen Leute sie und wie kann man sie vermeiden {#scam-tokens} + +Eine der häufigsten Anwendungen von Ethereum ist die Schaffung eines handelbaren Tokens durch eine Gruppe, der gewissermaßen ihre eigene Währung darstellt. Jedoch gibt es überall, wo es legitime wertschöpfende Anwendungsmöglichkeiten gibt, auch Kriminelle, die diese Werte stehlen möchten. + +Sie können mehr über dieses Thema [an anderer Stelle auf ethereum.org](/guides/how-to-id-scam-tokens/) aus der Perspektive eines Benutzers lesen. Dieses Tutorial konzentriert sich auf die Analyse eines Betrugs-Tokens, um zu sehen, wie es gemacht wird und wie es erkannt werden kann. + +### Woher weiß ich, dass wARB ein Betrug ist? {#warb-scam} + +Der Token, den wir analysieren, ist [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code), der vorgibt, dem legitimen [ARB-Token](https://etherscan.io/token/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1) gleichwertig zu sein. + +Der einfachste Weg, um zu wissen, welcher der legitime Token ist, ist ein Blick auf die Herkunftsorganisation, [Arbitrum](https://arbitrum.foundation/). Die legitimen Adressen sind [in ihrer Dokumentation](https://docs.arbitrum.foundation/deployment-addresses#token) angegeben. + +### Warum ist der Quellcode verfügbar? {#why-source} + +Normalerweise würden wir erwarten, dass Leute, die versuchen, andere zu betrügen, geheimnisvoll sind, und tatsächlich haben viele Betrugs-Tokens ihren Code nicht verfügbar (zum Beispiel [dieser](https://optimistic.etherscan.io/token/0x15992f382d8c46d667b10dc8456dc36651af1452#code) und [dieser](https://optimistic.etherscan.io/token/0x026b623eb4aada7de37ef25256854f9235207178#code)). + +Allerdings veröffentlichen legitime Tokens normalerweise ihren Quellcode, sodass die Autoren von Betrugs-Tokens manchmal dasselbe tun, um legitim zu erscheinen. [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code) ist einer dieser Tokens mit verfügbarem Quellcode, was das Verständnis erleichtert. + +Während Vertrags-Deployer wählen können, ob sie den Quellcode veröffentlichen oder nicht, können sie _nicht_ den falschen Quellcode veröffentlichen. Der Block-Explorer kompiliert den bereitgestellten Quellcode unabhängig, und wenn er nicht genau denselben Bytecode erhält, lehnt er diesen Quellcode ab. [Sie können mehr darüber auf der Etherscan-Seite lesen](https://etherscan.io/verifyContract). + +## Vergleich mit legitimen ERC-20-Tokens {#compare-legit-erc20} + +Wir werden diesen Token mit legitimen ERC-20-Tokens vergleichen. Wenn Sie nicht damit vertraut sind, wie legitime ERC-20-Tokens typischerweise geschrieben werden, [sehen Sie sich dieses Tutorial an](/developers/tutorials/erc20-annotated-code/). + +### Konstanten für privilegierte Adressen {#constants-for-privileged-addresses} + +Verträge benötigen manchmal privilegierte Adressen. Verträge, die für den langfristigen Gebrauch konzipiert sind, erlauben es einigen privilegierten Adressen, diese Adressen zu ändern, zum Beispiel um die Verwendung eines neuen Multisig-Vertrags zu ermöglichen. Es gibt mehrere Möglichkeiten, dies zu tun. + +Der [`HOP`-Token-Vertrag](https://etherscan.io/address/0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc#code) verwendet das [`Ownable`](https://docs.openzeppelin.com/contracts/2.x/access-control#ownership-and-ownable)-Muster. Die privilegierte Adresse wird im Speicher in einem Feld namens `_owner` gehalten (siehe die dritte Datei, `Ownable.sol`). + +```solidity +abstract contract Ownable is Context { + address private _owner; + . + . + . +} +``` + +Der [`ARB`-Token-Vertrag](https://etherscan.io/address/0xad0c361ef902a7d9851ca7dcc85535da2d3c6fc7#code) hat nicht direkt eine privilegierte Adresse. Er braucht jedoch auch keine. Er befindet sich hinter einem [`Proxy`](https://docs.openzeppelin.com/contracts/5.x/api/proxy) an der [Adresse `0xb50721bcf8d664c30412cfbc6cf7a15145234ad1`](https://etherscan.io/address/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1#code). Dieser Vertrag hat eine privilegierte Adresse (siehe die vierte Datei, `ERC1967Upgrade.sol`), die für Upgrades verwendet werden kann. + +```solidity + /** + * @dev Speichert eine neue Adresse im EIP1967-Admin-Slot. + */ + function _setAdmin(address newAdmin) private { + require(newAdmin != address(0), "ERC1967: new admin is the zero address"); + StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin; + } +``` + +Im Gegensatz dazu hat der `wARB`-Vertrag einen fest codierten `contract_owner`. + +```solidity +contract WrappedArbitrum is Context, IERC20 { + . + . + . + address deployer = 0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1; + address public contract_owner = 0xb40dE7b1beE84Ff2dc22B70a049A07A13a411A33; + . + . + . +} +``` + +[Dieser Vertragsinhaber](https://etherscan.io/address/0xb40dE7b1beE84Ff2dc22B70a049A07A13a411A33) ist kein Vertrag, der zu verschiedenen Zeiten von verschiedenen Konten kontrolliert werden könnte, sondern ein [externes Konto](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs). Das bedeutet, dass es wahrscheinlich für den kurzfristigen Gebrauch durch eine Einzelperson konzipiert ist, anstatt als langfristige Lösung zur Kontrolle eines ERC-20, das wertvoll bleiben wird. + +Und tatsächlich, wenn wir in Etherscan nachsehen, sehen wir, dass der Betrüger diesen Vertrag nur für 12 Stunden (von der [ersten Transaktion](https://etherscan.io/tx/0xf49136198c3f925fcb401870a669d43cecb537bde36eb8b41df77f06d5f6fbc2) bis zur [letzten Transaktion](https://etherscan.io/tx/0xdfd6e717157354e64bbd5d6adf16761e5a5b3f914b1948d3545d39633244d47b)) am 19. Mai 2023 verwendet hat. + +### Die gefälschte `_transfer`-Funktion {#the-fake-transfer-function} + +Es ist Standard, dass tatsächliche Transfers über eine [interne `_transfer`-Funktion](/developers/tutorials/erc20-annotated-code/#the-_transfer-function-_transfer) stattfinden. + +In `wARB` sieht diese Funktion fast legitim aus: + +```solidity + function _transfer(address sender, address recipient, uint256 amount) internal virtual{ + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _beforeTokenTransfer(sender, recipient, amount); + + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); + if (sender == contract_owner){ + sender = deployer; + } + emit Transfer(sender, recipient, amount); + } +``` + +Der verdächtige Teil ist: + +```solidity + if (sender == contract_owner){ + sender = deployer; + } + emit Transfer(sender, recipient, amount); +``` + +Wenn der Vertragsinhaber Tokens sendet, warum zeigt das `Transfer`-Ereignis, dass sie von `deployer` kommen? + +Es gibt jedoch ein wichtigeres Problem. Wer ruft diese `_transfer`-Funktion auf? Sie kann nicht von außen aufgerufen werden, sie ist als `internal` markiert. Und der Code, den wir haben, enthält keine Aufrufe an `_transfer`. Offensichtlich ist sie hier als Köder. + +```solidity + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { + _f_(_msgSender(), recipient, amount); + return true; + } + + function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { + _f_(sender, recipient, amount); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); + return true; + } +``` + +Wenn wir uns die Funktionen ansehen, die zum Übertragen von Tokens aufgerufen werden, `transfer` und `transferFrom`, sehen wir, dass sie eine völlig andere Funktion aufrufen, `_f_`. + +### Die echte `_f_`-Funktion {#the-real-f-function} + +```solidity + function _f_(address sender, address recipient, uint256 amount) internal _mod_(sender,recipient,amount) virtual { + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _beforeTokenTransfer(sender, recipient, amount); + + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); + if (sender == contract_owner){ + + sender = deployer; + } + emit Transfer(sender, recipient, amount); + } +``` + +Es gibt zwei potenzielle Warnsignale in dieser Funktion. + +- Die Verwendung des [Funktionsmodifikators](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `_mod_`. Wenn wir uns jedoch den Quellcode ansehen, sehen wir, dass `_mod_` tatsächlich harmlos ist. + + ```solidity + modifier _mod_(address sender, address recipient, uint256 amount){ + _; + } + ``` + +- Das gleiche Problem, das wir bei `_transfer` gesehen haben: Wenn `contract_owner` Tokens sendet, scheinen sie von `deployer` zu kommen. + +### Die gefälschte Ereignisfunktion `dropNewTokens` {#the-fake-events-function-dropNewTokens} + +Jetzt kommen wir zu etwas, das wie ein tatsächlicher Betrug aussieht. Ich habe die Funktion zur besseren Lesbarkeit etwas bearbeitet, aber sie ist funktional gleichwertig. + +```solidity +function dropNewTokens(address uPool, + address[] memory eReceiver, + uint256[] memory eAmounts) public auth() +``` + +Diese Funktion hat den `auth()`-Modifikator, was bedeutet, dass sie nur vom Vertragsinhaber aufgerufen werden kann. + +```solidity +modifier auth() { + require(msg.sender == contract_owner, "Not allowed to interact"); + _; +} +``` + +Diese Einschränkung ist vollkommen sinnvoll, da wir nicht wollen würden, dass zufällige Konten Tokens verteilen. Der Rest der Funktion ist jedoch verdächtig. + +```solidity +{ + for (uint256 i = 0; i < eReceiver.length; i++) { + emit Transfer(uPool, eReceiver[i], eAmounts[i]); + } +} +``` + +Eine Funktion zum Übertragen von einem Pool-Konto an ein Array von Empfängern mit einem Array von Beträgen ist vollkommen sinnvoll. Es gibt viele Anwendungsfälle, in denen Sie Tokens von einer einzigen Quelle an mehrere Ziele verteilen möchten, wie z. B. Gehaltsabrechnungen, Airdrops usw. Es ist günstiger (in Gas), dies in einer einzigen Transaktion zu tun, anstatt mehrere Transaktionen auszugeben oder sogar den ERC-20-Vertrag mehrmals von einem anderen Vertrag als Teil derselben Transaktion aufzurufen. + +`dropNewTokens` tut das jedoch nicht. Es gibt [`Transfer`-Ereignisse](https://eips.ethereum.org/EIPS/eip-20#transfer-1) aus, aber es werden keine Tokens tatsächlich übertragen. Es gibt keinen legitimen Grund, Off-Chain-Anwendungen zu verwirren, indem man ihnen von einer Übertragung berichtet, die nicht wirklich stattgefunden hat. + +### Die „brennende“ `Approve`-Funktion {#the-burning-approve-function} + +ERC-20-Verträge sollen eine [`approve`-Funktion](/developers/tutorials/erc20-annotated-code/#approve) für Freigaben haben, und tatsächlich hat unser Betrugs-Token eine solche Funktion, und sie ist sogar korrekt. Da Solidity jedoch von C abstammt, ist die Groß- und Kleinschreibung von Bedeutung. `Approve` und `approve` sind unterschiedliche Zeichenketten. + +Außerdem steht die Funktionalität nicht im Zusammenhang mit `approve`. + +```solidity + function Approve( + address[] memory holders) +``` + +Diese Funktion wird mit einem Array von Adressen für Inhaber des Tokens aufgerufen. + +```solidity + public approver() { +``` + +Der `approver()`-Modifikator stellt sicher, dass nur `contract_owner` diese Funktion aufrufen darf (siehe unten). + +```solidity + for (uint256 i = 0; i < holders.length; i++) { + uint256 amount = _balances[holders[i]]; + _beforeTokenTransfer(holders[i], 0x0000000000000000000000000000000000000001, amount); + _balances[holders[i]] = _balances[holders[i]].sub(amount, + "ERC20: burn amount exceeds balance"); + _balances[0x0000000000000000000000000000000000000001] = + _balances[0x0000000000000000000000000000000000000001].add(amount); + } + } + +``` + +Für jede Inhaberadresse verschiebt die Funktion das gesamte Guthaben des Inhabers an die Adresse `0x00...01` und „verbrennt“ es damit effektiv (der eigentliche `burn`-Vorgang im Standard ändert auch die Gesamtversorgung und überträgt die Tokens an `0x00...00`). Das bedeutet, dass `contract_owner` die Vermögenswerte jedes Benutzers entfernen kann. Das scheint keine Funktion zu sein, die man in einem Governance-Token haben möchte. + +### Probleme mit der Codequalität {#code-quality-issues} + +Diese Probleme mit der Codequalität _beweisen_ nicht, dass dieser Code ein Betrug ist, aber sie lassen ihn verdächtig erscheinen. Organisierte Unternehmen wie Arbitrum veröffentlichen normalerweise keinen so schlechten Code. + +#### Die `mount`-Funktion {#the-mount-function} + +Obwohl es nicht im [Standard](https://eips.ethereum.org/EIPS/eip-20) spezifiziert ist, wird die Funktion, die neue Tokens erstellt, allgemein [`mint`](https://ethereum.org/el/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn) genannt. + +Wenn wir uns den `wARB`-Konstruktor ansehen, sehen wir, dass die Mint-Funktion aus irgendeinem Grund in `mount` umbenannt wurde und fünfmal mit einem Fünftel der anfänglichen Versorgung aufgerufen wird, anstatt einmal für den gesamten Betrag aus Effizienzgründen. + +```solidity + constructor () public { + + _name = "Wrapped Arbitrum"; + _symbol = "wARB"; + _decimals = 18; + uint256 initialSupply = 1000000000000; + + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + } +``` + +Die `mount`-Funktion selbst ist ebenfalls verdächtig. + +```solidity + function mount(address account, uint256 amount) public { + require(msg.sender == contract_owner, "ERC20: mint to the zero address"); +``` + +Wenn wir uns das `require` ansehen, sehen wir, dass nur der Vertragsinhaber prägen darf. Das ist legitim. Aber die Fehlermeldung sollte _only owner is allowed to mint_ oder so etwas Ähnliches sein. Stattdessen lautet sie irrelevant _ERC20: mint to the zero address_. Der korrekte Test für das Prägen an die Nulladresse ist `require(account != address(0), "")`, was der Vertrag nie überprüft. + +```solidity + _totalSupply = _totalSupply.add(amount); + _balances[contract_owner] = _balances[contract_owner].add(amount); + emit Transfer(address(0), account, amount); + } +``` + +Es gibt zwei weitere verdächtige Fakten, die direkt mit dem Prägen zusammenhängen: + +- Es gibt einen `account`-Parameter, der vermutlich das Konto ist, das den geprägten Betrag erhalten sollte. Aber das Guthaben, das sich erhöht, ist tatsächlich das von `contract_owner`. + +- Während das erhöhte Guthaben zu `contract_owner` gehört, zeigt das ausgegebene Ereignis eine Übertragung an `account`. + +### Warum sowohl `auth` als auch `approver`? Warum das `mod`, das nichts tut? {#why-both-autho-and-approver-why-the-mod-that-does-nothing} + +Dieser Vertrag enthält drei Modifikatoren: `_mod_`, `auth` und `approver`. + +```solidity + modifier _mod_(address sender, address recipient, uint256 amount){ + _; + } +``` + +`_mod_` nimmt drei Parameter und macht nichts damit. Warum gibt es ihn? + +```solidity + modifier auth() { + require(msg.sender == contract_owner, "Not allowed to interact"); + _; + } + + modifier approver() { + require(msg.sender == contract_owner, "Not allowed to interact"); + _; + } +``` + +`auth` und `approver` machen mehr Sinn, weil sie prüfen, ob der Vertrag von `contract_owner` aufgerufen wurde. Wir würden erwarten, dass bestimmte privilegierte Aktionen, wie das Prägen, auf dieses Konto beschränkt sind. Was ist jedoch der Sinn, zwei separate Funktionen zu haben, die _genau dasselbe tun_? + +## Was können wir automatisch erkennen? {#what-can-we-detect-automatically} + +Wir können sehen, dass `wARB` ein Betrugs-Token ist, indem wir uns Etherscan ansehen. Das ist jedoch eine zentralisierte Lösung. Theoretisch könnte Etherscan unterwandert oder gehackt werden. Es ist besser, unabhängig herausfinden zu können, ob ein Token legitim ist oder nicht. + +Es gibt einige Tricks, mit denen wir einen verdächtigen ERC-20-Token identifizieren können (entweder ein Betrug oder sehr schlecht geschrieben), indem wir uns die von ihnen ausgegebenen Ereignisse ansehen. + +## Verdächtige `Approval`-Ereignisse {#suspicious-approval-events} + +[`Approval`-Ereignisse](https://eips.ethereum.org/EIPS/eip-20#approval) sollten nur auf eine direkte Anfrage hin geschehen (im Gegensatz zu [`Transfer`-Ereignissen](https://eips.ethereum.org/EIPS/eip-20#transfer-1), die als Ergebnis einer Freigabe stattfinden können). Siehe die Solidity-Dokumentation für eine detaillierte Erklärung dieses Problems und warum die Anfragen direkt sein müssen, anstatt durch einen Vertrag vermittelt zu werden. + +Das bedeutet, dass `Approval`-Ereignisse, die Ausgaben von einem [externen Konto](/developers/docs/accounts/#types-of-account) genehmigen, von Transaktionen stammen müssen, die in diesem Konto ihren Ursprung haben und deren Ziel der ERC-20-Vertrag ist. Jede andere Art der Genehmigung von einem externen Konto ist verdächtig. + +Hier ist [ein Programm, das diese Art von Ereignis identifiziert](https://github.com/qbzzt/20230915-scam-token-detection), das [viem](https://viem.sh/) und [TypeScript](https://www.typescriptlang.org/docs/), eine JavaScript-Variante mit Typsicherheit, verwendet. So führen Sie es aus: + +1. Kopieren Sie `.env.example` nach `.env`. +2. Bearbeiten Sie `.env`, um die URL zu einem Ethereum-Mainnet-Node bereitzustellen. +3. Führen Sie `pnpm install` aus, um die notwendigen Pakete zu installieren. +4. Führen Sie `pnpm susApproval` aus, um nach verdächtigen Genehmigungen zu suchen. + +Hier ist eine zeilenweise Erklärung: + +```typescript +import { + Address, + TransactionReceipt, + createPublicClient, + http, + parseAbiItem, +} from "viem" +import { mainnet } from "viem/chains" +``` + +Importieren Sie Typdefinitionen, Funktionen und die Chain-Definition aus `viem`. + +```typescript +import { config } from "dotenv" +config() +``` + +Lesen Sie `.env`, um die URL zu erhalten. + +```typescript +const client = createPublicClient({ + chain: mainnet, + transport: http(process.env.URL), +}) +``` + +Erstellen Sie einen Viem-Client. Wir müssen nur aus der Blockchain lesen, daher benötigt dieser Client keinen privaten Schlüssel. + +```typescript +const testedAddress = "0xb047c8032b99841713b8e3872f06cf32beb27b82" +const fromBlock = 16859812n +const toBlock = 16873372n +``` + +Die Adresse des verdächtigen ERC-20-Vertrags und die Blöcke, in denen wir nach Ereignissen suchen werden. Node-Anbieter beschränken typischerweise unsere Fähigkeit, Ereignisse zu lesen, da die Bandbreite teuer werden kann. Glücklicherweise wurde `wARB` für einen Zeitraum von achtzehn Stunden nicht verwendet, sodass wir nach allen Ereignissen suchen können (es waren insgesamt nur 13). + +```typescript +const approvalEvents = await client.getLogs({ + address: testedAddress, + fromBlock, + toBlock, + event: parseAbiItem( + "event Approval(address indexed _owner, address indexed _spender, uint256 _value)" + ), +}) +``` + +So fragen Sie Viem nach Ereignisinformationen. Wenn wir ihm die genaue Ereignissignatur, einschließlich Feldnamen, zur Verfügung stellen, analysiert es das Ereignis für uns. + +```typescript +const isContract = async (addr: Address): boolean => + await client.getBytecode({ address: addr }) +``` + +Unser Algorithmus ist nur auf externe Konten anwendbar. Wenn von `client.getBytecode` ein Bytecode zurückgegeben wird, bedeutet dies, dass es sich um einen Vertrag handelt und wir ihn einfach überspringen sollten. + +Wenn Sie TypeScript noch nicht verwendet haben, könnte die Funktionsdefinition etwas seltsam aussehen. Wir sagen ihm nicht nur, dass der erste (und einzige) Parameter `addr` heißt, sondern auch, dass er vom Typ `Address` ist. Ähnlich teilt der `: boolean`-Teil TypeScript mit, dass der Rückgabewert der Funktion ein boolescher Wert ist. + +```typescript +const getEventTxn = async (ev: Event): TransactionReceipt => + await client.getTransactionReceipt({ hash: ev.transactionHash }) +``` + +Diese Funktion ruft den Transaktionsbeleg aus einem Ereignis ab. Wir benötigen den Beleg, um sicherzustellen, dass wir das Transaktionsziel kennen. + +```typescript +const suspiciousApprovalEvent = async (ev : Event) : (Event | null) => { +``` + +Dies ist die wichtigste Funktion, die tatsächlich entscheidet, ob ein Ereignis verdächtig ist oder nicht. Der Rückgabetyp `(Event | null)` teilt TypeScript mit, dass diese Funktion entweder ein `Event` oder `null` zurückgeben kann. Wir geben `null` zurück, wenn das Ereignis nicht verdächtig ist. + +```typescript +const owner = ev.args._owner +``` + +Viem kennt die Feldnamen, also hat es das Ereignis für uns analysiert. `_owner` ist der Eigentümer der auszugebenden Tokens. + +```typescript +// Genehmigungen durch Verträge sind nicht verdächtig +if (await isContract(owner)) return null +``` + +Wenn der Eigentümer ein Vertrag ist, gehen Sie davon aus, dass diese Genehmigung nicht verdächtig ist. Um zu überprüfen, ob die Genehmigung eines Vertrags verdächtig ist oder nicht, müssen wir die vollständige Ausführung der Transaktion verfolgen, um zu sehen, ob sie jemals zum Eigentümervertrag gelangt ist und ob dieser Vertrag den ERC-20-Vertrag direkt aufgerufen hat. Das ist viel ressourcenintensiver, als wir es gerne hätten. + +```typescript +const txn = await getEventTxn(ev) +``` + +Wenn die Genehmigung von einem externen Konto kommt, holen Sie sich die Transaktion, die sie verursacht hat. + +```typescript +// Die Genehmigung ist verdächtig, wenn sie von einem EOA-Besitzer stammt, der nicht das `from` der Transaktion ist +if (owner.toLowerCase() != txn.from.toLowerCase()) return ev +``` + +Wir können nicht einfach auf Zeichenketten-Gleichheit prüfen, da Adressen hexadezimal sind und daher Buchstaben enthalten. Manchmal, zum Beispiel in `txn.from`, sind diese Buchstaben alle in Kleinbuchstaben. In anderen Fällen, wie bei `ev.args._owner`, ist die Adresse in [gemischter Groß- und Kleinschreibung zur Fehlererkennung](https://eips.ethereum.org/EIPS/eip-55). + +Aber wenn die Transaktion nicht vom Eigentümer stammt und dieser Eigentümer ein externes Konto ist, dann haben wir eine verdächtige Transaktion. + +```typescript +// Es ist auch verdächtig, wenn das Transaktionsziel nicht der ERC-20-Vertrag ist, den wir +// untersuchen +if (txn.to.toLowerCase() != testedAddress) return ev +``` + +Ähnlich verhält es sich, wenn die `to`-Adresse der Transaktion, also der erste aufgerufene Vertrag, nicht der zu untersuchende ERC-20-Vertrag ist, dann ist dies verdächtig. + +```typescript + // Wenn es keinen Grund gibt, misstrauisch zu sein, gib null zurück. + return null +} +``` + +Wenn keine der beiden Bedingungen zutrifft, ist das `Approval`-Ereignis nicht verdächtig. + +```typescript +const testPromises = approvalEvents.map((ev) => suspiciousApprovalEvent(ev)) +const testResults = (await Promise.all(testPromises)).filter((x) => x != null) + +console.log(testResults) +``` + +[Eine `async`-Funktion](https://www.w3schools.com/js/js_async.asp) gibt ein `Promise`-Objekt zurück. Mit der gängigen Syntax `await x()` warten wir darauf, dass dieses `Promise` erfüllt wird, bevor wir mit der Verarbeitung fortfahren. Dies ist einfach zu programmieren und zu verfolgen, aber es ist auch ineffizient. Während wir darauf warten, dass das `Promise` für ein bestimmtes Ereignis erfüllt wird, können wir bereits mit dem nächsten Ereignis beginnen. + +Hier verwenden wir [`map`](https://www.w3schools.com/jsref/jsref_map.asp), um ein Array von `Promise`-Objekten zu erstellen. Dann verwenden wir [`Promise.all`](https://www.javascripttutorial.net/es6/javascript-promise-all/), um darauf zu warten, dass alle diese Promises aufgelöst werden. Wir filtern dann diese Ergebnisse mit [`filter`](https://www.w3schools.com/jsref/jsref_filter.asp), um die nicht verdächtigen Ereignisse zu entfernen. + +### Verdächtige `Transfer`-Ereignisse {#suspicious-transfer-events} + +Eine weitere Möglichkeit, Betrugs-Tokens zu identifizieren, besteht darin, zu prüfen, ob sie verdächtige Übertragungen aufweisen. Zum Beispiel Übertragungen von Konten, die nicht so viele Tokens haben. Sie können sehen, [wie dieser Test implementiert wird](https://github.com/qbzzt/20230915-scam-token-detection/blob/main/susTransfer.ts), aber `wARB` hat dieses Problem nicht. + +## Fazit {#conclusion} + +Die automatisierte Erkennung von ERC-20-Betrugsfällen leidet unter [falsch-negativen Ergebnissen](https://en.wikipedia.org/wiki/False_positives_and_false_negatives#False_negative_error), da ein Betrug einen vollkommen normalen ERC-20-Token-Vertrag verwenden kann, der einfach nichts Reales darstellt. Sie sollten also immer versuchen, _die Token-Adresse aus einer vertrauenswürdigen Quelle zu beziehen_. + +Die automatisierte Erkennung kann in bestimmten Fällen helfen, wie z.B. bei DeFi-Komponenten, wo es viele Tokens gibt und diese automatisch gehandhabt werden müssen. Aber wie immer gilt [caveat emptor](https://www.investopedia.com/terms/c/caveatemptor.asp), führen Sie Ihre eigenen Recherchen durch und ermutigen Sie Ihre Benutzer, es Ihnen gleichzutun. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). diff --git a/public/content/translations/de/developers/tutorials/secret-state/index.md b/public/content/translations/de/developers/tutorials/secret-state/index.md new file mode 100644 index 00000000000..be7d522918b --- /dev/null +++ b/public/content/translations/de/developers/tutorials/secret-state/index.md @@ -0,0 +1,741 @@ +--- +title: Verwendung von Zero-Knowledge für einen geheimen Zustand +description: Onchain-Spiele sind begrenzt, da sie keine versteckten Informationen enthalten können. Nach der Lektüre dieses Tutorials ist der Leser in der Lage, Zero-Knowledge-Beweise und Serverkomponenten zu kombinieren, um verifizierbare Spiele mit einer geheimen Offchain-Zustandskomponente zu erstellen. Die Technik dafür wird durch die Erstellung eines Minesweeper-Spiels demonstriert. +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +tags: + [ + "Server", + "Off-Chain", + "zentralisiert", + "Zero-Knowledge", + "zokrates", + "mud" + ] +skill: advanced +lang: de +published: 2025-03-15 +--- + +_Es gibt keine Geheimnisse in der Blockchain_. Alles, was auf der Blockchain gepostet wird, ist für jeden lesbar. Dies ist notwendig, da die Blockchain darauf basiert, dass jeder sie verifizieren kann. Spiele sind jedoch oft auf einen geheimen Zustand angewiesen. Zum Beispiel ergibt das Spiel [Minesweeper](https://en.wikipedia.org/wiki/Minesweeper_\(video_game\)) absolut keinen Sinn, wenn man einfach in einen Blockchain-Explorer gehen und die Karte sehen kann. + +Die einfachste Lösung ist die Verwendung einer [Serverkomponente](/developers/tutorials/server-components/), um den geheimen Zustand zu speichern. Der Grund, warum wir die Blockchain verwenden, ist jedoch, Betrug durch den Spieleentwickler zu verhindern. Wir müssen die Ehrlichkeit der Serverkomponente sicherstellen. Der Server kann einen Hash des Zustands bereitstellen und [Zero-Knowledge-Beweise](/zero-knowledge-proofs/#why-zero-knowledge-proofs-are-important) verwenden, um zu beweisen, dass der zur Berechnung des Ergebnisses eines Zuges verwendete Zustand der richtige ist. + +Nach der Lektüre dieses Artikels wissen Sie, wie Sie diese Art von Server, der einen geheimen Zustand hält, einen Client zur Anzeige des Zustands und eine Onchain-Komponente für die Kommunikation zwischen den beiden erstellen. Die Hauptwerkzeuge, die wir verwenden werden, sind: + +| Werkzeug | Zweck | Auf Version verifiziert | +| --------------------------------------------- | --------------------------------------------- | --------------------------------------: | +| [Zokrates](https://zokrates.github.io/) | Zero-Knowledge-Beweise und ihre Verifizierung | 1.1.9 | +| [Typescript](https://www.typescriptlang.org/) | Programmiersprache für Server und Client | 5.4.2 | +| [Node](https://nodejs.org/en) | Ausführen des Servers | 20.18.2 | +| [Viem](https://viem.sh/) | Kommunikation mit der Blockchain | 2.9.20 | +| [MUD](https://mud.dev/) | Onchain-Datenverwaltung | 2.0.12 | +| [React](https://react.dev/) | Client-Benutzeroberfläche | 18.2.0 | +| [Vite](https://vitejs.dev/) | Bereitstellen des Client-Codes | 4.2.1 | + +## Minesweeper-Beispiel {#minesweeper} + +[Minesweeper](https://en.wikipedia.org/wiki/Minesweeper_\(video_game\)) ist ein Spiel, das eine geheime Karte mit einem Minenfeld enthält. Der Spieler entscheidet sich, an einer bestimmten Stelle zu graben. Wenn sich an dieser Stelle eine Mine befindet, ist das Spiel vorbei. Andernfalls erhält der Spieler die Anzahl der Minen in den acht Feldern, die diesen Ort umgeben. + +Diese Anwendung wurde mit [MUD](https://mud.dev/) geschrieben, einem Framework, mit dem wir Daten onchain in einer [Schlüssel-Wert-Datenbank](https://aws.amazon.com/nosql/key-value/) speichern und diese Daten automatisch mit Offchain-Komponenten synchronisieren können. Zusätzlich zur Synchronisation erleichtert MUD die Bereitstellung von Zugriffskontrollen und ermöglicht es anderen Benutzern, unsere Anwendung [zu erweitern](https://mud.dev/guides/extending-a-world), ohne dass eine Berechtigung erforderlich ist. + +### Ausführen des Minesweeper-Beispiels {#running-minesweeper-example} + +So führen Sie das Minesweeper-Beispiel aus: + +1. Stellen Sie sicher, dass Sie [die Voraussetzungen installiert haben](https://mud.dev/quickstart#prerequisites): [Node](https://mud.dev/quickstart#prerequisites), [Foundry](https://book.getfoundry.sh/getting-started/installation), [`git`](https://git-scm.com/downloads), [`pnpm`](https://git-scm.com/downloads) und [`mprocs`](https://github.com/pvolok/mprocs). + +2. Klonen Sie das Repository. + + ```sh copy + git clone https://github.com/qbzzt/20240901-secret-state.git + ``` + +3. Installieren Sie die Pakete. + + ```sh copy + cd 20240901-secret-state/ + pnpm install + npm install -g mprocs + ``` + + Wenn Foundry als Teil von `pnpm install` installiert wurde, müssen Sie die Kommandozeilen-Shell neu starten. + +4. Kompilieren Sie die Verträge + + ```sh copy + cd packages/contracts + forge build + cd ../.. + ``` + +5. Starten Sie das Programm (einschließlich einer [Anvil](https://book.getfoundry.sh/anvil/) Blockchain) und warten Sie. + + ```sh copy + mprocs + ``` + + Beachten Sie, dass der Start lange dauert. Um den Fortschritt zu sehen, verwenden Sie zuerst die Pfeiltaste nach unten, um zum Tab _contracts_ zu scrollen, um zu sehen, wie die MUD-Verträge bereitgestellt werden. Wenn Sie die Meldung _Waiting for file changes…_ erhalten, sind die Verträge bereitgestellt und der weitere Fortschritt findet auf der Registerkarte _server_ statt. Dort warten Sie, bis Sie die Nachricht _Verifier address: 0x..._ erhalten. + + Wenn dieser Schritt erfolgreich ist, sehen Sie den `mprocs`-Bildschirm mit den verschiedenen Prozessen auf der linken und der Konsolenausgabe für den aktuell ausgewählten Prozess auf der rechten Seite. + + ![Der mprocs-Bildschirm](./mprocs.png) + + Wenn es ein Problem mit `mprocs` gibt, können Sie die vier Prozesse manuell ausführen, jeder in seinem eigenen Kommandozeilenfenster: + + - **Anvil** + + ```sh + cd packages/contracts + anvil --base-fee 0 --block-time 2 + ``` + + - **Verträge** + + ```sh + cd packages/contracts + pnpm mud dev-contracts --rpc http://127.0.0.1:8545 + ``` + + - **Server** + + ```sh + cd packages/server + pnpm start + ``` + + - **Client** + + ```sh + cd packages/client + pnpm run dev + ``` + +6. Jetzt können Sie zum [Client](http://localhost:3000) navigieren, auf **New Game** klicken und mit dem Spielen beginnen. + +### Tabellen {#tables} + +Wir benötigen [mehrere Tabellen](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts) onchain. + +- `Configuration`: Diese Tabelle ist ein Singleton, sie hat keinen Schlüssel und einen einzigen Datensatz. Sie wird verwendet, um Informationen zur Spielkonfiguration zu speichern: + - `height`: Die Höhe eines Minenfeldes + - `width`: Die Breite eines Minenfeldes + - `numberOfBombs`: Die Anzahl der Bomben in jedem Minenfeld + +- `VerifierAddress`: Diese Tabelle ist ebenfalls ein Singleton. Es wird verwendet, um einen Teil der Konfiguration zu halten, die Adresse des Verifizierervertrags (`verifier`). Wir hätten diese Information in die `Configuration`-Tabelle aufnehmen können, aber sie wird von einer anderen Komponente, dem Server, gesetzt, daher ist es einfacher, sie in eine separate Tabelle zu packen. + +- `PlayerGame`: Der Schlüssel ist die Adresse des Spielers. Die Daten sind: + + - `gameId`: 32-Byte-Wert, der der Hash der Karte ist, auf der der Spieler spielt (der Spiel-Identifikator). + - `win`: ein boolescher Wert, der angibt, ob der Spieler das Spiel gewonnen hat. + - `lose`: ein boolescher Wert, der angibt, ob der Spieler das Spiel verloren hat. + - `digNumber`: die Anzahl der erfolgreichen Grabungen im Spiel. + +- `GamePlayer`: Diese Tabelle enthält die umgekehrte Zuordnung von `gameId` zur Spieleradresse. + +- `Map`: Der Schlüssel ist ein Tupel aus drei Werten: + + - `gameId`: 32-Byte-Wert, der der Hash der Karte ist, auf der der Spieler spielt (der Spiel-Identifikator). + - `x`-Koordinate + - `y`-Koordinate + + Der Wert ist eine einzelne Zahl. Es ist 255, wenn eine Bombe entdeckt wurde. Andernfalls ist es die Anzahl der Bomben um diesen Ort herum plus eins. Wir können nicht einfach die Anzahl der Bomben verwenden, da standardmäßig der gesamte Speicher in der EVM und alle Zeilenwerte in MUD null sind. Wir müssen zwischen „der Spieler hat hier noch nicht gegraben“ und „der Spieler hat hier gegraben und festgestellt, dass es keine Bomben in der Nähe gibt“ unterscheiden. + +Zusätzlich findet die Kommunikation zwischen Client und Server über die Onchain-Komponente statt. Dies wird ebenfalls mithilfe von Tabellen implementiert. + +- `PendingGame`: Nicht bearbeitete Anfragen zum Starten eines neuen Spiels. +- `PendingDig`: Nicht bearbeitete Anfragen, an einem bestimmten Ort in einem bestimmten Spiel zu graben. Dies ist eine [Offchain-Tabelle](https://mud.dev/store/tables#types-of-tables), was bedeutet, dass sie nicht in den EVM-Speicher geschrieben wird, sondern nur offchain über Ereignisse lesbar ist. + +### Ausführungs- und Datenflüsse {#execution-data-flows} + +Diese Flüsse koordinieren die Ausführung zwischen dem Client, der Onchain-Komponente und dem Server. + +#### Initialisierung {#initialization-flow} + +Wenn Sie `mprocs` ausführen, geschehen diese Schritte: + +1. [`mprocs`](https://github.com/pvolok/mprocs) führt vier Komponenten aus: + + - [Anvil](https://book.getfoundry.sh/anvil/), das eine lokale Blockchain ausführt + - [Contracts](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/contracts), das die Verträge für MUD kompiliert (falls erforderlich) und bereitstellt + - [Client](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/client), das [Vite](https://vitejs.dev/) ausführt, um die Benutzeroberfläche und den Client-Code für Webbrowser bereitzustellen. + - [Server](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/server), der die Serveraktionen ausführt + +2. Das `contracts`-Paket stellt die MUD-Verträge bereit und führt dann [das `PostDeploy.s.sol`-Skript](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol) aus. Dieses Skript legt die Konfiguration fest. Der Code von GitHub spezifiziert [ein 10x5 Minenfeld mit acht Minen darin](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol#L23). + +3. [Der Server](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts) beginnt mit der [Einrichtung von MUD](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L6). Dies aktiviert unter anderem die Datensynchronisation, sodass eine Kopie der relevanten Tabellen im Speicher des Servers vorhanden ist. + +4. Der Server abonniert eine Funktion, die ausgeführt wird, [wenn sich die `Configuration`-Tabelle ändert](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L23). [Diese Funktion](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L24-L168) wird aufgerufen, nachdem `PostDeploy.s.sol` ausgeführt und die Tabelle geändert wurde. + +5. Wenn die Server-Initialisierungsfunktion die Konfiguration hat, [ruft sie `zkFunctions` auf](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L34-L35), um [den Zero-Knowledge-Teil des Servers zu initialisieren](#using-zokrates-from-typescript). Dies kann erst geschehen, wenn wir die Konfiguration erhalten, da die Zero-Knowledge-Funktionen die Breite und Höhe des Minenfeldes als Konstanten haben müssen. + +6. Nachdem der Zero-Knowledge-Teil des Servers initialisiert ist, ist der nächste Schritt, [den Zero-Knowledge-Verifizierungsvertrag auf der Blockchain bereitzustellen](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L42-L53) und die Verifizierungsadresse in MUD festzulegen. + +7. Schließlich abonnieren wir Aktualisierungen, damit wir sehen, wenn ein Spieler entweder [ein neues Spiel starten](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71) oder [in einem bestehenden Spiel graben](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73-L108) möchte. + +#### Neues Spiel {#new-game-flow} + +Dies geschieht, wenn der Spieler ein neues Spiel anfordert. + +1. Wenn für diesen Spieler kein Spiel im Gange ist, oder es eines gibt, aber mit einer gameId von Null, zeigt der Client eine [Schaltfläche für ein neues Spiel](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175) an. Wenn der Benutzer diese Schaltfläche drückt, [führt React die Funktion `newGame` aus](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L96). + +2. [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L43-L46) ist ein `System`-Aufruf. In MUD werden alle Aufrufe über den `World`-Vertrag geleitet, und in den meisten Fällen rufen Sie `__` auf. In diesem Fall ist der Aufruf an `app__newGame`, den MUD dann an [`newGame` in `GameSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L16-L22) weiterleitet. + +3. Die Onchain-Funktion prüft, ob der Spieler kein Spiel im Gange hat, und wenn nicht, [fügt sie die Anfrage zur `PendingGame`-Tabelle hinzu](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L21). + +4. Der Server erkennt die Änderung in `PendingGame` und [führt die abonnierte Funktion aus](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71). Diese Funktion ruft [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L110-L114) auf, das wiederum [`createGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L116-L144) aufruft. + +5. Das Erste, was `createGame` tut, ist [eine zufällige Karte mit der entsprechenden Anzahl von Minen zu erstellen](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L120-L135). Dann ruft es [`makeMapBorders`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L147-L166) auf, um eine Karte mit leeren Rändern zu erstellen, was für Zokrates notwendig ist. Schließlich ruft `createGame` [`calculateMapHash`](#calculateMapHash) auf, um den Hash der Karte zu erhalten, der als Spiel-ID verwendet wird. + +6. Die Funktion `newGame` fügt das neue Spiel zu `gamesInProgress` hinzu. + +7. Das Letzte, was der Server tut, ist [`app__newGameResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L38-L43) aufzurufen, was onchain geschieht. Diese Funktion befindet sich in einem anderen `System`, [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol), um die Zugriffskontrolle zu ermöglichen. Die Zugriffskontrolle ist in der [MUD-Konfigurationsdatei](https://mud.dev/config), [`mud.config.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts#L67-L72) definiert. + + Die Zugriffsliste erlaubt nur einer einzigen Adresse, das `System` aufzurufen. Dies beschränkt den Zugriff auf die Serverfunktionen auf eine einzige Adresse, sodass niemand den Server imitieren kann. + +8. Die Onchain-Komponente aktualisiert die relevanten Tabellen: + + - Erstellen Sie das Spiel in `PlayerGame`. + - Setzen Sie die umgekehrte Zuordnung in `GamePlayer`. + - Entfernen Sie die Anfrage aus `PendingGame`. + +9. Der Server identifiziert die Änderung in `PendingGame`, unternimmt aber nichts, da [`wantsGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L58-L60) falsch ist. + +10. Auf dem Client wird [`gameRecord`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L143-L148) auf den `PlayerGame`-Eintrag für die Adresse des Spielers gesetzt. Wenn sich `PlayerGame` ändert, ändert sich auch `gameRecord`. + +11. Wenn ein Wert in `gameRecord` vorhanden ist und das Spiel weder gewonnen noch verloren wurde, [zeigt der Client die Karte an](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190). + +#### Graben {#dig-flow} + +1. Der Spieler [klickt auf die Schaltfläche der Kartenzelle](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L188), wodurch [die Funktion `dig` aufgerufen wird](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L33-L36). Diese Funktion ruft [`dig` onchain auf](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L24-L32). + +2. Die Onchain-Komponente [führt eine Reihe von Plausibilitätsprüfungen durch](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L25-L30) und fügt bei Erfolg die Grabanforderung zu [`PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L31) hinzu. + +3. Der Server [erkennt die Änderung in `PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73). [Wenn sie gültig ist](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L75-L84), ruft sie [den Zero-Knowledge-Code](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L86-L95) auf (unten erklärt), um sowohl das Ergebnis als auch einen Beweis für dessen Gültigkeit zu generieren. + +4. [Der Server](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L97-L107) ruft [`digResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L45-L64) onchain auf. + +5. `digResponse` tut zwei Dinge. Zuerst prüft es [den Zero-Knowledge-Beweis](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L47-L61). Wenn der Beweis dann standhält, ruft es [`processDigResult`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L67-L86) auf, um das Ergebnis tatsächlich zu verarbeiten. + +6. `processDigResult` prüft, ob das Spiel [verloren](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L76-L78) oder [gewonnen](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L83-L86) wurde, und [aktualisiert `Map`, die Onchain-Karte](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L80). + +7. Der Client übernimmt die Aktualisierungen automatisch und [aktualisiert die dem Spieler angezeigte Karte](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190) und teilt dem Spieler gegebenenfalls mit, ob es ein Sieg oder eine Niederlage ist. + +## Verwendung von Zokrates {#using-zokrates} + +In den oben erklärten Abläufen haben wir die Zero-Knowledge-Teile übersprungen und sie als Blackbox behandelt. Jetzt wollen wir sie aufbrechen und sehen, wie dieser Code geschrieben ist. + +### Hashing der Karte {#hashing-map} + +Wir können [diesen JavaScript-Code](https://github.com/ZK-Plus/ICBC24_Tutorial_Compute-Offchain-Verify-onchain/tree/solutions/exercise) verwenden, um [Poseidon](https://www.poseidon-hash.info), die von uns verwendete Zokrates-Hash-Funktion, zu implementieren. Obwohl dies schneller wäre, wäre es auch komplizierter, als einfach die Zokrates-Hash-Funktion dafür zu verwenden. Dies ist ein Tutorial, daher ist der Code auf Einfachheit und nicht auf Leistung optimiert. Daher benötigen wir zwei verschiedene Zokrates-Programme: eines, das nur den Hash einer Karte (`hash`) berechnet, und eines, das tatsächlich einen Zero-Knowledge-Beweis für das Ergebnis des Grabens an einem Ort auf der Karte (`dig`) erstellt. + +### Die Hash-Funktion {#hash-function} + +Dies ist die Funktion, die den Hash einer Karte berechnet. Wir werden diesen Code Zeile für Zeile durchgehen. + +``` +import "hashes/poseidon/poseidon.zok" as poseidon; +import "utils/pack/bool/pack128.zok" as pack128; +``` + +Diese beiden Zeilen importieren zwei Funktionen aus der [Zokrates-Standardbibliothek](https://zokrates.github.io/toolbox/stdlib.html). [Die erste Funktion](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/hashes/poseidon/poseidon.zok) ist ein [Poseidon-Hash](https://www.poseidon-hash.info/). Es nimmt ein Array von [`field`-Elementen](https://zokrates.github.io/language/types.html#field) und gibt ein `field` zurück. + +Das Feldelement in Zokrates ist typischerweise kürzer als 256 Bit, aber nicht viel. Um den Code zu vereinfachen, beschränken wir die Karte auf bis zu 512 Bit und hashen ein Array von vier Feldern, und in jedem Feld verwenden wir nur 128 Bit. [Die Funktion `pack128`](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/utils/pack/bool/pack128.zok) wandelt zu diesem Zweck ein Array von 128 Bits in ein `field` um. + +``` + def hashMap(bool[${width+2}][${height+2}] map) -> field { +``` + +Diese Zeile beginnt eine Funktionsdefinition. `hashMap` erhält einen einzigen Parameter namens `map`, ein zweidimensionales `bool`(esches) Array. Die Größe der Karte ist `width+2` mal `height+2` aus Gründen, die [unten erklärt werden](#why-map-border). + +Wir können `${width+2}` und `${height+2}` verwenden, da die Zokrates-Programme in dieser Anwendung als [Template-Strings](https://www.w3schools.com/js/js_string_templates.asp) gespeichert sind. Code zwischen `${` und `}` wird von JavaScript ausgewertet, und auf diese Weise kann das Programm für verschiedene Kartengrößen verwendet werden. Der Kartenparameter hat einen einen Ort breiten Rand ringsum ohne Bomben, weshalb wir zwei zur Breite und Höhe hinzufügen müssen. + +Der Rückgabewert ist ein `field`, das den Hash enthält. + +``` + bool[512] mut map1d = [false; 512]; +``` + +Die Karte ist zweidimensional. Die Funktion `pack128` funktioniert jedoch nicht mit zweidimensionalen Arrays. Also flachen wir die Karte zuerst in ein 512-Byte-Array ab, indem wir `map1d` verwenden. Standardmäßig sind Zokrates-Variablen Konstanten, aber wir müssen diesem Array in einer Schleife Werte zuweisen, also definieren wir es als [`mut`](https://zokrates.github.io/language/variables.html#mutability). + +Wir müssen das Array initialisieren, da Zokrates kein `undefined` kennt. Der Ausdruck `[false; 512]` bedeutet [ein Array von 512 `false`-Werten](https://zokrates.github.io/language/types.html#declaration-and-initialization). + +``` + u32 mut counter = 0; +``` + +Wir benötigen auch einen Zähler, um zwischen den Bits, die wir bereits in `map1d` gefüllt haben, und denen, die wir nicht gefüllt haben, zu unterscheiden. + +``` + for u32 x in 0..${width+2} { +``` + +So deklarieren Sie eine [`for`-Schleife](https://zokrates.github.io/language/control_flow.html#for-loops) in Zokrates. Eine Zokrates-`for`-Schleife muss feste Grenzen haben, denn obwohl sie wie eine Schleife aussieht, „entrollt“ der Compiler sie tatsächlich. Der Ausdruck `${width+2}` ist eine Kompilierzeitkonstante, da `width` vom TypeScript-Code gesetzt wird, bevor er den Compiler aufruft. + +``` + for u32 y in 0..${height+2} { + map1d[counter] = map[x][y]; + counter = counter+1; + } + } +``` + +Für jeden Ort auf der Karte, fügen Sie diesen Wert in das `map1d`-Array ein und erhöhen Sie den Zähler. + +``` + field[4] hashMe = [ + pack128(map1d[0..128]), + pack128(map1d[128..256]), + pack128(map1d[256..384]), + pack128(map1d[384..512]) + ]; +``` + +Das `pack128`, um ein Array von vier `field`-Werten aus `map1d` zu erstellen. In Zokrates bedeutet `array[a..b]` den Ausschnitt des Arrays, der bei `a` beginnt und bei `b-1` endet. + +``` + return poseidon(hashMe); +} +``` + +Verwenden Sie `poseidon`, um dieses Array in einen Hash umzuwandeln. + +### Das Hash-Programm {#hash-program} + +Der Server muss `hashMap` direkt aufrufen, um Spiel-Identifikatoren zu erstellen. Zokrates kann jedoch nur die `main`-Funktion eines Programms zum Starten aufrufen, daher erstellen wir ein Programm mit einer `main`-Funktion, die die Hash-Funktion aufruft. + +``` +${hashFragment} + +def main(bool[${width+2}][${height+2}] map) -> field { + return hashMap(map); +} +``` + +### Das Grabungsprogramm {#dig-program} + +Dies ist das Herzstück des Zero-Knowledge-Teils der Anwendung, wo wir die Beweise produzieren, die zur Verifizierung von Grabungsergebnissen verwendet werden. + +``` +${hashFragment} + +// Die Anzahl der Minen am Ort (x,y) +def map2mineCount(bool[${width+2}][${height+2}] map, u32 x, u32 y) -> u8 { + return if map[x+1][y+1] { 1 } else { 0 }; +} +``` + +#### Warum ein Kartenrand {#why-map-border} + +Zero-Knowledge-Beweise verwenden [arithmetische Schaltungen](https://medium.com/web3studio/simple-explanations-of-arithmetic-circuits-and-zero-knowledge-proofs-806e59a79785), die keine einfache Entsprechung zu einer `if`-Anweisung haben. Stattdessen verwenden sie das Äquivalent des [bedingten Operators](https://en.wikipedia.org/wiki/Ternary_conditional_operator). Wenn `a` entweder null oder eins sein kann, können Sie `if a { b } else { c }` als `ab+(1-a)c` berechnen. + +Deshalb wertet eine Zokrates-`if`-Anweisung immer beide Zweige aus. Wenn Sie zum Beispiel diesen Code haben: + +``` +bool[5] arr = [false; 5]; +u32 index=10; +return if index>4 { 0 } else { arr[index] } +``` + +Es wird einen Fehler geben, weil es `arr[10]` berechnen muss, obwohl dieser Wert später mit Null multipliziert wird. + +Dies ist der Grund, warum wir einen einen Ort breiten Rand rund um die Karte benötigen. Wir müssen die Gesamtzahl der Minen um einen Ort herum berechnen, und das bedeutet, wir müssen den Ort eine Reihe darüber und darunter, links und rechts von dem Ort, an dem wir graben, sehen. Das bedeutet, dass diese Orte in dem Karten-Array existieren müssen, das Zokrates zur Verfügung gestellt wird. + +``` +def main(private bool[${width+2}][${height+2}] map, u32 x, u32 y) -> (field, u8) { +``` + +Standardmäßig enthalten Zokrates-Beweise ihre Eingaben. Es nützt nichts zu wissen, dass sich fünf Minen um einen Punkt befinden, es sei denn, man weiß tatsächlich, um welchen Punkt es sich handelt (und man kann ihn nicht einfach mit seiner Anfrage abgleichen, denn dann könnte der Prüfer andere Werte verwenden und es Ihnen nicht mitteilen). Wir müssen die Karte jedoch geheim halten, während wir sie Zokrates zur Verfügung stellen. Die Lösung ist die Verwendung eines `private`-Parameters, der _nicht_ durch den Beweis offengelegt wird. + +Dies eröffnet eine weitere Möglichkeit für Missbrauch. Der Prüfer könnte die richtigen Koordinaten verwenden, aber eine Karte mit einer beliebigen Anzahl von Minen um den Ort herum und möglicherweise am Ort selbst erstellen. Um diesen Missbrauch zu verhindern, lassen wir den Zero-Knowledge-Beweis den Hash der Karte enthalten, der die Spiel-ID ist. + +``` + return (hashMap(map), +``` + +Der Rückgabewert ist hier ein Tupel, das das Karten-Hash-Array sowie das Grabungsergebnis enthält. + +``` + if map2mineCount(map, x, y) > 0 { 0xFF } else { +``` + +Wir verwenden 255 als Sonderwert für den Fall, dass der Ort selbst eine Bombe enthält. + +``` + map2mineCount(map, x-1, y-1) + map2mineCount(map, x, y-1) + map2mineCount(map, x+1, y-1) + + map2mineCount(map, x-1, y) + map2mineCount(map, x+1, y) + + map2mineCount(map, x-1, y+1) + map2mineCount(map, x, y+1) + map2mineCount(map, x+1, y+1) + } + ); +} +``` + +Wenn der Spieler keine Mine getroffen hat, addieren Sie die Minenzählungen für den Bereich um den Ort herum und geben Sie das zurück. + +### Verwendung von Zokrates aus TypeScript {#using-zokrates-from-typescript} + +Zokrates hat eine Befehlszeilenschnittstelle, aber in diesem Programm verwenden wir sie im [TypeScript-Code](https://zokrates.github.io/toolbox/zokrates_js.html). + +Die Bibliothek, die die Zokrates-Definitionen enthält, heißt [`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts). + +```typescript +import { initialize as zokratesInitialize } from "zokrates-js" +``` + +Importieren Sie die [Zokrates JavaScript-Bindungen](https://zokrates.github.io/toolbox/zokrates_js.html). Wir benötigen nur die Funktion [`initialize`](https://zokrates.github.io/toolbox/zokrates_js.html#initialize), da sie ein Promise zurückgibt, das in alle Zokrates-Definitionen aufgelöst wird. + +```typescript +export const zkFunctions = async (width: number, height: number) : Promise => { +``` + +Ähnlich wie bei Zokrates selbst exportieren wir auch nur eine Funktion, die ebenfalls [asynchron](https://www.w3schools.com/js/js_async.asp) ist. Wenn sie schließlich zurückkehrt, stellt sie mehrere Funktionen zur Verfügung, wie wir unten sehen werden. + +```typescript +const zokrates = await zokratesInitialize() +``` + +Initialisieren Sie Zokrates, holen Sie sich alles, was wir aus der Bibliothek benötigen. + +```typescript +const hashFragment = ` + import "utils/pack/bool/pack128.zok" as pack128; + import "hashes/poseidon/poseidon.zok" as poseidon; + . + . + . + } + ` + +const hashProgram = ` + ${hashFragment} + . + . + . + ` + +const digProgram = ` + ${hashFragment} + . + . + . + ` +``` + +Als Nächstes haben wir die Hash-Funktion und zwei Zokrates-Programme, die wir oben gesehen haben. + +```typescript +const digCompiled = zokrates.compile(digProgram) +const hashCompiled = zokrates.compile(hashProgram) +``` + +Hier kompilieren wir diese Programme. + +```typescript +// Erstellen Sie die Schlüssel für die Zero-Knowledge-Verifizierung. +// Auf einem Produktionssystem würden Sie eine Setup-Zeremonie verwenden wollen. +// (https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony). +const keySetupResults = zokrates.setup(digCompiled.program, "") +const verifierKey = keySetupResults.vk +const proverKey = keySetupResults.pk +``` + +Auf einem Produktionssystem könnten wir eine kompliziertere [Setup-Zeremonie](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony) verwenden, aber das ist für eine Demonstration ausreichend. Es ist kein Problem, dass die Benutzer den Prover-Schlüssel kennen – sie können ihn trotzdem nicht verwenden, um Dinge zu beweisen, es sei denn, sie sind wahr. Da wir die Entropie (der zweite Parameter, `""`) angeben, werden die Ergebnisse immer die gleichen sein. + +**Hinweis:** Die Kompilierung von Zokrates-Programmen und die Schlüsselerstellung sind langsame Prozesse. Es ist nicht nötig, sie jedes Mal zu wiederholen, nur wenn sich die Kartengröße ändert. Auf einem Produktionssystem würde man sie einmal durchführen und dann die Ausgabe speichern. Der einzige Grund, warum ich es hier nicht tue, ist der Einfachheit halber. + +#### `calculateMapHash` {#calculateMapHash} + +```typescript +const calculateMapHash = function (hashMe: boolean[][]): string { + return ( + "0x" + + BigInt(zokrates.computeWitness(hashCompiled, [hashMe]).output.slice(1, -1)) + .toString(16) + .padStart(64, "0") + ) +} +``` + +Die Funktion [`computeWitness`](https://zokrates.github.io/toolbox/zokrates_js.html#computewitnessartifacts-args-options) führt das Zokrates-Programm tatsächlich aus. Sie gibt eine Struktur mit zwei Feldern zurück: `output`, die Ausgabe des Programms als JSON-String, und `witness`, die Informationen, die zur Erstellung eines Zero-Knowledge-Beweises des Ergebnisses benötigt werden. Hier benötigen wir nur die Ausgabe. + +Die Ausgabe ist ein String der Form `"31337"`, eine in Anführungszeichen eingeschlossene Dezimalzahl. Aber die Ausgabe, die wir für `viem` benötigen, ist eine hexadezimale Zahl der Form `0x60A7`. Also verwenden wir `.slice(1,-1)`, um die Anführungszeichen zu entfernen, und dann `BigInt`, um den verbleibenden String, der eine Dezimalzahl ist, in einen [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) umzuwandeln. `.toString(16)` wandelt diesen `BigInt` in einen hexadezimalen String um, und `"0x"+` fügt die Markierung für hexadezimale Zahlen hinzu. + +```typescript +// Graben und einen Zero-Knowledge-Beweis des Ergebnisses zurückgeben +// (serverseitiger Code) +``` + +Der Zero-Knowledge-Beweis enthält die öffentlichen Eingaben (`x` und `y`) und Ergebnisse (Hash der Karte und Anzahl der Bomben). + +```typescript + const zkDig = function(map: boolean[][], x: number, y: number) : any { + if (x<0 || x>=width || y<0 || y>=height) + throw new Error("Versuch, außerhalb der Karte zu graben") +``` + +Es ist ein Problem, in Zokrates zu prüfen, ob ein Index außerhalb der Grenzen liegt, also tun wir es hier. + +```typescript +const runResults = zokrates.computeWitness(digCompiled, [map, `${x}`, `${y}`]) +``` + +Führen Sie das Grabungsprogramm aus. + +```typescript + const proof = zokrates.generateProof( + digCompiled.program, + runResults.witness, + proverKey) + + return proof + } +``` + +Verwenden Sie [`generateProof`](https://zokrates.github.io/toolbox/zokrates_js.html#generateproofprogram-witness-provingkey-entropy) und geben Sie den Beweis zurück. + +```typescript +const solidityVerifier = ` + // Kartengröße: ${width} x ${height} + \n${zokrates.exportSolidityVerifier(verifierKey)} + ` +``` + +Ein Solidity-Verifizierer, ein Smart Contract, den wir auf der Blockchain bereitstellen und verwenden können, um Beweise zu verifizieren, die von `digCompiled.program` generiert wurden. + +```typescript + return { + zkDig, + calculateMapHash, + solidityVerifier, + } +} +``` + +Schließlich geben Sie alles zurück, was anderer Code benötigen könnte. + +## Sicherheitstests {#security-tests} + +Sicherheitstests sind wichtig, denn ein Funktionsfehler wird sich irgendwann von selbst zeigen. Aber wenn die Anwendung unsicher ist, bleibt das wahrscheinlich lange Zeit verborgen, bevor es von jemandem aufgedeckt wird, der betrügt und mit Ressourcen davonkommt, die anderen gehören. + +### Berechtigungen {#permissions} + +Es gibt eine privilegierte Entität in diesem Spiel, den Server. Es ist der einzige Benutzer, der berechtigt ist, die Funktionen in [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol) aufzurufen. Wir können [`cast`](https://book.getfoundry.sh/cast/) verwenden, um zu überprüfen, dass Aufrufe von berechtigten Funktionen nur mit dem Serverkonto erlaubt sind. + +[Der private Schlüssel des Servers befindet sich in `setupNetwork.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/mud/setupNetwork.ts#L52). + +1. Setzen Sie auf dem Computer, auf dem `anvil` (die Blockchain) läuft, diese Umgebungsvariablen. + + ```sh copy + WORLD_ADDRESS=0x8d8b6b8414e1e3dcfd4168561b9be6bd3bf6ec4b + UNAUTHORIZED_KEY=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a + AUTHORIZED_KEY=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d + ``` + +2. Verwenden Sie `cast`, um zu versuchen, die Verifiziereradresse als eine nicht autorisierte Adresse festzulegen. + + ```sh copy + cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $UNAUTHORIZED_KEY + ``` + + Nicht nur meldet `cast` einen Fehler, sondern Sie können auch **MUD Dev Tools** im Spiel im Browser öffnen, auf **Tables** klicken und **app\_\_VerifierAddress** auswählen. Sehen Sie, dass die Adresse nicht null ist. + +3. Setzen Sie die Verifiziereradresse als Adresse des Servers. + + ```sh copy + cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $AUTHORIZED_KEY + ``` + + Die Adresse in **app\_\_VerifiedAddress** sollte jetzt null sein. + +Alle MUD-Funktionen im selben `System` durchlaufen dieselbe Zugriffskontrolle, daher halte ich diesen Test für ausreichend. Wenn nicht, können Sie die anderen Funktionen in [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol) überprüfen. + +### Zero-Knowledge-Missbrauch {#zero-knowledge-abuses} + +Die Mathematik zur Verifizierung von Zokrates liegt außerhalb des Rahmens dieses Tutorials (und meiner Fähigkeiten). Wir können jedoch verschiedene Prüfungen am Zero-Knowledge-Code durchführen, um zu verifizieren, dass er bei fehlerhafter Ausführung fehlschlägt. All diese Tests erfordern, dass wir [`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts) ändern und die gesamte Anwendung neu starten. Es reicht nicht aus, den Serverprozess neu zu starten, da dies die Anwendung in einen unmöglichen Zustand versetzt (der Spieler hat ein Spiel im Gange, aber das Spiel ist für den Server nicht mehr verfügbar). + +#### Falsche Antwort {#wrong-answer} + +Die einfachste Möglichkeit besteht darin, im Zero-Knowledge-Beweis die falsche Antwort zu geben. Dazu gehen wir in `zkDig` und [ändern Zeile 91](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L91): + +```ts +proof.inputs[3] = "0x" + "1".padStart(64, "0") +``` + +Das bedeutet, wir werden immer behaupten, es gäbe eine Bombe, unabhängig von der richtigen Antwort. Versuchen Sie, mit dieser Version zu spielen, und Sie werden auf der Registerkarte **server** des `pnpm dev`-Bildschirms diesen Fehler sehen: + +``` + cause: { + code: 3, + message: 'execution reverted: revert: Zero knowledge verification fail', + data: '0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000 +000000000000000000000000000000000000000000000000205a65726f206b6e6f776c6564676520766572696669636174696f6 +e206661696c' + }, +``` + +Diese Art von Betrug schlägt also fehl. + +#### Falscher Beweis {#wrong-proof} + +Was passiert, wenn wir die richtigen Informationen liefern, aber nur die falschen Beweisdaten haben? Ersetzen Sie nun Zeile 91 durch: + +```ts +proof.proof = { + a: ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], + b: [ + ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], + ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], + ], + c: ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], +} +``` + +Es schlägt immer noch fehl, aber jetzt schlägt es ohne Grund fehl, weil es während des Verifizierungsaufrufs passiert. + +### Wie kann ein Benutzer den Zero-Trust-Code überprüfen? {#user-verify-zero-trust} + +Smart Contracts sind relativ einfach zu überprüfen. Typischerweise veröffentlicht der Entwickler den Quellcode in einem Block-Explorer, und der Block-Explorer verifiziert, dass der Quellcode zum Code in der [Vertragsbereitstellungstransaktion](/developers/docs/smart-contracts/deploying/) kompiliert. Im Falle von MUD-`System`en ist dies [etwas komplizierter](https://mud.dev/cli/verify), aber nicht viel. + +Mit Zero-Knowledge ist das schwieriger. Der Verifizierer enthält einige Konstanten und führt einige Berechnungen mit ihnen durch. Dies sagt Ihnen nicht, was bewiesen wird. + +```solidity + function verifyingKey() pure internal returns (VerifyingKey memory vk) { + vk.alpha = Pairing.G1Point(uint256(0x0f43f4fe7b5c2326fed4ac6ed2f4003ab9ab4ea6f667c2bdd77afb068617ee16), uint256(0x25a77832283f9726935219b5f4678842cda465631e72dbb24708a97ba5d0ce6f)); + vk.beta = Pairing.G2Point([uint256(0x2cebd0fbd21aca01910581537b21ae4fed46bc0e524c055059aa164ba0a6b62b), uint256(0x18fd4a7bc386cf03a95af7163d5359165acc4e7961cb46519e6d9ee4a1e2b7e9)], [uint256(0x11449dee0199ef6d8eebfe43b548e875c69e7ce37705ee9a00c81fe52f11a009), uint256(0x066d0c83b32800d3f335bb9e8ed5e2924cf00e77e6ec28178592eac9898e1a00)]); +``` + +Die Lösung besteht, zumindest bis Block-Explorer dazu übergehen, Zokrates-Verifizierung zu ihren Benutzeroberflächen hinzuzufügen, darin, dass die Anwendungsentwickler die Zokrates-Programme zur Verfügung stellen und dass zumindest einige Benutzer sie selbst mit dem entsprechenden Verifizierungsschlüssel kompilieren. + +Dazu gehen Sie wie folgt vor: + +1. [Installieren Sie Zokrates](https://zokrates.github.io/gettingstarted.html). + +2. Erstellen Sie eine Datei `dig.zok` mit dem Zokrates-Programm. Der nachstehende Code geht davon aus, dass Sie die ursprüngliche Kartengröße von 10x5 beibehalten haben. + + ```zokrates + import "utils/pack/bool/pack128.zok" as pack128; + import "hashes/poseidon/poseidon.zok" as poseidon; + + def hashMap(bool[12][7] map) -> field { + bool[512] mut map1d = [false; 512]; + u32 mut counter = 0; + + for u32 x in 0..12 { + for u32 y in 0..7 { + map1d[counter] = map[x][y]; + counter = counter+1; + } + } + + field[4] hashMe = [ + pack128(map1d[0..128]), + pack128(map1d[128..256]), + pack128(map1d[256..384]), + pack128(map1d[384..512]) + ]; + + return poseidon(hashMe); + } + + + // Die Anzahl der Minen am Ort (x,y) + def map2mineCount(bool[12][7] map, u32 x, u32 y) -> u8 { + return if map[x+1][y+1] { 1 } else { 0 }; + } + + def main(private bool[12][7] map, u32 x, u32 y) -> (field, u8) { + return (hashMap(map) , + if map2mineCount(map, x, y) > 0 { 0xFF } else { + map2mineCount(map, x-1, y-1) + map2mineCount(map, x, y-1) + map2mineCount(map, x+1, y-1) + + map2mineCount(map, x-1, y) + map2mineCount(map, x+1, y) + + map2mineCount(map, x-1, y+1) + map2mineCount(map, x, y+1) + map2mineCount(map, x+1, y+1) + } + ); + } + ``` + +3. Kompilieren Sie den Zokrates-Code und erstellen Sie den Verifizierungsschlüssel. Der Verifizierungsschlüssel muss mit der gleichen Entropie erstellt werden, die im ursprünglichen Server verwendet wurde, [in diesem Fall ein leerer String](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L67). + + ```sh copy + zokrates compile --input dig.zok + zokrates setup -e "" + ``` + +4. Erstellen Sie den Solidity-Verifizierer selbst und überprüfen Sie, ob er funktionell mit dem auf der Blockchain identisch ist (der Server fügt einen Kommentar hinzu, aber das ist nicht wichtig). + + ```sh copy + zokrates export-verifier + diff verifier.sol ~/20240901-secret-state/packages/contracts/src/verifier.sol + ``` + +## Designentscheidungen {#design} + +In jeder ausreichend komplexen Anwendung gibt es konkurrierende Designziele, die Kompromisse erfordern. Schauen wir uns einige der Kompromisse an und warum die aktuelle Lösung anderen Optionen vorzuziehen ist. + +### Warum Zero-Knowledge {#why-zero-knowledge} + +Für Minesweeper braucht man nicht wirklich Zero-Knowledge. Der Server kann die Karte immer behalten und sie dann einfach aufdecken, wenn das Spiel vorbei ist. Dann kann der Smart Contract am Ende des Spiels den Karten-Hash berechnen, überprüfen, ob er übereinstimmt, und wenn nicht, den Server bestrafen oder das Spiel vollständig ignorieren. + +Ich habe diese einfachere Lösung nicht verwendet, da sie nur für kurze Spiele mit einem genau definierten Endzustand funktioniert. Wenn ein Spiel potenziell unendlich ist (wie im Fall von [autonomen Welten](https://0xparc.org/blog/autonomous-worlds)), benötigen Sie eine Lösung, die den Zustand beweist, _ohne_ ihn preiszugeben. + +Als Tutorial benötigte dieser Artikel ein kurzes, leicht verständliches Spiel, aber diese Technik ist am nützlichsten für längere Spiele. + +### Warum Zokrates? {#why-zokrates} + +[Zokrates](https://zokrates.github.io/) ist nicht die einzige verfügbare Zero-Knowledge-Bibliothek, aber sie ähnelt einer normalen, [imperativen](https://en.wikipedia.org/wiki/Imperative_programming) Programmiersprache und unterstützt boolesche Variablen. + +Für Ihre Anwendung, mit unterschiedlichen Anforderungen, bevorzugen Sie möglicherweise die Verwendung von [Circum](https://docs.circom.io/getting-started/installation/) oder [Cairo](https://www.cairo-lang.org/tutorials/getting-started-with-cairo/). + +### Wann Zokrates kompilieren {#when-compile-zokrates} + +In diesem Programm kompilieren wir die Zokrates-Programme [jedes Mal, wenn der Server startet](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L60-L61). Das ist eindeutig eine Verschwendung von Ressourcen, aber dies ist ein Tutorial, das auf Einfachheit optimiert ist. + +Wenn ich eine produktionsreife Anwendung schreiben würde, würde ich prüfen, ob ich eine Datei mit den kompilierten Zokrates-Programmen für diese Minenfeldgröße habe, und wenn ja, diese verwenden. Dasselbe gilt für die Bereitstellung eines Verifizierervertrags onchain. + +### Erstellen der Verifizierer- und Prüferschlüssel {#key-creation} + +Die [Schlüsselerstellung](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L63-L69) ist eine weitere reine Berechnung, die für eine gegebene Minenfeldgröße nicht mehr als einmal durchgeführt werden muss. Auch hier wird es aus Gründen der Einfachheit nur einmal gemacht. + +Zusätzlich könnten wir eine [Setup-Zeremonie](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony) verwenden. Der Vorteil einer Setup-Zeremonie besteht darin, dass man entweder die Entropie oder ein Zwischenergebnis von jedem Teilnehmer benötigt, um beim Zero-Knowledge-Beweis zu betrügen. Wenn mindestens ein Teilnehmer der Zeremonie ehrlich ist und diese Informationen löscht, sind die Zero-Knowledge-Beweise vor bestimmten Angriffen sicher. Es gibt jedoch _keinen Mechanismus_, um zu überprüfen, ob Informationen von überall gelöscht wurden. Wenn Zero-Knowledge-Beweise von entscheidender Bedeutung sind, sollten Sie an der Setup-Zeremonie teilnehmen. + +Hier verlassen wir uns auf [perpetual powers of tau](https://github.com/privacy-scaling-explorations/perpetualpowersoftau), an denen Dutzende von Teilnehmern beteiligt waren. Es ist wahrscheinlich sicher genug und viel einfacher. Wir fügen auch keine Entropie während der Schlüsselerstellung hinzu, was es den Benutzern erleichtert, die [Zero-Knowledge-Konfiguration zu überprüfen](#user-verify-zero-trust). + +### Wo verifizieren {#where-verification} + +Wir können die Zero-Knowledge-Beweise entweder onchain (was Gas kostet) oder im Client (mithilfe von [`verify`](https://zokrates.github.io/toolbox/zokrates_js.html#verifyverificationkey-proof)) verifizieren. Ich habe die erste gewählt, da Sie damit [den Verifizierer einmal überprüfen](#user-verify-zero-trust) und dann darauf vertrauen können, dass er sich nicht ändert, solange die Vertragsadresse dafür gleich bleibt. Wenn die Verifizierung auf dem Client durchgeführt würde, müssten Sie den Code jedes Mal überprüfen, wenn Sie den Client herunterladen. + +Auch wenn dieses Spiel Einzelspieler ist, sind viele Blockchain-Spiele Mehrspieler. Onchain-Verifizierung bedeutet, dass Sie den Zero-Knowledge-Beweis nur einmal verifizieren. Wenn man es im Client macht, müsste jeder Client unabhängig verifizieren. + +### Die Karte in TypeScript oder Zokrates abflachen? {#where-flatten} + +Im Allgemeinen ist es besser, die Verarbeitung in TypeScript durchzuführen, wenn sie entweder in TypeScript oder Zokrates erfolgen kann, da TypeScript viel schneller ist und keine Zero-Knowledge-Beweise erfordert. Dies ist zum Beispiel der Grund, warum wir Zokrates nicht den Hash zur Verfügung stellen und ihn überprüfen lassen, ob er korrekt ist. Das Hashing muss innerhalb von Zokrates erfolgen, aber der Abgleich zwischen dem zurückgegebenen Hash und dem Hash onchain kann außerhalb davon stattfinden. + +Allerdings [flachen wir die Karte immer noch in Zokrates ab](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L15-L20), obwohl wir es auch in TypeScript hätten tun können. Der Grund ist, dass die anderen Optionen meiner Meinung nach schlechter sind. + +- Stellen Sie dem Zokrates-Code ein eindimensionales Array von Booleschen Werten zur Verfügung und verwenden Sie einen Ausdruck wie `x*(height+2) + +y`, um die zweidimensionale Karte zu erhalten. Dies würde [den Code](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L44-L47) etwas komplizierter machen, also habe ich entschieden, dass der Leistungsgewinn für ein Tutorial nicht wert ist. + +- Senden Sie Zokrates sowohl das eindimensionale als auch das zweidimensionale Array. Diese Lösung bringt uns jedoch nichts. Der Zokrates-Code müsste überprüfen, ob das bereitgestellte eindimensionale Array wirklich die korrekte Darstellung des zweidimensionalen Arrays ist. Es gäbe also keinen Leistungsgewinn. + +- Flachen Sie das zweidimensionale Array in Zokrates ab. Dies ist die einfachste Option, also habe ich sie gewählt. + +### Wo Karten speichern {#where-store-maps} + +In dieser Anwendung ist [`gamesInProgress`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L20) einfach eine Variable im Speicher. Das bedeutet, dass, wenn Ihr Server ausfällt und neu gestartet werden muss, alle gespeicherten Informationen verloren gehen. Spieler können nicht nur ihr Spiel nicht fortsetzen, sie können nicht einmal ein neues Spiel starten, weil die Onchain-Komponente denkt, dass sie noch ein Spiel im Gange haben. + +Dies ist eindeutig ein schlechtes Design für ein Produktionssystem, in dem Sie diese Informationen in einer Datenbank speichern würden. Der einzige Grund, warum ich hier eine Variable verwendet habe, ist, dass dies ein Tutorial ist und Einfachheit die Hauptüberlegung ist. + +## Fazit: Unter welchen Bedingungen ist dies die geeignete Technik? {#conclusion} + +So, jetzt wissen Sie, wie man ein Spiel mit einem Server schreibt, der geheime Zustände speichert, die nicht onchain gehören. Aber in welchen Fällen sollten Sie es tun? Es gibt zwei Hauptüberlegungen. + +- _Langlaufendes Spiel_: [Wie oben erwähnt](#why-zero-knowledge), können Sie in einem kurzen Spiel den Zustand einfach veröffentlichen, sobald das Spiel vorbei ist, und dann alles verifizieren lassen. Aber das ist keine Option, wenn das Spiel eine lange oder unbestimmte Zeit dauert und der Zustand geheim bleiben muss. + +- _Etwas Zentralisierung akzeptabel_: Zero-Knowledge-Beweise können die Integrität überprüfen, dass eine Entität die Ergebnisse nicht fälscht. Was sie nicht tun können, ist sicherzustellen, dass die Entität weiterhin verfügbar ist und auf Nachrichten antwortet. In Situationen, in denen die Verfügbarkeit auch dezentralisiert sein muss, sind Zero-Knowledge-Beweise keine ausreichende Lösung, und Sie benötigen eine [Mehrparteienberechnung](https://en.wikipedia.org/wiki/Secure_multi-party_computation). + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). + +### Anerkennungen {#acknowledgements} + +- Alvaro Alonso las einen Entwurf dieses Artikels und klärte einige meiner Missverständnisse über Zokrates auf. + +Alle verbleibenden Fehler liegen in meiner Verantwortung. diff --git a/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md new file mode 100644 index 00000000000..8053e043a96 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md @@ -0,0 +1,52 @@ +--- +title: Smart-Contract-Sicherheitscheckliste +description: Ein empfohlener Workflow zum Schreiben sicherer Smart Contracts +author: "Spuren von bits" +tags: [ "Smart Contracts", "Sicherheit", "Solidity" ] +skill: intermediate +lang: de +published: 07.09.2020 +source: Aufbau sicherer Verträge +sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md +--- + +## Smart-Contract-Entwicklungscheckliste {#smart-contract-development-checklist} + +Nachfolgend finden Sie einen allgemeinen Prozess, dessen Befolgung wir beim Schreiben Ihrer Smart Contracts empfehlen. + +Auf bekannte Sicherheitsprobleme prüfen: + +- Überprüfen Sie Ihre Verträge mit [Slither](https://github.com/crytic/slither). Es verfügt über mehr als 40 integrierte Detektoren für häufige Schwachstellen. Führen Sie es bei jedem Check-in mit neuem Code aus und stellen Sie sicher, dass Sie einen fehlerfreien Bericht erhalten (oder verwenden Sie den Triage-Modus, um bestimmte Probleme auszublenden). +- Überprüfen Sie Ihre Verträge mit [Crytic](https://crytic.io/). Es prüft auf 50 Probleme, die von Slither nicht geprüft werden. Crytic kann Ihrem Team auch dabei helfen, den Überblick zu behalten, indem es Sicherheitsprobleme in Pull-Requests auf GitHub leicht aufdeckt. + +Berücksichtigen Sie die besonderen Merkmale Ihres Vertrags: + +- Sind Ihre Verträge upgradefähig? Überprüfen Sie Ihren Upgradefähigkeits-Code auf Fehler mit [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) oder [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/). Wir haben 17 Möglichkeiten dokumentiert, wie Upgrades fehlschlagen können. +- Erheben Ihre Verträge den Anspruch, ERC-konform zu sein? Überprüfen Sie sie mit [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance). Dieses Tool erkennt sofort Abweichungen von sechs gängigen Spezifikationen. +- Integrieren Sie Token von Drittanbietern? Lesen Sie unsere [Checkliste für die Token-Integration](/developers/tutorials/token-integration-checklist/), bevor Sie sich auf externe Verträge verlassen. + +Überprüfen Sie die kritischen Sicherheitsmerkmale Ihres Codes visuell: + +- Überprüfen Sie den [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph)-Printer von Slither. Vermeiden Sie unbeabsichtigtes Shadowing und Probleme mit der C3-Linearisierung. +- Überprüfen Sie den [function-summary](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary)-Printer von Slither. Er meldet die Sichtbarkeit von Funktionen und die Zugriffskontrollen. +- Überprüfen Sie den [vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization)-Printer von Slither. Er meldet die Zugriffskontrollen für Zustandsvariablen. + +Dokumentieren Sie kritische Sicherheitseigenschaften und verwenden Sie automatisierte Testgeneratoren, um sie zu bewerten: + +- Lernen Sie, [wie Sie Sicherheitseigenschaften für Ihren Code dokumentieren](/developers/tutorials/guide-to-smart-contract-security-tools/). Anfangs ist es schwierig, aber es ist die wichtigste Tätigkeit, um ein gutes Ergebnis zu erzielen. Es ist auch eine Voraussetzung für die Anwendung der fortgeschrittenen Techniken in diesem Tutorial. +- Definieren Sie Sicherheitseigenschaften in Solidity, zur Verwendung mit [Echidna](https://github.com/crytic/echidna) und [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). Konzentrieren Sie sich auf Ihre Statusmaschine, Zugriffskontrollen, arithmetische Operationen, externe Interaktionen und die Einhaltung von Standards. +- Definieren Sie Sicherheitseigenschaften mit der [Python-API von Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/). Konzentrieren Sie sich auf Vererbung, Variablenabhängigkeiten, Zugriffskontrollen und andere strukturelle Probleme. +- Führen Sie Ihre Eigenschaftstests bei jedem Commit mit [Crytic](https://crytic.io) aus. Crytic kann Tests von Sicherheitseigenschaften verarbeiten und auswerten, sodass jeder in Ihrem Team auf GitHub leicht sehen kann, dass sie erfolgreich sind. Fehlgeschlagene Tests können Commits blockieren. + +Achten Sie schließlich auf Probleme, die automatisierte Werkzeuge nicht leicht finden können: + +- Mangelnde Privatsphäre: Alle anderen können Ihre Transaktionen sehen, während sie sich im Pool in der Warteschlange befinden. +- Front-Running von Transaktionen +- Kryptografische Operationen +- Riskante Interaktionen mit externen DeFi-Komponenten + +## Bitten Sie um Hilfe {#ask-for-help} + +Die [Ethereum-Sprechstunden](https://calendly.com/dan-trailofbits/office-hours) finden jeden Dienstagnachmittag statt. Diese einstündigen Einzelsitzungen sind eine Gelegenheit, uns alle Ihre Fragen zur Sicherheit zu stellen, Probleme bei der Verwendung unserer Werkzeuge zu beheben und Feedback von Experten zu Ihrem aktuellen Ansatz zu erhalten. Wir helfen Ihnen, diesen Leitfaden durchzuarbeiten. + +Treten Sie unserem Slack bei: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Wir sind immer in den Kanälen #crytic und #ethereum erreichbar, wenn Sie Fragen haben. diff --git a/public/content/translations/de/developers/tutorials/send-token-ethersjs/index.md b/public/content/translations/de/developers/tutorials/send-token-ethersjs/index.md new file mode 100644 index 00000000000..60bfab22670 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/send-token-ethersjs/index.md @@ -0,0 +1,210 @@ +--- +title: Senden von Token mit ethers.js +description: Einsteigerfreundliche Anleitung zum Senden von Token mit ethers.js. +author: Kim YongJun +tags: [ "ETHERS.JS", "ERC-20", "TOKENS" ] +skill: beginner +lang: de +published: 2021-04-06 +--- + +## Token senden mit ethers.js (5.0) {#send-token} + +### In diesem Tutorial erfahren Sie, wie Sie {#you-learn-about} + +- Ethers.js importieren +- Token transferieren +- Gas-Preis entsprechend der Netzwerkauslastung festlegen + +### Erste Schritte {#to-get-started} + +Zu Beginn müssen wir zunächst die ethers.js-Bibliothek in unser Javascript importieren +Binden Sie ethers.js (5.0) ein + +### Installation {#install-ethersjs} + +```shell +/home/ricmoo> npm install --save ethers +``` + +ES6 im Browser + +```html + +``` + +ES3(UMD) im Browser + +```html + +``` + +### Parameter {#param} + +1. **`contract_address`**: Token-Vertragsadresse (die Vertragsadresse wird benötigt, wenn der Token, den Sie übertragen möchten, nicht Ether ist) +2. **`send_token_amount`**: Der Betrag, den Sie an den Empfänger senden möchten +3. **`to_address`**: Die Adresse des Empfängers +4. **`send_account`**: Die Adresse des Absenders +5. **`private_key`**: Privater Schlüssel des Absenders, um die Transaktion zu signieren und die Token tatsächlich zu übertragen + +## Hinweis {#notice} + +`signTransaction(tx)` wird entfernt, da `sendTransaction()` dies intern erledigt. + +## Sendeablauf {#procedure} + +### 1. Mit dem Netzwerk (Testnet) verbinden {#connect-to-network} + +#### Provider festlegen (Infura) {#set-provider} + +Mit dem Ropsten-Testnet verbinden + +```javascript +window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") +``` + +### 2. Wallet erstellen {#create-wallet} + +```javascript +let wallet = new ethers.Wallet(private_key) +``` + +### 3. Wallet mit dem Netzwerk verbinden {#connect-wallet-to-net} + +```javascript +let walletSigner = wallet.connect(window.ethersProvider) +``` + +### 4. Aktuellen Gas-Preis abrufen {#get-gas} + +```javascript +window.ethersProvider.getGasPrice() // gasPrice +``` + +### 5. Transaktion definieren {#define-transaction} + +Die unten definierten Variablen sind von `send_token()` abhängig + +### Transaktionsparameter {#transaction-params} + +1. **`send_account`**: Adresse des Token-Absenders +2. **`to_address`**: Adresse des Token-Empfängers +3. **`send_token_amount`**: die Anzahl der zu sendenden Token +4. **`gas_limit`**: Gaslimit +5. **`gas_price`**: Gas-Preis + +[Siehe unten zur Verwendung](#how-to-use) + +```javascript +const tx = { + from: send_account, + to: to_address, + value: ethers.utils.parseEther(send_token_amount), + nonce: window.ethersProvider.getTransactionCount(send_account, "latest"), + gasLimit: ethers.utils.hexlify(gas_limit), // 100000 + gasPrice: gas_price, +} +``` + +### 6. Übertragung {#transfer} + +```javascript +walletSigner.sendTransaction(tx).then((transaction) => { + console.dir(transaction) + alert("Senden abgeschlossen!") +}) +``` + +## Verwendung {#how-to-use} + +```javascript +let private_key = + "41559d28e936dc92104ff30691519693fc753ffbee6251a611b9aa1878f12a4d" +let send_token_amount = "1" +let to_address = "0x4c10D2734Fb76D3236E522509181CC3Ba8DE0e80" +let send_address = "0xda27a282B5B6c5229699891CfA6b900A716539E6" +let gas_limit = "0x100000" +let wallet = new ethers.Wallet(private_key) +let walletSigner = wallet.connect(window.ethersProvider) +let contract_address = "" +window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") + +send_token( + contract_address, + send_token_amount, + to_address, + send_address, + private_key +) +``` + +### Erfolg! {#success} + +![Bild einer erfolgreich durchgeführten Transaktion](./successful-transaction.png) + +## send_token() {#send-token-method} + +```javascript +function send_token( + contract_address, + send_token_amount, + to_address, + send_account, + private_key +) { + let wallet = new ethers.Wallet(private_key) + let walletSigner = wallet.connect(window.ethersProvider) + + window.ethersProvider.getGasPrice().then((currentGasPrice) => { + let gas_price = ethers.utils.hexlify(parseInt(currentGasPrice)) + console.log(`gas_price: ${gas_price}`) + + if (contract_address) { + // allgemeiner Token-Versand + let contract = new ethers.Contract( + contract_address, + send_abi, + walletSigner + ) + + // Wie viele Token? + let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18) + console.log(`numberOfTokens: ${numberOfTokens}`) + + // Token senden + contract.transfer(to_address, numberOfTokens).then((transferResult) => { + console.dir(transferResult) + alert("Token gesendet") + }) + } // Ether senden + else { + const tx = { + from: send_account, + to: to_address, + value: ethers.utils.parseEther(send_token_amount), + nonce: window.ethersProvider.getTransactionCount( + send_account, + "latest" + ), + gasLimit: ethers.utils.hexlify(gas_limit), // 100000 + gasPrice: gas_price, + } + console.dir(tx) + try { + walletSigner.sendTransaction(tx).then((transaction) => { + console.dir(transaction) + alert("Senden abgeschlossen!") + }) + } catch (error) { + alert("Senden fehlgeschlagen!!") + } + } + }) +} +``` diff --git a/public/content/translations/de/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/de/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md new file mode 100644 index 00000000000..79f858b6f76 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md @@ -0,0 +1,208 @@ +--- +title: Versenden von Transaktionen mit Web3 +description: "Dies ist eine anfängerfreundliche Anleitung zum Versenden von Ethereum-Transaktionen mit Web3. Es gibt drei Hauptschritte, um eine Transaktion an die Ethereum-Blockchain zu senden: Erstellen, Signieren und Übertragen. Wir werden alle drei durchgehen." +author: "Elan Halpern" +tags: [ "Transaktionen", "web3.js", "Alchemy" ] +skill: beginner +lang: de +published: 2020-11-04 +source: Alchemie Dokumente +sourceUrl: https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum +--- + +Dies ist eine anfängerfreundliche Anleitung zum Versenden von Ethereum-Transaktionen mit Web3. Es gibt drei Hauptschritte, um eine Transaktion an die Ethereum-Blockchain zu senden: Erstellen, Signieren und Übertragen. Wir gehen auf alle drei Punkte ein und beantworten hoffentlich alle Fragen, die Sie haben! In diesem Tutorial verwenden wir [Alchemy](https://www.alchemy.com/), um unsere Transaktionen an die Ethereum-Chain zu senden. Sie können [hier ein kostenloses Alchemy-Konto erstellen](https://auth.alchemyapi.io/signup). + +**HINWEIS:** Diese Anleitung ist für das Signieren Ihrer Transaktionen auf dem _Backend_ Ihrer App. Wenn Sie das Signieren Ihrer Transaktionen im Frontend integrieren möchten, sehen Sie sich die Integration von [Web3 mit einem Browser-Anbieter](https://docs.alchemy.com/reference/api-overview#with-a-browser-provider) an. + +## Die Grundlagen {#the-basics} + +Wie die meisten Blockchain-Entwickler, wenn sie anfangen, haben Sie vielleicht recherchiert, wie man eine Transaktion sendet (etwas, das ziemlich einfach sein sollte), und sind auf eine Fülle von Anleitungen gestoßen, von denen jede etwas anderes besagt und Sie etwas überfordert und verwirrt zurücklässt. Wenn Sie im selben Boot sitzen, keine Sorge – wir alle waren irgendwann einmal an diesem Punkt! Bevor wir also beginnen, sollten wir ein paar Dinge klarstellen: + +### 1. Alchemy speichert Ihre privaten Schlüssel nicht {#alchemy-does-not-store-your-private-keys} + +- Das bedeutet, dass Alchemy keine Transaktionen in Ihrem Namen signieren und senden kann. Dies geschieht aus Sicherheitsgründen. Alchemy wird Sie niemals darum bitten, Ihren privaten Schlüssel mitzuteilen, und Sie sollten Ihren privaten Schlüssel niemals mit einem gehosteten Node (oder überhaupt jemandem) teilen. +- Sie können mit der Core-API von Alchemy aus der Blockchain lesen, aber um darauf zu schreiben, müssen Sie etwas anderes verwenden, um Ihre Transaktionen zu signieren, bevor Sie sie über Alchemy senden (dies gilt für jeden anderen [Node-Service](/developers/docs/nodes-and-clients/nodes-as-a-service/)). + +### 2. Was ist ein „Signer“? {#what-is-a-signer} + +- Signer signieren Transaktionen für Sie mit Ihrem privaten Schlüssel. In diesem Tutorial verwenden wir [Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3), um unsere Transaktion zu signieren, aber Sie könnten auch jede andere Web3-Bibliothek verwenden. +- Ein gutes Beispiel für einen Signer im Frontend wäre [MetaMask](https://metamask.io/), das Transaktionen in Ihrem Namen signiert und sendet. + +### 3. Warum muss ich meine Transaktionen signieren? {#why-do-i-need-to-sign-my-transactions} + +- Jeder Benutzer, der eine Transaktion über das Ethereum-Netzwerk senden möchte, muss die Transaktion (mit seinem privaten Schlüssel) signieren, um zu validieren, dass der Ursprung der Transaktion auch der ist, den er vorgibt zu sein. +- Es ist extrem wichtig, diesen privaten Schlüssel zu schützen, da der Zugriff darauf die volle Kontrolle über Ihr Ethereum-Konto gewährt und es Ihnen (oder jedem mit Zugriff) ermöglicht, Transaktionen in Ihrem Namen durchzuführen. + +### 4. Wie schütze ich meinen privaten Schlüssel? {#how-do-i-protect-my-private-key} + +- Es gibt viele Möglichkeiten, Ihren privaten Schlüssel zu schützen und ihn zum Senden von Transaktionen zu verwenden. In diesem Tutorial werden wir eine `.env`-Datei verwenden. Sie können jedoch auch einen separaten Anbieter verwenden, der private Schlüssel speichert, eine Keystore-Datei nutzen oder andere Optionen wählen. + +### 5. Was ist der Unterschied zwischen `eth_sendTransaction` und `eth_sendRawTransaction`? {#difference-between-send-and-send-raw} + +`eth_sendTransaction` und `eth_sendRawTransaction` sind beides Ethereum-API-Funktionen, die eine Transaktion an das Ethereum-Netzwerk senden, sodass sie einem zukünftigen Block hinzugefügt wird. Sie unterscheiden sich in der Art und Weise, wie sie das Signieren der Transaktionen handhaben. + +- [`eth_sendTransaction`](https://docs.web3js.org/api/web3-eth/function/sendTransaction) wird für das Senden von _unsignierten_ Transaktionen verwendet. Das bedeutet, der Node, an den Sie senden, muss Ihren privaten Schlüssel verwalten, damit er die Transaktion signieren kann, bevor er sie an die Chain sendet. Da Alchemy die privaten Schlüssel der Benutzer nicht speichert, wird diese Methode nicht unterstützt. +- [`eth_sendRawTransaction`](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction) wird verwendet, um bereits signierte Transaktionen zu senden. Das bedeutet, Sie müssen zuerst [`signTransaction(tx, private_key)`](https://docs.web3js.org/api/web3-eth-accounts/function/signTransaction) verwenden und dann das Ergebnis an `eth_sendRawTransaction` übergeben. + +Bei Verwendung von Web3 wird auf `eth_sendRawTransaction` durch den Aufruf der Funktion [web3.eth.sendSignedTransaction](https://docs.web3js.org/api/web3-eth/function/sendSignedTransaction) zugegriffen. + +Das werden wir in diesem Tutorial verwenden. + +### 6. Was ist die Web3-Bibliothek? {#what-is-the-web3-library} + +- Web3.js ist eine Wrapper-Bibliothek für die standardmäßigen JSON-RPC-Aufrufe, die in der Ethereum-Entwicklung sehr verbreitet ist. +- Es gibt viele Web3-Bibliotheken für verschiedene Sprachen. In diesem Tutorial verwenden wir [Alchemy Web3](https://docs.alchemy.com/reference/api-overview), das in JavaScript geschrieben ist. Sie können sich [hier](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) andere Optionen wie [ethers.js](https://docs.ethers.org/v5/) ansehen. + +Okay, nachdem wir nun einige dieser Fragen aus dem Weg geräumt haben, fahren wir mit dem Tutorial fort. Fragen können Sie jederzeit im Alchemy-[Discord](https://discord.gg/gWuC7zB) stellen! + +### 7. Wie sendet man sichere, gas-optimierte und private Transaktionen? {#how-to-send-secure-gas-optimized-and-private-transactions} + +- [Alchemy verfügt über eine Reihe von Transact-APIs](https://docs.alchemy.com/reference/transact-api-quickstart). Sie können diese verwenden, um verstärkte Transaktionen zu senden, Transaktionen vorab zu simulieren, private Transaktionen zu senden und gasoptimierte Transaktionen zu senden. +- Sie können auch die [Notify API](https://docs.alchemy.com/docs/alchemy-notify) verwenden, um benachrichtigt zu werden, wenn Ihre Transaktion aus dem Mempool geholt und zur Chain hinzugefügt wird. + +**HINWEIS:** Diese Anleitung erfordert ein Alchemy-Konto, eine Ethereum-Adresse oder eine MetaMask-Wallet sowie installiertes NodeJs und npm. Falls nicht, folgen Sie diesen Schritten: + +1. [Erstellen Sie ein kostenloses Alchemy-Konto](https://auth.alchemyapi.io/signup) +2. [MetaMask-Konto erstellen](https://metamask.io/) (oder eine Ethereum-Adresse erhalten) +3. [Befolgen Sie diese Schritte, um NodeJs und NPM zu installieren](https://docs.alchemy.com/alchemy/guides/alchemy-for-macs) + +## Schritte zum Senden Ihrer Transaktion {#steps-to-sending-your-transaction} + +### 1. Erstellen Sie eine Alchemy-App auf dem Sepolia-Testnet {#create-an-alchemy-app-on-the-sepolia-testnet} + +Navigieren Sie zu Ihrem [Alchemy Dashboard](https://dashboard.alchemyapi.io/) und erstellen Sie eine neue App, indem Sie Sepolia (oder ein anderes Testnet) als Netzwerk auswählen. + +### 2. ETH vom Sepolia-Faucet anfordern {#request-eth-from-sepolia-faucet} + +Folgen Sie den Anweisungen auf dem [Alchemy Sepolia Faucet](https://www.sepoliafaucet.com/), um ETH zu erhalten. Stellen Sie sicher, dass Sie Ihre **Sepolia**-Ethereum-Adresse (von MetaMask) und nicht die eines anderen Netzwerks angeben. Nachdem Sie die Anweisungen befolgt haben, überprüfen Sie, ob Sie die ETH in Ihrer Wallet erhalten haben. + +### 3. Erstellen Sie ein neues Projektverzeichnis und wechseln Sie mit `cd` hinein {#create-a-new-project-direction} + +Erstellen Sie ein neues Projektverzeichnis in der Befehlszeile (Terminal für Macs) und navigieren Sie hinein: + +``` +mkdir sendtx-example +cd sendtx-example +``` + +### 4. Alchemy Web3 (oder eine beliebige Web3-Bibliothek) installieren {#install-alchemy-web3} + +Führen Sie den folgenden Befehl in Ihrem Projektverzeichnis aus, um [Alchemy Web3](https://docs.alchemy.com/reference/api-overview) zu installieren: + +Hinweis: Wenn Sie die ethers.js-Bibliothek verwenden möchten, [folgen Sie den Anweisungen hier](https://docs.alchemy.com/docs/how-to-send-transactions-on-ethereum). + +``` +npm install @alch/alchemy-web3 +``` + +### 5. dotenv installieren {#install-dotenv} + +Wir verwenden eine `.env`-Datei, um unseren API-Schlüssel und unseren privaten Schlüssel sicher zu speichern. + +``` +npm install dotenv --save +``` + +### 6. Die `.env`-Datei erstellen {#create-the-dotenv-file} + +Erstellen Sie eine `.env`-Datei in Ihrem Projektverzeichnis und fügen Sie Folgendes hinzu (ersetzen Sie „`your-api-url`“ und „`your-private-key`“) + +- Um Ihre Alchemy-API-URL zu finden, navigieren Sie zur Detailseite der App, die Sie gerade in Ihrem Dashboard erstellt haben, klicken Sie oben rechts auf „View Key“ und kopieren Sie die HTTP-URL. +- Um Ihren privaten Schlüssel mit MetaMask zu finden, sehen Sie sich diese [Anleitung](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) an. + +``` +API_URL = "your-api-url" +PRIVATE_KEY = "your-private-key" +``` + + + + +Führen Sie keinen Commit für .env aus! Bitte stellen Sie sicher, dass Sie Ihre .env-Datei niemals an Dritte weitergeben oder offenlegen, da Sie dadurch Ihre Geheimnisse preisgeben. Wenn Sie eine Versionskontrolle verwenden, fügen Sie Ihre .env-Datei einer gitignore-Datei hinzu. + + + + +### 7. `sendTx.js`-Datei erstellen {#create-sendtx-js} + +Großartig, jetzt, da unsere sensiblen Daten in einer `.env`-Datei geschützt sind, können wir mit dem Programmieren beginnen. Für unser Beispiel zum Senden von Transaktionen senden wir ETH an den Sepolia-Faucet zurück. + +Erstellen Sie eine `sendTx.js`-Datei, in der wir unsere Beispieltransaktion konfigurieren und senden, und fügen Sie die folgenden Codezeilen hinzu: + +``` +async function main() { + require('dotenv').config(); + const { API_URL, PRIVATE_KEY } = process.env; + const { createAlchemyWeb3 } = require("@alch/alchemy-web3"); + const web3 = createAlchemyWeb3(API_URL); + const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' //TODO: Ersetzen Sie diese Adresse durch Ihre eigene öffentliche Adresse + + const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // Nonce beginnt bei 0 zu zählen + + const transaction = { + 'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // Faucet-Adresse, um ETH zurückzugeben + 'value': 1000000000000000000, // 1 ETH + 'gas': 30000, + 'nonce': nonce, + // optionales Datenfeld zum Senden einer Nachricht oder Ausführen eines Smart Contracts + }; + + const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY); + + web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) { + if (!error) { + console.log("🎉 Der Hash Ihrer Transaktion lautet: ", hash, "\n Sehen Sie sich Alchemys Mempool an, um den Status Ihrer Transaktion zu überprüfen!"); + } else { + console.log("❗Beim Senden Ihrer Transaktion ist ein Fehler aufgetreten:", error) + } + }); +} + +main(); +``` + +Ersetzen Sie die Adresse in **Zeile 6** unbedingt durch Ihre eigene öffentliche Adresse. + +Bevor wir diesen Code ausführen, lassen Sie uns über einige der Komponenten hier sprechen. + +- `nonce`: Die Nonce-Spezifikation wird verwendet, um die Anzahl der von Ihrer Adresse gesendeten Transaktionen zu verfolgen. Wir benötigen dies aus Sicherheitsgründen und um [Replay-Angriffe](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce) zu verhindern. Um die Anzahl der von Ihrer Adresse gesendeten Transaktionen zu ermitteln, verwenden wir [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). +- `transaction`: Das Transaktionsobjekt hat einige Aspekte, die wir spezifizieren müssen. + - `to`: Dies ist die Adresse, an die wir ETH senden möchten. In diesem Fall senden wir ETH an den [Sepolia Faucet](https://sepoliafaucet.com/) zurück, von dem wir sie ursprünglich angefordert haben. + - `value`: Dies ist der Betrag, den wir senden möchten, angegeben in Wei, wobei 10^18 Wei = 1 ETH. + - `gas`: Es gibt viele Möglichkeiten, die richtige Menge an Gas für Ihre Transaktion zu bestimmen. Alchemy hat sogar einen [Gaspreis-Webhook](https://docs.alchemyapi.io/guides/alchemy-notify#address-activity-1), der Sie benachrichtigt, wenn der Gaspreis unter einen bestimmten Schwellenwert fällt. Für Mainnet-Transaktionen ist es eine gute Praxis, einen Gas-Schätzer wie [ETH Gas Station](https://ethgasstation.info/) zu Rate zu ziehen, um die richtige Menge an Gas zu bestimmen. 21000 ist die Mindestmenge an Gas, die eine Operation auf Ethereum verbraucht. Um sicherzustellen, dass unsere Transaktion ausgeführt wird, geben wir hier 30000 an. + - `nonce`: siehe Nonce-Definition oben. Die Nonce-Zählung beginnt bei Null. + - [OPTIONAL] data: Wird zum Senden zusätzlicher Informationen mit Ihrer Übertragung oder zum Aufrufen eines Smart Contracts verwendet. Für Guthabenübertragungen nicht erforderlich, siehe Hinweis unten. +- `signedTx`: Um unser Transaktionsobjekt zu signieren, verwenden wir die `signTransaction`-Methode mit unserem `PRIVATE_KEY`. +- `sendSignedTransaction`: Sobald wir eine signierte Transaktion haben, können wir sie mit `sendSignedTransaction` versenden, damit sie in einen nachfolgenden Block aufgenommen wird. + +**Ein Hinweis zu Daten** +Es gibt zwei Haupttypen von Transaktionen, die in Ethereum gesendet werden können. + +- Guthabenübertragung: Senden Sie ETH von einer Adresse zu einer anderen. Kein Datenfeld erforderlich. Wenn Sie jedoch zusätzliche Informationen mit Ihrer Transaktion senden möchten, können Sie diese Informationen in diesem Feld im HEX-Format angeben. + - Nehmen wir zum Beispiel an, wir wollten den Hash eines IPFS-Dokuments in die Ethereum-Chain schreiben, um ihm einen unveränderlichen Zeitstempel zu geben. Unser Datenfeld sollte dann so aussehen: data: `web3.utils.toHex('IPFS-Hash')`. Und jetzt kann jeder die Chain abfragen und sehen, wann dieses Dokument hinzugefügt wurde. +- Smart-Contract-Transaktion: Führen Sie einen Smart-Contract-Code auf der Chain aus. In diesem Fall sollte das Datenfeld die Smart-Funktion, die Sie ausführen möchten, sowie alle Parameter enthalten. + - Ein praktisches Beispiel finden Sie in Schritt 8 in diesem [Hello-World-Tutorial](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#step-8-create-the-transaction). + +### 8. Den Code mit `node sendTx.js` ausführen {#run-the-code-using-node-sendtx-js} + +Navigieren Sie zurück zu Ihrem Terminal oder Ihrer Befehlszeile und führen Sie Folgendes aus: + +``` +node sendTx.js +``` + +### 9. Sehen Sie Ihre Transaktion im Mempool {#see-your-transaction-in-the-mempool} + +Öffnen Sie die [Mempool-Seite](https://dashboard.alchemyapi.io/mempool) in Ihrem Alchemy-Dashboard und filtern Sie nach der von Ihnen erstellten App, um Ihre Transaktion zu finden. Hier können wir den Übergang unserer Transaktion vom Status „ausstehend“ zum Status „gemined“ (bei Erfolg) oder „verworfen“ (bei Misserfolg) beobachten. Stellen Sie sicher, dass die Einstellung auf „Alle“ (All) bleibt, damit Sie „geminte“ (mined), „ausstehende“ (pending) und „verworfene“ (dropped) Transaktionen erfassen. Sie können auch nach Ihrer Transaktion suchen, indem Sie nach Transaktionen suchen, die an die Adresse `0x31b98d14007bdee637298086988a0bbd31184523` gesendet wurden. + +Um die Details Ihrer Transaktion anzuzeigen, nachdem Sie sie gefunden haben, wählen Sie den Transaktions-Hash aus. Sie sollten dann zu einer Ansicht gelangen, die wie folgt aussieht: + +![Mempool Watcher Screenshot](./mempool.png) + +Von dort aus können Sie Ihre Transaktion auf Etherscan einsehen, indem Sie auf das rot eingekreiste Symbol klicken! + +**Juhuuu!** Sie haben gerade Ihre erste Ethereum-Transaktion mit Alchemy gesendet 🎉\*\* + +_Für Feedback und Vorschläge zu dieser Anleitung schreiben Sie bitte eine Nachricht an Elan auf Alchemys [Discord](https://discord.gg/A39JVCM)!_ + +_Ursprünglich veröffentlicht unter [https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy](https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy)_ diff --git a/public/content/translations/de/developers/tutorials/server-components/index.md b/public/content/translations/de/developers/tutorials/server-components/index.md new file mode 100644 index 00000000000..25859af76d9 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/server-components/index.md @@ -0,0 +1,295 @@ +--- +title: "Server-Komponenten und Agenten für Web3-Apps" +description: Nach dem Lesen dieses Tutorials können Sie TypeScript-Server schreiben, die auf Ereignisse auf einer Blockchain lauschen und entsprechend mit ihren eigenen Transaktionen reagieren. Dies ermöglicht es Ihnen, zentralisierte Anwendungen zu schreiben (da der Server ein Single Point of Failure ist), die jedoch mit Web3-Entitäten interagieren können. Die gleichen Techniken können auch verwendet werden, um einen Agenten zu schreiben, der auf On-Chain-Ereignisse ohne menschliches Eingreifen reagiert. + +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +lang: de +tags: [ "Agent", "Server", "Off-Chain" ] +skill: beginner +published: 2024-07-15 +--- + +## Einführung {#introduction} + +In den meisten Fällen verwendet eine dezentralisierte App einen Server, um die Software zu verteilen, aber die eigentliche Interaktion findet zwischen dem Client (typischerweise einem Webbrowser) und der Blockchain statt. + +![Normale Interaktion zwischen Webserver, Client und Blockchain](./fig-1.svg) + +Es gibt jedoch einige Fälle, in denen eine Anwendung davon profitieren würde, eine unabhängig laufende Server-Komponente zu haben. Ein solcher Server wäre in der Lage, auf Ereignisse und auf Anfragen von anderen Quellen, wie z. B. einer API, zu reagieren, indem er Transaktionen ausstellt. + +![Die Interaktion mit der Hinzufügung eines Servers](./fig-2.svg) + +Es gibt mehrere mögliche Aufgaben, die ein solcher Server erfüllen könnte. + +- Inhaber eines geheimen Zustands. Bei Spielen ist es oft nützlich, den Spielern nicht alle Informationen zur Verfügung zu stellen, die das Spiel kennt. Allerdings _gibt es keine Geheimnisse auf der Blockchain_, jede Information, die sich auf der Blockchain befindet, kann von jedem leicht herausgefunden werden. Wenn also ein Teil des Spielzustands geheim gehalten werden soll, muss er an anderer Stelle gespeichert werden (und die Auswirkungen dieses Zustands möglicherweise mit [Zero-Knowledge-Beweisen](/zero-knowledge-proofs) verifiziert werden). + +- Zentralisiertes Orakel. Wenn die Einsätze ausreichend niedrig sind, kann ein externer Server, der einige Informationen online liest und sie dann in die Chain postet, ausreichend sein, um als [Orakel](/developers/docs/oracles/) verwendet zu werden. + +- Agent. Auf der Blockchain passiert nichts ohne eine Transaktion, die es aktiviert. Ein Server kann im Namen eines Benutzers handeln, um Aktionen wie [Arbitrage](/developers/docs/mev/#mev-examples-dex-arbitrage) durchzuführen, wenn sich die Gelegenheit dazu bietet. + +## Beispielprogramm {#sample-program} + +Sie können einen Beispielserver [auf GitHub](https://github.com/qbzzt/20240715-server-component) sehen. Dieser Server lauscht auf Ereignisse, die von [diesem Vertrag](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=contract_code) stammen, einer modifizierten Version des Greeters von Hardhat. Wenn die Begrüßung geändert wird, ändert er sie wieder zurück. + +So führen Sie es aus: + +1. Klonen Sie das Repository. + + ```sh copy + git clone https://github.com/qbzzt/20240715-server-component.git + cd 20240715-server-component + ``` + +2. Installieren Sie die erforderlichen Pakete. Wenn Sie es noch nicht haben, [installieren Sie zuerst Node](https://nodejs.org/en/download/package-manager). + + ```sh copy + npm install + ``` + +3. Bearbeiten Sie `.env`, um den privaten Schlüssel eines Kontos anzugeben, das ETH im Holesky-Testnet hat. Wenn Sie keine ETH auf Holesky haben, können Sie [diesen Faucet](https://holesky-faucet.pk910.de/) verwenden. + + ```sh filename=".env" copy + PRIVATE_KEY=0x + ``` + +4. Starten Sie den Server. + + ```sh copy + npm start + ``` + +5. Gehen Sie zu [einem Block-Explorer](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=write_contract) und ändern Sie mit einer anderen Adresse als derjenigen, die den privaten Schlüssel hat, die Begrüßung. Sie werden sehen, dass die Begrüßung automatisch zurückgeändert wird. + +### Wie funktioniert das? {#how-it-works} + +Der einfachste Weg, um zu verstehen, wie man eine Server-Komponente schreibt, ist, das Beispiel Zeile für Zeile durchzugehen. + +#### `src/app.ts` {#src-app-ts} + +Der überwiegende Teil des Programms ist in [`src/app.ts`](https://github.com/qbzzt/20240715-server-component/blob/main/src/app.ts) enthalten. + +##### Erstellen der erforderlichen Objekte + +```typescript +import { + createPublicClient, + createWalletClient, + getContract, + http, + Address, +} from "viem" +``` + +Dies sind die [Viem](https://viem.sh/)-Entitäten, die wir benötigen, Funktionen und [der `Address`-Typ](https://viem.sh/docs/glossary/types#address). Dieser Server ist in [TypeScript](https://www.typescriptlang.org/) geschrieben, einer Erweiterung von JavaScript, die es [stark typisiert](https://en.wikipedia.org/wiki/Strong_and_weak_typing). + +```typescript +import { privateKeyToAccount } from "viem/accounts" +``` + +[Diese Funktion](https://viem.sh/docs/accounts/privateKey) ermöglicht es uns, die Wallet-Informationen, einschließlich der Adresse, zu generieren, die einem privaten Schlüssel entsprechen. + +```typescript +import { holesky } from "viem/chains" +``` + +Um eine Blockchain in Viem zu verwenden, müssen Sie ihre Definition importieren. In diesem Fall wollen wir uns mit der [Holesky](https://github.com/eth-clients/holesky)-Test-Blockchain verbinden. + +```typescript +// So fügen wir die Definitionen in .env zu process.env hinzu. +import * as dotenv from "dotenv" +dotenv.config() +``` + +So lesen wir `.env` in die Umgebung ein. Wir brauchen es für den privaten Schlüssel (siehe später). + +```typescript +const greeterAddress : Address = "0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6" +const greeterABI = [ + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + . + . + . + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "name": "setGreeting", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] as const +``` + +Um einen Vertrag zu verwenden, benötigen wir seine Adresse und die [ABI](/glossary/#abi) dafür. Wir stellen hier beides zur Verfügung. + +In JavaScript (und damit auch in TypeScript) kann man einer Konstante keinen neuen Wert zuweisen, aber man _kann_ das Objekt, das darin gespeichert ist, ändern. Durch die Verwendung des Suffixes `as const` teilen wir TypeScript mit, dass die Liste selbst konstant ist und nicht geändert werden darf. + +```typescript +const publicClient = createPublicClient({ + chain: holesky, + transport: http(), +}) +``` + +Erstellen Sie einen [öffentlichen Client](https://viem.sh/docs/clients/public.html) von Viem. Öffentliche Clients haben keinen angehängten privaten Schlüssel und können daher keine Transaktionen senden. Sie können [`view`-Funktionen](https://www.tutorialspoint.com/solidity/solidity_view_functions.htm) aufrufen, Kontostände lesen usw. + +```typescript +const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) +``` + +Die Umgebungsvariablen sind in [`process.env`](https://www.totaltypescript.com/how-to-strongly-type-process-env) verfügbar. TypeScript ist jedoch stark typisiert. Eine Umgebungsvariable kann eine beliebige Zeichenkette oder leer sein, daher ist der Typ für eine Umgebungsvariable `string | undefined`. Ein Schlüssel ist in Viem jedoch als `0x${string}` (`0x` gefolgt von einer Zeichenkette) definiert. Hier teilen wir TypeScript mit, dass die Umgebungsvariable `PRIVATE_KEY` von diesem Typ sein wird. Wenn dies nicht der Fall ist, erhalten wir einen Laufzeitfehler. + +Die Funktion [`privateKeyToAccount`](https://viem.sh/docs/accounts/privateKey) verwendet dann diesen privaten Schlüssel, um ein vollständiges Kontoobjekt zu erstellen. + +```typescript +const walletClient = createWalletClient({ + account, + chain: holesky, + transport: http(), +}) +``` + +Als Nächstes verwenden wir das Kontoobjekt, um einen [Wallet-Client](https://viem.sh/docs/clients/wallet) zu erstellen. Dieser Client hat einen privaten Schlüssel und eine Adresse, sodass er zum Senden von Transaktionen verwendet werden kann. + +```typescript +const greeter = getContract({ + address: greeterAddress, + abi: greeterABI, + client: { public: publicClient, wallet: walletClient }, +}) +``` + +Nachdem wir nun alle Voraussetzungen haben, können wir endlich eine [Vertragsinstanz](https://viem.sh/docs/contract/getContract) erstellen. Wir werden diese Vertragsinstanz verwenden, um mit dem On-Chain-Vertrag zu kommunizieren. + +##### Lesen von der Blockchain + +```typescript +console.log(`Current greeting:`, await greeter.read.greet()) +``` + +Die Vertragsfunktionen, die schreibgeschützt sind ([`view`](https://www.tutorialspoint.com/solidity/solidity_view_functions.htm) und [`pure`](https://www.tutorialspoint.com/solidity/solidity_pure_functions.htm)), sind unter `read` verfügbar. In diesem Fall verwenden wir es für den Zugriff auf die Funktion [`greet`](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=read_contract#cfae3217), die die Begrüßung zurückgibt. + +JavaScript ist single-threaded. Wenn wir also einen lang andauernden Prozess starten, müssen wir [angeben, dass wir dies asynchron tun](https://eloquentjavascript.net/11_async.html#h-XvLsfAhtsE). Der Aufruf der Blockchain, selbst für einen schreibgeschützten Vorgang, erfordert einen Round-Trip zwischen dem Computer und einem Blockchain-Knoten. Das ist der Grund, warum wir hier angeben, dass der Code auf das Ergebnis `await` (warten) muss. + +Wenn Sie daran interessiert sind, wie das funktioniert, können Sie [hier darüber lesen](https://www.w3schools.com/js/js_promise.asp), aber in der Praxis müssen Sie nur wissen, dass Sie auf die Ergebnisse `await` (warten), wenn Sie eine Operation starten, die lange dauert, und dass jede Funktion, die dies tut, als `async` deklariert werden muss. + +##### Ausstellen von Transaktionen + +```typescript +const setGreeting = async (greeting: string): Promise => { +``` + +Dies ist die Funktion, die Sie aufrufen, um eine Transaktion auszustellen, die die Begrüßung ändert. Da dies eine langwierige Operation ist, ist die Funktion als `async` deklariert. Aufgrund der internen Implementierung muss jede `async`-Funktion ein `Promise`-Objekt zurückgeben. In diesem Fall bedeutet `Promise`, dass wir nicht genau angeben, was in dem `Promise` zurückgegeben wird. + +```typescript +const txHash = await greeter.write.setGreeting([greeting]) +``` + +Das `write`-Feld der Vertragsinstanz hat alle Funktionen, die in den Blockchain-Zustand schreiben (diejenigen, die das Senden einer Transaktion erfordern), wie z. B. [`setGreeting`](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=write_contract#a4136862). Die Parameter werden, falls vorhanden, als Liste bereitgestellt, und die Funktion gibt den Hash der Transaktion zurück. + +```typescript + console.log(`Arbeite an einer Korrektur, siehe https://eth-holesky.blockscout.com/tx/${txHash}`) + + return txHash +} +``` + +Melden Sie den Hash der Transaktion (als Teil einer URL zum Block-Explorer, um ihn anzuzeigen) und geben Sie ihn zurück. + +##### Reaktion auf Ereignisse + +```typescript +greeter.watchEvent.SetGreeting({ +``` + +[Die `watchEvent`-Funktion](https://viem.sh/docs/actions/public/watchEvent) lässt Sie festlegen, dass eine Funktion ausgeführt werden soll, wenn ein Ereignis ausgegeben wird. Wenn Sie sich nur für eine Art von Ereignis interessieren (in diesem Fall `SetGreeting`), können Sie diese Syntax verwenden, um sich auf diesen Ereignistyp zu beschränken. + +```typescript + onLogs: logs => { +``` + +Die `onLogs`-Funktion wird aufgerufen, wenn Protokolleinträge vorhanden sind. In Ethereum sind „Protokoll“ und „Ereignis“ in der Regel austauschbar. + +```typescript +console.log( + `Adresse ${logs[0].args.sender} hat die Begrüßung in ${logs[0].args.greeting} geändert` +) +``` + +Es könnte mehrere Ereignisse geben, aber der Einfachheit halber kümmern wir uns nur um das erste. `logs[0].args` sind die Argumente des Ereignisses, in diesem Fall `sender` und `greeting`. + +```typescript + if (logs[0].args.sender != account.address) + setGreeting(`${account.address} besteht darauf, dass es Hallo! heißt`) + } +}) +``` + +Wenn der Absender _nicht_ dieser Server ist, verwenden Sie `setGreeting`, um die Begrüßung zu ändern. + +#### `package.json` {#package-json} + +[Diese Datei](https://github.com/qbzzt/20240715-server-component/blob/main/package.json) steuert die [Node.js](https://nodejs.org/en)-Konfiguration. Dieser Artikel erklärt nur die wichtigen Definitionen. + +```json +{ + "main": "dist/index.js", +``` + +Diese Definition gibt an, welche JavaScript-Datei ausgeführt werden soll. + +```json + "scripts": { + "start": "tsc && node dist/app.js", + }, +``` + +Die Skripte sind verschiedene Aktionen der Anwendung. In diesem Fall haben wir nur `start`, was den Server kompiliert und dann ausführt. Der `tsc`-Befehl ist Teil des `typescript`-Pakets und kompiliert TypeScript in JavaScript. Wenn Sie es manuell ausführen möchten, befindet es sich in `node_modules/.bin`. Der zweite Befehl führt den Server aus. + +```json + "type": "module", +``` + +Es gibt mehrere Arten von JavaScript-Node-Anwendungen. Der `module`-Typ ermöglicht es uns, `await` im Code der obersten Ebene zu haben, was wichtig ist, wenn Sie langsame (und daher asynchrone) Operationen durchführen. + +```json + "devDependencies": { + "@types/node": "^20.14.2", + "typescript": "^5.4.5" + }, +``` + +Dies sind Pakete, die nur für die Entwicklung benötigt werden. Hier benötigen wir `typescript`, und da wir es mit Node.js verwenden, erhalten wir auch die Typen für Node-Variablen und -Objekte, wie z. B. `process`. [Die `^`-Notation](https://github.com/npm/node-semver?tab=readme-ov-file#caret-ranges-123-025-004) bedeutet diese Version oder eine höhere Version, die keine Breaking Changes enthält. Weitere Informationen zur Bedeutung von Versionsnummern finden Sie [hier](https://semver.org). + +```json + "dependencies": { + "dotenv": "^16.4.5", + "viem": "2.14.1" + } +} +``` + +Dies sind Pakete, die zur Laufzeit benötigt werden, wenn `dist/app.js` ausgeführt wird. + +## Fazit {#conclusion} + +Der zentralisierte Server, den wir hier erstellt haben, erfüllt seine Aufgabe, nämlich als Agent für einen Benutzer zu agieren. Jeder andere, der möchte, dass die Dapp weiterhin funktioniert, und bereit ist, das Gas auszugeben, kann eine neue Instanz des Servers mit seiner eigenen Adresse ausführen. + +Dies funktioniert jedoch nur, wenn die Aktionen des zentralisierten Servers leicht überprüft werden können. Wenn der zentralisierte Server geheime Zustandsinformationen hat oder schwierige Berechnungen durchführt, ist er eine zentralisierte Entität, der Sie vertrauen müssen, um die Anwendung zu nutzen, was genau das ist, was Blockchains zu vermeiden versuchen. In einem zukünftigen Artikel plane ich zu zeigen, wie man [Zero-Knowledge-Beweise](/zero-knowledge-proofs) verwendet, um dieses Problem zu umgehen. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). diff --git a/public/content/translations/de/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md b/public/content/translations/de/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md new file mode 100644 index 00000000000..852b38deea1 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md @@ -0,0 +1,92 @@ +--- +title: Einrichtung von web3.js zur Verwendung der Ethereum-Blockchain in JavaScript +description: Erfahren Sie, wie Sie die web3.js-Bibliothek einrichten und konfigurieren, um von JavaScript-Anwendungen aus mit der Ethereum-Blockchain zu interagieren. +author: "jdourlens" +tags: [ "web3.js", "javascript" ] +skill: beginner +lang: de +published: 2020-04-11 +source: EthereumDev +sourceUrl: https://ethereumdev.io/setup-web3js-to-use-the-ethereum-blockchain-in-javascript/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +In diesem Tutorial erfahren Sie, wie Sie die ersten Schritte mit [web3.js](https://web3js.readthedocs.io/) machen, um mit der Ethereum-Blockchain zu interagieren. Web3.js kann sowohl in Frontends als auch in Backends verwendet werden, um Daten aus der Blockchain zu lesen, Transaktionen durchzuführen und sogar Smart Contracts bereitzustellen. + +Der erste Schritt ist, web3.js in Ihr Projekt einzubinden. Um es auf einer Webseite zu verwenden, können Sie die Bibliothek direkt über ein CDN wie JSDeliver importieren. + +```html + +``` + +Wenn Sie es vorziehen, die Bibliothek für die Verwendung in Ihrem Backend oder einem Frontend-Projekt mit Build-Prozess zu installieren, können Sie sie mit npm installieren: + +```bash +npm install web3 --save +``` + +Um Web3.js in ein Node.js-Skript oder ein Browserify-Frontend-Projekt zu importieren, können Sie dann die folgende JavaScript-Zeile verwenden: + +```js +const Web3 = require("web3") +``` + +Da wir die Bibliothek nun in das Projekt eingebunden haben, müssen wir sie initialisieren. Ihr Projekt muss in der Lage sein, mit der Blockchain zu kommunizieren. Die meisten Ethereum-Bibliotheken kommunizieren über RPC-Calls mit einem [Node](/developers/docs/nodes-and-clients/). Um unseren Web3-Provider zu initiieren, instanziieren wir eine Web3-Instanz und übergeben dem Konstruktor die URL des Providers. Wenn Sie einen Node oder eine [auf Ihrem Computer laufende Ganache-Instanz](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/) haben, sieht es so aus: + +```js +const web3 = new Web3("http://localhost:8545") +``` + +Wenn Sie direkt auf einen gehosteten Node zugreifen möchten, finden Sie Optionen unter [Nodes-as-a-Service](/developers/docs/nodes-and-clients/nodes-as-a-service). + +```js +const web3 = new Web3("https://cloudflare-eth.com") +``` + +Um zu testen, ob wir unsere Web3-Instanz korrekt konfiguriert haben, versuchen wir, die aktuellste Blocknummer mit der Funktion `getBlockNumber` abzurufen. Diese Funktion akzeptiert einen Callback als Parameter und gibt die Blocknummer als Integer zurück. + +```js +var Web3 = require("web3") +const web3 = new Web3("https://cloudflare-eth.com") + +web3.eth.getBlockNumber(function (error, result) { + console.log(result) +}) +``` + +Wenn Sie dieses Programm ausführen, wird einfach die aktuellste Blocknummer ausgegeben: die Spitze der Blockchain. Sie können auch `await/async`-Funktionsaufrufe verwenden, um die Verschachtelung von Callbacks in Ihrem Code zu vermeiden: + +```js +async function getBlockNumber() { + const latestBlockNumber = await web3.eth.getBlockNumber() + console.log(latestBlockNumber) + return latestBlockNumber +} + +getBlockNumber() +``` + +Sie finden alle auf der Web3-Instanz verfügbaren Funktionen in der [offiziellen web3.js-Dokumentation](https://docs.web3js.org/). + +Die meisten Web3-Bibliotheken sind asynchron, da die Bibliothek im Hintergrund JSON-RPC-Aufrufe an den Node durchführt, der das Ergebnis zurücksendet. + + + +Wenn Sie im Browser arbeiten, injizieren einige Wallets direkt eine Web3-Instanz. Sie sollten versuchen, diese wann immer möglich zu verwenden, insbesondere, wenn Sie mit der Ethereum-Adresse des Benutzers interagieren möchten, um Transaktionen durchzuführen. + +Hier ist das Snippet, um zu erkennen, ob eine MetaMask-Wallet verfügbar ist, und um sie gegebenenfalls zu aktivieren. Dies ermöglicht Ihnen später, das Guthaben des Benutzers zu lesen und es ihm zu ermöglichen, Transaktionen zu validieren, die er auf der Ethereum-Blockchain durchführen soll: + +```js +if (window.ethereum != null) { + state.web3 = new Web3(window.ethereum) + try { + // Bei Bedarf Zugriff auf das Konto anfordern + await window.ethereum.enable() + // Konten sind jetzt zugänglich + } catch (error) { + // Benutzer hat den Kontozugriff verweigert... + } +} +``` + +Es gibt Alternativen zu web3.js wie [Ethers.js](https://docs.ethers.io/), die ebenfalls häufig verwendet werden. Im nächsten Tutorial sehen wir uns an, [wie Sie einfach neue eingehende Blöcke auf der Blockchain überwachen und sehen können, was sie enthalten](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/). diff --git a/public/content/translations/de/developers/tutorials/short-abi/index.md b/public/content/translations/de/developers/tutorials/short-abi/index.md new file mode 100644 index 00000000000..7939010d55e --- /dev/null +++ b/public/content/translations/de/developers/tutorials/short-abi/index.md @@ -0,0 +1,585 @@ +--- +title: "Kurze ABIs zur Calldata-Optimierung" +description: Optimierung von Smart Contracts für Optimistic Rollups +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +lang: de +tags: [ "Layer 2" ] +skill: intermediate +published: 2022-04-01 +--- + +## Einführung {#introduction} + +In diesem Artikel erfahren Sie mehr über [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups), die Transaktionskosten auf ihnen und wie diese andere Kostenstruktur es erfordert, dass wir für andere Dinge optimieren als auf dem Ethereum-Mainnet. +Sie erfahren auch, wie Sie diese Optimierung implementieren können. + +### Vollständige Offenlegung {#full-disclosure} + +Ich bin ein Vollzeitmitarbeiter bei [Optimism](https://www.optimism.io/), daher werden die Beispiele in diesem Artikel auf Optimism ausgeführt. +Die hier erläuterte Technik sollte jedoch genauso gut für andere Rollups funktionieren. + +### Terminologie {#terminology} + +Wenn über Rollups gesprochen wird, wird der Begriff „Layer 1“ (L1) für das Mainnet, das produktive Ethereum-Netzwerk, verwendet. +Der Begriff „Layer 2“ (L2) wird für den Rollup oder jedes andere System verwendet, das für die Sicherheit auf L1 angewiesen ist, aber den größten Teil seiner Verarbeitung offchain durchführt. + +## Wie können wir die Kosten von L2-Transaktionen weiter senken? {#how-can-we-further-reduce-the-cost-of-L2-transactions} + +[Optimistic Rollups](/developers/docs/scaling/optimistic-rollups) müssen eine Aufzeichnung jeder historischen Transaktion aufbewahren, sodass jeder sie durchgehen und überprüfen kann, dass der aktuelle Zustand korrekt ist. +Der günstigste Weg, Daten in das Ethereum-Mainnet zu bekommen, ist, sie als Calldata zu schreiben. +Diese Lösung wurde sowohl von [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-) als auch von [Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups) gewählt. + +### Kosten von L2-Transaktionen {#cost-of-l2-transactions} + +Die Kosten von L2-Transaktionen setzen sich aus zwei Komponenten zusammen: + +1. L2-Verarbeitung, die in der Regel extrem günstig ist +2. L1-Speicher, der an die Gas-Kosten des Mainnets gebunden ist + +Während ich dies schreibe, betragen die Kosten für L2-Gas auf Optimism 0,001 [Gwei](/developers/docs/gas/#pre-london). +Die Kosten für L1-Gas hingegen betragen ungefähr 40 Gwei. +[Die aktuellen Preise können Sie hier einsehen](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m). + +Ein Byte Calldata kostet entweder 4 Gas (wenn es null ist) oder 16 Gas (wenn es ein anderer Wert ist). +Eine der teuersten Operationen auf der EVM ist das Schreiben in den Speicher. +Die maximalen Kosten für das Schreiben eines 32-Byte-Wortes in den Speicher auf L2 betragen 22.100 Gas. Derzeit sind das 22,1 Gwei. +Wenn wir also ein einziges Null-Byte an Calldata einsparen können, können wir etwa 200 Bytes in den Speicher schreiben und trotzdem einen Vorteil erzielen. + +### Das ABI {#the-abi} + +Die überwiegende Mehrheit der Transaktionen greift auf einen Vertrag über ein externes Konto zu. +Die meisten Verträge sind in Solidity geschrieben und interpretieren ihr Datenfeld gemäß der [Application Binary Interface (ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). + +Das ABI wurde jedoch für L1 entwickelt, wo ein Byte Calldata ungefähr so viel kostet wie vier arithmetische Operationen, und nicht für L2, wo ein Byte Calldata mehr als tausend arithmetische Operationen kostet. +Die Calldata ist wie folgt aufgeteilt: + +| Abschnitt | Länge | Bytes | Verschwendete Bytes | Verschwendetes Gas | Benötigte Bytes | Benötigtes Gas | +| ----------------- | ----: | ----: | ------------------: | -----------------: | --------------: | -------------: | +| Funktionsselektor | 4 | 0-3 | 3 | 48 | 1 | 16 | +| Nullen | 12 | 4-15 | 12 | 48 | 0 | 0 | +| Zieladresse | 20 | 16-35 | 0 | 0 | 20 | 320 | +| Betrag | 32 | 36-67 | 17 | 64 | 15 | 240 | +| Gesamt | 68 | | | 160 | | 576 | + +Erläuterung: + +- **Funktionsselektor**: Der Vertrag hat weniger als 256 Funktionen, sodass wir sie mit einem einzigen Byte unterscheiden können. + Diese Bytes sind typischerweise nicht null und kosten daher [sechzehn Gas](https://eips.ethereum.org/EIPS/eip-2028). +- **Nullen**: Diese Bytes sind immer null, weil eine 20-Byte-Adresse kein 32-Byte-Wort benötigt, um sie zu speichern. + Bytes, die null enthalten, kosten vier Gas ([siehe Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf), Anhang G, + S. 27, der Wert für `G``txdatazero`). +- **Betrag**: Wenn wir annehmen, dass in diesem Vertrag `decimals` achtzehn ist (der normale Wert) und der maximale Betrag an Tokens, den wir überweisen, 1018 sein wird, erhalten wir einen maximalen Betrag von 1036. + 25615 > 1036, also sind fünfzehn Bytes ausreichend. + +Eine Verschwendung von 160 Gas auf L1 ist normalerweise vernachlässigbar. Eine Transaktion kostet mindestens [21.000 Gas](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed), daher machen zusätzliche 0,8 % keinen Unterschied. +Auf L2 sind die Dinge jedoch anders. Fast die gesamten Kosten der Transaktion entstehen durch das Schreiben auf L1. +Zusätzlich zu den Transaktions-Calldata gibt es 109 Bytes Transaktions-Header (Zieladresse, Signatur usw.). +Die Gesamtkosten betragen daher `109*16+576+160=2480`, und wir verschwenden etwa 6,5 % davon. + +## Kosten senken, wenn Sie das Ziel nicht kontrollieren {#reducing-costs-when-you-dont-control-the-destination} + +Angenommen, Sie haben keine Kontrolle über den Zielvertrag, können Sie dennoch eine Lösung verwenden, die [dieser](https://github.com/qbzzt/ethereum.org-20220330-shortABI) ähnlich ist. +Sehen wir uns die relevanten Dateien an. + +### Token.sol {#token-sol} + +[Dies ist der Zielvertrag](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol). +Es handelt sich um einen Standard-ERC-20-Vertrag mit einer zusätzlichen Funktion. +Diese `faucet`-Funktion ermöglicht es jedem Benutzer, einige Tokens zur Verwendung zu erhalten. +Es würde einen produktiven ERC-20-Vertrag unbrauchbar machen, aber es erleichtert das Leben, wenn ein ERC-20 nur zum Testen existiert. + +```solidity + /** + * @dev Gibt dem Aufrufer 1000 Tokens zum Herumspielen + */ + function faucet() external { + _mint(msg.sender, 1000); + } // Funktion Faucet +``` + +### CalldataInterpreter.sol {#calldatainterpreter-sol} + +[Dies ist der Vertrag, den Transaktionen mit kürzeren Calldata aufrufen sollen](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol). +Gehen wir ihn Zeile für Zeile durch. + +```solidity +//SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.0; + + +import { OrisUselessToken } from "./Token.sol"; +``` + +Wir benötigen die Token-Funktion, um zu wissen, wie sie aufgerufen wird. + +```solidity +contract CalldataInterpreter { + + OrisUselessToken public immutable token; +``` + +Die Adresse des Tokens, für das wir ein Proxy sind. + +```solidity + + /** + * @dev Geben Sie die Token-Adresse an + * @param tokenAddr_ ERC-20-Vertragsadresse + */ + constructor( + address tokenAddr_ + ) { + token = OrisUselessToken(tokenAddr_); + } // Konstruktor +``` + +Die Token-Adresse ist der einzige Parameter, den wir angeben müssen. + +```solidity + function calldataVal(uint startByte, uint length) + private pure returns (uint) { +``` + +Lesen Sie einen Wert aus den Calldata. + +```solidity + uint _retVal; + + require(length < 0x21, + "calldataVal-Längenlimit beträgt 32 Bytes"); + + require(length + startByte <= msg.data.length, + "calldataVal versucht, über die Calldata-Größe hinaus zu lesen"); +``` + +Wir laden ein einzelnes 32-Byte-(256-Bit)-Wort in den Speicher und entfernen die Bytes, die nicht zu dem gewünschten Feld gehören. +Dieser Algorithmus funktioniert nicht für Werte, die länger als 32 Bytes sind, und natürlich können wir nicht über das Ende der Calldata hinaus lesen. +Auf L1 könnte es notwendig sein, diese Tests zu überspringen, um Gas zu sparen, aber auf L2 ist Gas extrem billig, was alle denkbaren Plausibilitätsprüfungen ermöglicht. + +```solidity + assembly { + _retVal := calldataload(startByte) + } +``` + +Wir hätten die Daten aus dem Aufruf von `fallback()` (siehe unten) kopieren können, aber es ist einfacher, [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html), die Assemblersprache der EVM, zu verwenden. + +Hier verwenden wir [den CALLDATALOAD-Opcode](https://www.evm.codes/#35), um die Bytes von `startByte` bis `startByte+31` in den Stack zu lesen. +Im Allgemeinen lautet die Syntax eines Opcodes in Yul `(,...).` + +```solidity + + _retVal = _retVal >> (256-length*8); +``` + +Nur die höchstwertigen `length` Bytes sind Teil des Feldes, daher verwenden wir eine [Rechtsverschiebung](https://en.wikipedia.org/wiki/Logical_shift), um die anderen Werte zu entfernen. +Dies hat den zusätzlichen Vorteil, dass der Wert nach rechts im Feld verschoben wird, sodass es der Wert selbst ist und nicht der Wert mal 256irgendwas. + +```solidity + + return _retVal; + } + + + fallback() external { +``` + +Wenn ein Aufruf an einen Solidity-Vertrag keiner der Funktionssignaturen entspricht, ruft er [die `fallback()`-Funktion](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function) auf (sofern eine vorhanden ist). +Im Fall von `CalldataInterpreter` landet _jeder_ Aufruf hier, da es keine anderen `external`- oder `public`-Funktionen gibt. + +```solidity + uint _func; + + _func = calldataVal(0, 1); +``` + +Lesen Sie das erste Byte der Calldata, das uns die Funktion mitteilt. +Es gibt zwei Gründe, warum eine Funktion hier nicht verfügbar wäre: + +1. Funktionen, die `pure` oder `view` sind, ändern den Zustand nicht und kosten kein Gas (wenn sie offchain aufgerufen werden). + Es macht keinen Sinn, ihre Gas-Kosten zu reduzieren. +2. Funktionen, die auf [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties) angewiesen sind. + Der Wert von `msg.sender` wird die Adresse von `CalldataInterpreter` sein, nicht die des Aufrufers. + +Leider, [wenn man sich die ERC-20-Spezifikationen ansieht](https://eips.ethereum.org/EIPS/eip-20), bleibt nur eine Funktion übrig, `transfer`. +Damit bleiben uns nur zwei Funktionen: `transfer` (weil wir `transferFrom` aufrufen können) und `faucet` (weil wir die Tokens an denjenigen zurücküberweisen können, der uns aufgerufen hat). + +```solidity + + // Rufen Sie die zustandsändernden Methoden von Token auf mit + // Informationen aus den Calldata + + // Faucet + if (_func == 1) { +``` + +Ein Aufruf an `faucet()`, der keine Parameter hat. + +```solidity + token.faucet(); + token.transfer(msg.sender, + token.balanceOf(address(this))); + } +``` + +Nachdem wir `token.faucet()` aufgerufen haben, erhalten wir Tokens. Als Proxy-Vertrag **benötigen** wir jedoch keine Tokens. +Das EOA (externally owned account) oder der Vertrag, der uns aufgerufen hat, schon. +Also überweisen wir alle unsere Tokens an denjenigen, der uns angerufen hat. + +```solidity + // Überweisung (angenommen, wir haben eine Freigabe dafür) + if (_func == 2) { +``` + +Das Überweisen von Tokens erfordert zwei Parameter: die Zieladresse und den Betrag. + +```solidity + token.transferFrom( + msg.sender, +``` + +Wir erlauben Anrufern nur, Tokens zu überweisen, die sie besitzen + +```solidity + address(uint160(calldataVal(1, 20))), +``` + +Die Zieladresse beginnt bei Byte #1 (Byte #0 ist die Funktion). +Als Adresse ist sie 20 Bytes lang. + +```solidity + calldataVal(21, 2) +``` + +Für diesen speziellen Vertrag gehen wir davon aus, dass die maximale Anzahl von Tokens, die jemand überweisen möchte, in zwei Bytes passt (weniger als 65.536). + +```solidity + ); + } +``` + +Insgesamt benötigt eine Überweisung 35 Bytes an Calldata: + +| Abschnitt | Länge | Bytes | +| ----------------- | ----: | ----: | +| Funktionsselektor | 1 | 0 | +| Zieladresse | 32 | 1-32 | +| Betrag | 2 | 33-34 | + +```solidity + } // Fallback + +} // Vertrag CalldataInterpreter +``` + +### test.js {#test-js} + +[Dieser JavaScript-Unit-Test](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js) zeigt uns, wie dieser Mechanismus verwendet wird (und wie man seine korrekte Funktionsweise überprüft). +Ich gehe davon aus, dass Sie [chai](https://www.chaijs.com/) und [ethers](https://docs.ethers.io/v5/) verstehen und erkläre nur die Teile, die sich speziell auf den Vertrag beziehen. + +```js +const { expect } = require("chai"); + +describe("CalldataInterpreter", function () { + it("Sollte uns die Verwendung von Tokens ermöglichen", async function () { + const Token = await ethers.getContractFactory("OrisUselessToken") + const token = await Token.deploy() + await token.deployed() + console.log("Token-Adresse:", token.address) + + const Cdi = await ethers.getContractFactory("CalldataInterpreter") + const cdi = await Cdi.deploy(token.address) + await cdi.deployed() + console.log("CalldataInterpreter-Adresse:", cdi.address) + + const signer = await ethers.getSigner() +``` + +Wir beginnen mit der Bereitstellung beider Verträge. + +```javascript + // Holen Sie sich Tokens zum Herumspielen + const faucetTx = { +``` + +Wir können nicht die übergeordneten Funktionen verwenden, die wir normalerweise verwenden würden (wie z. B. `token.faucet()`), um Transaktionen zu erstellen, da wir uns nicht an das ABI halten. +Stattdessen müssen wir die Transaktion selbst erstellen und dann senden. + +```javascript + to: cdi.address, + data: "0x01" +``` + +Es gibt zwei Parameter, die wir für die Transaktion angeben müssen: + +1. `to`, die Zieladresse. + Dies ist der Calldata-Interpreter-Vertrag. +2. `data`, die zu sendenden Calldata. + Im Falle eines Faucet-Aufrufs bestehen die Daten aus einem einzigen Byte, `0x01`. + +```javascript + + } + await (await signer.sendTransaction(faucetTx)).wait() +``` + +Wir rufen die `sendTransaction`-Methode [des Signierers](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction) auf, da wir das Ziel (`faucetTx.to`) bereits angegeben haben und die Transaktion signiert werden muss. + +```javascript +// Überprüfen Sie, ob der Faucet die Tokens korrekt bereitstellt +expect(await token.balanceOf(signer.address)).to.equal(1000) +``` + +Hier überprüfen wir den Kontostand. +Bei `view`-Funktionen muss kein Gas gespart werden, daher führen wir sie ganz normal aus. + +```javascript +// Dem CDI eine Freigabe erteilen (Freigaben können nicht über einen Proxy geleitet werden) +const approveTX = await token.approve(cdi.address, 10000) +await approveTX.wait() +expect(await token.allowance(signer.address, cdi.address)).to.equal(10000) +``` + +Geben Sie dem Calldata-Interpreter eine Freigabe, um Überweisungen durchführen zu können. + +```javascript +// Tokens überweisen +const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" +const transferTx = { + to: cdi.address, + data: "0x02" + destAddr.slice(2, 42) + "0100", +} +``` + +Erstellen Sie eine Überweisungstransaktion. Das erste Byte ist „0x02“, gefolgt von der Zieladresse und schließlich dem Betrag (0x0100, was dezimal 256 entspricht). + +```javascript + await (await signer.sendTransaction(transferTx)).wait() + + // Überprüfen, ob wir 256 Tokens weniger haben + expect (await token.balanceOf(signer.address)).to.equal(1000-256) + + // Und dass unser Ziel sie erhalten hat + expect (await token.balanceOf(destAddr)).to.equal(256) + }) // es +}) // beschreiben +``` + +## Kostenreduzierung, wenn Sie den Zielvertrag kontrollieren {#reducing-the-cost-when-you-do-control-the-destination-contract} + +Wenn Sie die Kontrolle über den Zielvertrag haben, können Sie Funktionen erstellen, die die `msg.sender`-Prüfungen umgehen, da sie dem Calldata-Interpreter vertrauen. +[Ein Beispiel dafür, wie das funktioniert, finden Sie hier im `control-contract`-Branch](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract). + +Wenn der Vertrag nur auf externe Transaktionen reagieren würde, könnten wir mit nur einem Vertrag auskommen. +Dies würde jedoch die [Komponierbarkeit](/developers/docs/smart-contracts/composability/) beeinträchtigen. +Es ist viel besser, einen Vertrag zu haben, der auf normale ERC-20-Aufrufe reagiert, und einen anderen Vertrag, der auf Transaktionen mit kurzen Anrufdaten reagiert. + +### Token.sol {#token-sol-2} + +In diesem Beispiel können wir `Token.sol` modifizieren. +Dies ermöglicht uns, eine Reihe von Funktionen zu haben, die nur der Proxy aufrufen darf. +Hier sind die neuen Teile: + +```solidity + // Die einzige Adresse, die die CalldataInterpreter-Adresse angeben darf + address owner; + + // Die CalldataInterpreter-Adresse + address proxy = address(0); +``` + +Der ERC-20-Vertrag muss die Identität des autorisierten Proxys kennen. +Wir können diese Variable jedoch nicht im Konstruktor festlegen, da wir den Wert noch nicht kennen. +Dieser Vertrag wird zuerst instanziiert, da der Proxy die Adresse des Tokens in seinem Konstruktor erwartet. + +```solidity + /** + * @dev Ruft den ERC20-Konstruktor auf. + */ + constructor( + ) ERC20("Oris nutzloser Token-2", "OUT-2") { + owner = msg.sender; + } +``` + +Die Adresse des Erstellers (genannt `owner`) wird hier gespeichert, da dies die einzige Adresse ist, die den Proxy festlegen darf. + +```solidity + /** + * @dev Legt die Adresse für den Proxy (den CalldataInterpreter) fest. + * Kann nur einmal vom Eigentümer aufgerufen werden + */ + function setProxy(address _proxy) external { + require(msg.sender == owner, "Kann nur vom Eigentümer aufgerufen werden"); + require(proxy == address(0), "Proxy ist bereits festgelegt"); + + proxy = _proxy; + } // Funktion setProxy +``` + +Der Proxy hat privilegierten Zugriff, da er Sicherheitsprüfungen umgehen kann. +Um sicherzustellen, dass wir dem Proxy vertrauen können, lassen wir nur `owner` diese Funktion aufrufen, und das nur einmal. +Sobald `proxy` einen echten Wert hat (nicht null), kann dieser Wert nicht mehr geändert werden. Selbst wenn der Besitzer bösartig wird oder die Mnemonik dafür bekannt wird, sind wir immer noch sicher. + +```solidity + /** + * @dev Einige Funktionen dürfen nur vom Proxy aufgerufen werden. + */ + modifier onlyProxy { +``` + +Dies ist eine [`modifier`-Funktion](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm), sie modifiziert die Funktionsweise anderer Funktionen. + +```solidity + require(msg.sender == proxy); +``` + +Überprüfen Sie zuerst, ob wir vom Proxy und von niemand anderem aufgerufen wurden. +Wenn nicht, `revert`. + +```solidity + _; + } +``` + +Wenn ja, führen Sie die Funktion aus, die wir ändern. + +```solidity + /* Funktionen, die es dem Proxy ermöglichen, tatsächlich für Konten zu fungieren */ + + function transferProxy(address from, address to, uint256 amount) + public virtual onlyProxy() returns (bool) + { + _transfer(from, to, amount); + return true; + } + + function approveProxy(address from, address spender, uint256 amount) + public virtual onlyProxy() returns (bool) + { + _approve(from, spender, amount); + return true; + } + + function transferFromProxy( + address spender, + address from, + address to, + uint256 amount + ) public virtual onlyProxy() returns (bool) + { + _spendAllowance(from, spender, amount); + _transfer(from, to, amount); + return true; + } +``` + +Dies sind drei Operationen, bei denen die Nachricht normalerweise direkt von der Entität kommen muss, die Tokens überweist oder eine Freigabe genehmigt. +Hier haben wir eine Proxy-Version dieser Operationen, die: + +1. durch `onlyProxy()` modifiziert ist, sodass niemand anderes sie kontrollieren darf. +2. die Adresse, die normalerweise `msg.sender` wäre, als zusätzlichen Parameter erhält. + +### CalldataInterpreter.sol {#calldatainterpreter-sol-2} + +Der Calldata-Interpreter ist fast identisch mit dem oben genannten, außer dass die über den Proxy geleiteten Funktionen einen `msg.sender`-Parameter erhalten und keine Freigabe für `transfer` erforderlich ist. + +```solidity + // Überweisung (keine Freigabe erforderlich) + if (_func == 2) { + token.transferProxy( + msg.sender, + address(uint160(calldataVal(1, 20))), + calldataVal(21, 2) + ); + } + + // genehmigen + if (_func == 3) { + token.approveProxy( + msg.sender, + address(uint160(calldataVal(1, 20))), + calldataVal(21, 2) + ); + } + + // transferFrom + if (_func == 4) { + token.transferFromProxy( + msg.sender, + address(uint160(calldataVal( 1, 20))), + address(uint160(calldataVal(21, 20))), + calldataVal(41, 2) + ); + } +``` + +### Test.js {#test-js-2} + +Es gibt einige Änderungen zwischen dem vorherigen Testcode und diesem. + +```js +const Cdi = await ethers.getContractFactory("CalldataInterpreter") +const cdi = await Cdi.deploy(token.address) +await cdi.deployed() +await token.setProxy(cdi.address) +``` + +Wir müssen dem ERC-20-Vertrag mitteilen, welchem Proxy er vertrauen soll + +```js +console.log("CalldataInterpreter-Adresse:", cdi.address) + +// Benötigen zwei Unterzeichner, um die Zulagen zu überprüfen +const signers = await ethers.getSigners() +const signer = signers[0] +const poorSigner = signers[1] +``` + +Um `approve()` und `transferFrom()` zu überprüfen, benötigen wir einen zweiten Unterzeichner. +Wir nennen ihn `poorSigner` (armer Unterzeichner), weil er keine unserer Tokens erhält (er muss natürlich ETH haben). + +```js +// Tokens überweisen +const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" +const transferTx = { + to: cdi.address, + data: "0x02" + destAddr.slice(2, 42) + "0100", +} +await (await signer.sendTransaction(transferTx)).wait() +``` + +Da der ERC-20-Vertrag dem Proxy (`cdi`) vertraut, benötigen wir keine Freigabe für die Weiterleitung von Überweisungen. + +```js +// Freigabe und transferFrom +const approveTx = { + to: cdi.address, + data: "0x03" + poorSigner.address.slice(2, 42) + "00FF", +} +await (await signer.sendTransaction(approveTx)).wait() + +const destAddr2 = "0xE1165C689C0c3e9642cA7606F5287e708d846206" + +const transferFromTx = { + to: cdi.address, + data: "0x04" + signer.address.slice(2, 42) + destAddr2.slice(2, 42) + "00FF", +} +await (await poorSigner.sendTransaction(transferFromTx)).wait() + +// Überprüfen, ob die Kombination aus Freigabe und transferFrom korrekt ausgeführt wurde +expect(await token.balanceOf(destAddr2)).to.equal(255) +``` + +Testen Sie die beiden neuen Funktionen. +Beachten Sie, dass `transferFromTx` zwei Adressparameter erfordert: den Geber der Freigabe und den Empfänger. + +## Fazit {#conclusion} + +Sowohl [Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) als auch [Arbitrum](https://developer.offchainlabs.com/docs/special_features) suchen nach Wegen, die Größe der auf L1 geschriebenen Calldata und damit die Kosten von Transaktionen zu reduzieren. +Als Infrastrukturanbieter, die nach generischen Lösungen suchen, sind unsere Möglichkeiten jedoch begrenzt. +Als Dapp-Entwickler verfügen Sie über anwendungsspezifisches Wissen, mit dem Sie Ihre Calldata viel besser optimieren können, als wir es in einer generischen Lösung könnten. +Hoffentlich hilft Ihnen dieser Artikel, die ideale Lösung für Ihre Bedürfnisse zu finden. + +[Hier finden Sie mehr von meiner Arbeit](https://cryptodocguy.pro/). + diff --git a/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md new file mode 100644 index 00000000000..c54e39a3bd8 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md @@ -0,0 +1,91 @@ +--- +title: Smart-Contract-Sicherheitsrichtlinien +description: Eine Checkliste der Sicherheitsrichtlinien, die beim Erstellen Ihrer dapp berücksichtigt werden sollen +author: "Spuren von bits" +tags: [ "solidity", "Smart Contracts", "Sicherheit" ] +skill: intermediate +lang: de +published: 06.09.2020 +source: Aufbau sicherer Verträge +sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md +--- + +Befolgen Sie diese High-Level Empfehlungen, um sicherere Smart Contracts zu schreiben. + +## Design-Richtlinien {#design-guidelines} + +Bevor Code geschrieben wird, sollte die Gestaltung des Smart Contracts sollte diskutiert werden. + +### Dokumentation und Spezifikationen {#documentation-and-specifications} + +Dokumentationen können auf verschiedenen Ebenen geschrieben werden und sollten bei der Umsetzung von Contracts aktualisiert werden: + +- **Eine einfache englische Beschreibung des Systems**, die beschreibt, was die Verträge tun und welche Annahmen bezüglich der Codebasis getroffen werden. +- **Schema- und Architekturdiagramme**, einschließlich der Vertragsinteraktionen und der Zustandsmaschine des Systems. [Slither-Printers](https://github.com/crytic/slither/wiki/Printer-documentation) können helfen, diese Schemata zu generieren. +- **Eine gründliche Code-Dokumentation**, für die in Solidity das [Natspec-Format](https://docs.soliditylang.org/en/develop/natspec-format.html) verwendet werden kann. + +### On-Chain- vs. Off-Chain-Berechnungen {#onchain-vs-offchain-computation} + +- **Halten Sie so viel Code wie möglich Off-Chain.** Halten Sie die On-Chain-Ebene klein. Verarbeiten Sie Daten mit Code Off-Chain so vor, dass die Verifizierung On-Chain einfach ist. Brauchst du eine sortierte Liste? Sortieren Sie die Liste off-chain, um anschließend nur noch nie Reihenfolge on-chain zu überprüfen. + +### Upgrade-Fähigkeit {#upgradeability} + +Wir haben die verschiedenen Lösungen zur Upgrade-Fähigkeit in [unserem Blogbeitrag](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/) diskutiert. Entscheiden Sie sich bewusst für oder gegen die Erweiterbarkeit Ihres Codes. Diese Entscheidung wird beeinflussen, wie Sie Ihren Code strukturieren. Generell empfehlen wir: + +- **Bevorzugen Sie die [Vertragsmigration](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) gegenüber der Upgrade-Fähigkeit.** Migrationssysteme haben viele der gleichen Vorteile wie upgrade-fähige Systeme, aber nicht deren Nachteile. +- **Verwenden Sie das Datentrennungsmuster anstelle des delegatecallproxy-Musters.** Wenn Ihr Projekt eine klare Trennung der Abstraktionsebenen aufweist, erfordert die Upgrade-Fähigkeit mittels Datentrennung nur wenige Anpassungen. Das delegatecallproxy Muster ist sehr fehleranfällig, da EVM Expertise gefragt ist. +- **Dokumentieren Sie das Migrations-/Upgrade-Verfahren vor dem Deployment.** Wenn Sie unter Stress ohne Richtlinien reagieren müssen, machen Sie Fehler. Schreiben Sie die Aktualisierungsrichtlinien also rechtzeitig. Es sollte berücksichtig werden: + - Aufrufe welche die neuen Smart Contracts initialisieren + - Speicherort der Schlüssel und wie auf sie zugegriffen werden kann + - Wie die Bereitstellung überprüft werden kann! Entwickeln und testen Sie ein Post-Bereitstellungs-Skript. + +## Implementierungsrichtlinien {#implementation-guidelines} + +**Streben Sie nach Einfachheit.** Verwenden Sie immer die einfachste Lösung, die Ihren Zweck erfüllt. Jedes Mitglied Ihres Teams sollte Ihre Lösung verstehen können. + +### Funktionskomposition {#function-composition} + +Die Architektur Ihrer Codebasis sollte eine einfache Überprüfung Ihres Codes ermöglichen. Vermeiden Sie Architekturentscheidungen, die es erschweren, die Korrektheit nachzuvollziehen. + +- **Teilen Sie die Logik Ihres Systems auf**, entweder durch mehrere Verträge oder durch die Gruppierung ähnlicher Funktionen (z. B. Authentifizierung, Arithmetik, ...). +- **Schreiben Sie kleine Funktionen mit einem klaren Zweck.** Dies erleichtert die Überprüfung und ermöglicht das Testen einzelner Komponenten. + +### Vererbung {#inheritance} + +- **Halten Sie die Vererbung überschaubar.** Vererbung sollte zur Aufteilung der Logik verwendet werden, Ihr Projekt sollte jedoch darauf abzielen, die Tiefe und Breite des Vererbungsbaums zu minimieren. +- **Verwenden Sie den [Vererbungs-Printer von Slither](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph), um die Vertragshierarchie zu überprüfen.** Der Vererbungs-Printer hilft Ihnen bei der Überprüfung der Größe der Hierarchie. + +### Ereignisse {#events} + +- **Protokollieren Sie alle wichtigen Vorgänge.** Ereignisse (Events) helfen, den Vertrag während der Entwicklung zu debuggen und ihn nach der Bereitstellung zu überwachen. + +### Bekannte Fallstricke vermeiden {#avoid-known-pitfalls} + +- **Seien Sie sich der häufigsten Sicherheitsprobleme bewusst.** Es gibt viele Online-Ressourcen, um sich über häufige Probleme zu informieren, wie z. B. [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capture the Ether](https://capturetheether.com/) oder [Not so smart contracts](https://github.com/crytic/not-so-smart-contracts/). +- **Beachten Sie die Warnhinweise in der [Solidity-Dokumentation](https://docs.soliditylang.org/en/latest/).** Die Warnhinweise informieren Sie über nicht offensichtliches Verhalten der Sprache. + +### Abhängigkeiten {#dependencies} + +- **Verwenden Sie gut getestete Bibliotheken.** Das Importieren von Code aus gut getesteten Bibliotheken verringert die Wahrscheinlichkeit, dass Sie fehlerhaften Code schreiben. Wenn Sie einen ERC20-Vertrag schreiben möchten, verwenden Sie [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20). +- **Verwenden Sie einen Abhängigkeitsmanager; vermeiden Sie das Kopieren und Einfügen von Code.** Wenn Sie sich auf eine externe Quelle verlassen, müssen Sie diese mit der Originalquelle auf dem neuesten Stand halten. + +### Testen und Verifizierung {#testing-and-verification} + +- **Schreiben Sie gründliche Unit-Tests.** Eine umfangreiche Test-Suite ist entscheidend für die Entwicklung hochwertiger Software. +- **Schreiben Sie benutzerdefinierte Prüfungen und Eigenschaften für [Slither](https://github.com/crytic/slither), [Echidna](https://github.com/crytic/echidna) und [Manticore](https://github.com/trailofbits/manticore).** Automatisierte Tools helfen sicherzustellen, dass Ihr Vertrag sicher ist. Lesen Sie den Rest dieses Leitfadens, um zu erfahren, wie Sie effiziente Prüfungen und Eigenschaften schreiben. +- **Verwenden Sie [crytic.io](https://crytic.io/).** Crytic lässt sich in GitHub integrieren, bietet Zugriff auf private Slither-Detektoren und führt benutzerdefinierte Eigenschaftsprüfungen von Echidna aus. + +### Solidity {#solidity} + +- **Bevorzugen Sie Solidity 0.5 gegenüber 0.4 und 0.6.** Unserer Meinung nach ist Solidity 0.5 sicherer und verfügt über bessere integrierte Praktiken als 0.4. Solidity 0.6 hat sich für den Produktionseinsatz als zu instabil erwiesen und benötigt Zeit zur Reifung. +- **Verwenden Sie eine stabile Version zum Kompilieren; verwenden Sie die neueste Version zur Überprüfung auf Warnungen.** Stellen Sie sicher, dass Ihr Code keine gemeldeten Probleme mit der neuesten Compiler-Version aufweist. Allerdings hat Solidity einen schnellen Release-Zyklus und eine Vorgeschichte von Compiler-Bugs, daher empfehlen wir nicht die neueste Version für das Deployment (siehe Slithers [solc-Versionsempfehlung](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33)). +- **Verwenden Sie kein Inline-Assembly.** Assembly erfordert EVM-Fachwissen. Schreiben Sie keinen EVM-Code, wenn Sie das Yellow Paper nicht _gemeistert_ haben. + +## Deployment-Richtlinien {#deployment-guidelines} + +Nach Entwicklung und Bereitstellung eines Smart Contracts: + +- **Überwachen Sie Ihre Verträge.** Beobachten Sie die Protokolle und seien Sie bereit, im Falle einer Kompromittierung des Vertrags oder der Wallet zu reagieren. +- **Fügen Sie Ihre Kontaktinformationen zu [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts) hinzu.** Diese Liste hilft Dritten, Sie zu kontaktieren, wenn eine Sicherheitslücke entdeckt wird. +- **Sichern Sie die Wallets von privilegierten Benutzern.** Befolgen Sie unsere [Best Practices](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/), wenn Sie Schlüssel in Hardware-Wallets speichern. +- **Haben Sie einen Plan für die Reaktion auf Vorfälle.** Bedenken Sie, dass Ihre Smart Contracts kompromittiert werden können. Selbst wenn Ihre Verträge fehlerfrei sind, kann ein Angreifer die Kontrolle über die Schlüssel des Vertragsinhabers übernehmen. diff --git a/public/content/translations/de/developers/tutorials/stealth-addr/index.md b/public/content/translations/de/developers/tutorials/stealth-addr/index.md new file mode 100644 index 00000000000..6eea3375006 --- /dev/null +++ b/public/content/translations/de/developers/tutorials/stealth-addr/index.md @@ -0,0 +1,443 @@ +--- +title: "Verwendung von Stealth-Adressen" +description: "Stealth-Adressen ermöglichen es Benutzern, Vermögenswerte anonym zu übertragen. Nach der Lektüre dieses Artikels werden Sie in der Lage sein: zu erklären, was Stealth-Adressen sind und wie sie funktionieren, zu verstehen, wie man Stealth-Adressen so verwendet, dass die Anonymität gewahrt bleibt, und eine webbasierte Anwendung zu schreiben, die Stealth-Adressen verwendet." +author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +tags: + [ + "Stealth-Adresse", + "Privatsphäre", + "Kryptographie", + "rust", + "wasm" + ] +skill: intermediate +published: 2025-11-30 +lang: de +sidebarDepth: 3 +--- + +Sie sind Bill. Aus Gründen, auf die wir nicht näher eingehen werden, möchten Sie für die Kampagne "Alice für die Königin der Welt" spenden, und Alice soll wissen, dass Sie gespendet haben, damit sie Sie belohnt, wenn sie gewinnt. Leider ist ihr Sieg nicht garantiert. Es gibt eine konkurrierende Kampagne, "Carol für die Kaiserin des Sonnensystems". Wenn Carol gewinnt und herausfindet, dass Sie an Alice gespendet haben, werden Sie in Schwierigkeiten geraten. Sie können also nicht einfach 200 ETH von Ihrem Konto auf das von Alice überweisen. + +[ERC-5564](https://eips.ethereum.org/EIPS/eip-5564) hat die Lösung. Dieser ERC erklärt, wie [Stealth-Adressen](https://nerolation.github.io/stealth-utils) für anonyme Übertragungen verwendet werden. + +**Warnung**: Die Kryptographie hinter Stealth-Adressen ist, soweit wir wissen, solide. Es gibt jedoch potenzielle Seitenkanalangriffe. [Unten](#go-wrong), werden Sie sehen, was Sie tun können, um dieses Risiko zu verringern. + +## Wie Stealth-Adressen funktionieren {#how} + +Dieser Artikel wird versuchen, Stealth-Adressen auf zwei Arten zu erklären. Die erste ist, [wie man sie benutzt](#how-use). Dieser Teil ist ausreichend, um den Rest des Artikels zu verstehen. Dann gibt es [eine Erklärung der dahinterstehenden Mathematik](#how-math). Wenn Sie sich für Kryptographie interessieren, lesen Sie auch diesen Teil. + +### Die einfache Version (wie man Stealth-Adressen benutzt) {#how-use} + +Alice erstellt zwei private Schlüssel und veröffentlicht die entsprechenden öffentlichen Schlüssel (die zu einer einzigen Meta-Adresse doppelter Länge kombiniert werden können). Bill erstellt ebenfalls einen privaten Schlüssel und veröffentlicht den entsprechenden öffentlichen Schlüssel. + +Mit dem öffentlichen Schlüssel einer Partei und dem privaten Schlüssel der anderen können Sie ein gemeinsames Geheimnis ableiten, das nur Alice und Bill bekannt ist (es kann nicht allein aus den öffentlichen Schlüsseln abgeleitet werden). Mit diesem gemeinsamen Geheimnis erhält Bill die Stealth-Adresse und kann Vermögenswerte an sie senden. + +Alice erhält die Adresse ebenfalls aus dem gemeinsamen Geheimnis, aber da sie die privaten Schlüssel zu den von ihr veröffentlichten öffentlichen Schlüsseln kennt, kann sie auch den privaten Schlüssel erhalten, mit dem sie von dieser Adresse abheben kann. + +### Die Mathematik (warum Stealth-Adressen so funktionieren) {#how-math} + +Standard-Stealth-Adressen verwenden [Elliptische-Kurven-Kryptographie (ECC)](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/#elliptic-curves-building-blocks-of-a-better-trapdoor), um eine bessere Leistung mit weniger Schlüsselbits zu erzielen und gleichzeitig das gleiche Sicherheitsniveau beizubehalten. Aber größtenteils können wir das ignorieren und so tun, als ob wir normale Arithmetik verwenden. + +Es gibt eine Zahl, die jeder kennt, _G_. Man kann mit _G_ multiplizieren. Aber aufgrund der Natur von ECC ist es praktisch unmöglich, durch _G_ zu teilen. Die Art und Weise, wie die Public-Key-Kryptographie im Allgemeinen in Ethereum funktioniert, ist, dass Sie einen privaten Schlüssel, _Ppriv_, verwenden können, um Transaktionen zu signieren, die dann durch einen öffentlichen Schlüssel, _Ppub = GPpriv_, verifiziert werden. + +Alice erstellt zwei private Schlüssel, _Kpriv_ und _Vpriv_. _Kpriv_ wird verwendet, um Geld von der Stealth-Adresse auszugeben, und _Vpriv_, um die Adressen anzuzeigen, die Alice gehören. Alice veröffentlicht dann die öffentlichen Schlüssel: _Kpub = GKpriv_ und _Vpub = GVpriv_ + +Bill erstellt einen dritten privaten Schlüssel, _Rpriv_, und veröffentlicht _Rpub = GRpriv_ in einem zentralen Register (Bill hätte ihn auch an Alice senden können, aber wir gehen davon aus, dass Carol zuhört). + +Bill berechnet _RprivVpub = GRprivVpriv_, von dem er erwartet, dass Alice es ebenfalls kennt (wird unten erklärt). Dieser Wert wird _S_ genannt, das gemeinsame Geheimnis. Dies gibt Bill einen öffentlichen Schlüssel, _Ppub = Kpub+G\*hash(S)_. Von diesem öffentlichen Schlüssel aus kann er eine Adresse berechnen und beliebige Ressourcen an sie senden. Wenn Alice in Zukunft gewinnt, kann Bill ihr _Rpriv_ mitteilen, um zu beweisen, dass die Ressourcen von ihm stammen. + +Alice berechnet _RpubVpriv = GRprivVpriv_. Dies gibt ihr das gleiche gemeinsame Geheimnis, _S_. Da sie den privaten Schlüssel _Kpriv_ kennt, kann sie _Ppriv = Kpriv+hash(S)_ berechnen. Dieser Schlüssel ermöglicht ihr den Zugriff auf Vermögenswerte in der Adresse, die sich aus _Ppub = GPpriv = GKpriv+G\*hash(S) = Kpub+G\*hash(S)_ ergibt. + +Wir haben einen separaten Ansichtsschlüssel, damit Alice die World Domination Campaign Services von Dave unterbeauftragen kann. Alice ist bereit, Dave die öffentlichen Adressen mitzuteilen und sie zu informieren, wenn mehr Geld verfügbar ist, aber sie möchte nicht, dass er ihr Kampagnengeld ausgibt. + +Da für das Anzeigen und Ausgeben separate Schlüssel verwendet werden, kann Alice Dave _Vpriv_ geben. Dann kann Dave _S = RpubVpriv = GRprivVpriv_ berechnen und auf diese Weise die öffentlichen Schlüssel (_Ppub = Kpub+G\*hash(S)_) erhalten. Aber ohne _Kpriv_ kann Dave den privaten Schlüssel nicht erhalten. + +Zusammenfassend sind dies die Werte, die den verschiedenen Teilnehmern bekannt sind. + +| Alice | Veröffentlicht | Bill | Dave | | +| ------------------------------------------------------------------------- | ----------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------- | +| G | G | G | G | | +| _Kpriv_ | – | – | – | | +| _Vpriv_ | – | – | _Vpriv_ | | +| _Kpub = GKpriv_ | _Kpub_ | _Kpub_ | _Kpub_ | | +| _Vpub = GVpriv_ | _Vpub_ | _Vpub_ | _Vpub_ | | +| – | – | _Rpriv_ | – | | +| _Rpub_ | _Rpub_ | _Rpub = GRpriv_ | _Rpub_ | | +| _S = RpubVpriv = GRprivVpriv_ | – | _S = RprivVpub = GRprivVpriv_ | _S = _RpubVpriv_ = GRprivVpriv_ | | +| _Ppub = Kpub+G\*hash(S)_ | – | _Ppub = Kpub+G\*hash(S)_ | _Ppub = Kpub+G\*hash(S)_ | | +| _Address=f(Ppub)_ | – | _Address=f(Ppub)_ | _Address=f(Ppub)_ | _Address=f(Ppub)_ | +| _Ppriv = Kpriv+hash(S)_ | – | – | – | | + +## Wenn bei Stealth-Adressen etwas schief geht {#go-wrong} + +_Es gibt keine Geheimnisse auf der Blockchain_. Obwohl Stealth-Adressen Ihnen Privatsphäre bieten können, ist diese Privatsphäre anfällig für Verkehrsanalyse. Um ein triviales Beispiel zu nennen: Stellen Sie sich vor, Bill finanziert eine Adresse und sendet sofort eine Transaktion, um einen _Rpub_-Wert zu veröffentlichen. Ohne Alices _Vpriv_ können wir nicht sicher sein, dass dies eine Stealth-Adresse ist, aber es ist die wahrscheinlichste Annahme. Dann sehen wir eine weitere Transaktion, die alle ETH von dieser Adresse auf die Adresse des Kampagnenfonds von Alice überträgt. Wir können es vielleicht nicht beweisen, aber es ist wahrscheinlich, dass Bill gerade an Alices Kampagne gespendet hat. Carol würde das sicher auch denken. + +Es ist einfach für Bill, die Veröffentlichung von _Rpub_ von der Finanzierung der Stealth-Adresse zu trennen (indem er sie zu verschiedenen Zeiten und von verschiedenen Adressen aus durchführt). Das ist jedoch nicht ausreichend. Das Muster, nach dem Carol sucht, ist, dass Bill eine Adresse finanziert und dann der Kampagnenfonds von Alice von ihr abhebt. + +Eine Lösung ist, dass Alices Kampagne das Geld nicht direkt abhebt, sondern es verwendet, um einen Dritten zu bezahlen. Wenn Alices Kampagne 10 ETH an Daves World Domination Campaign Services sendet, weiß Carol nur, dass Bill an einen von Daves Kunden gespendet hat. Wenn Dave genügend Kunden hat, könnte Carol nicht wissen, ob Bill an Alice gespendet hat, die mit ihr konkurriert, oder an Adam, Albert oder Abigail, die Carol egal sind. Alice kann der Zahlung einen gehashten Wert beifügen und Dave dann das Urbild zur Verfügung stellen, um zu beweisen, dass es ihre Spende war. Alternativ, wie oben erwähnt, wenn Alice Dave ihr _Vpriv_ gibt, weiß er bereits, von wem die Zahlung kam. + +Das Hauptproblem bei dieser Lösung ist, dass Alice sich um die Geheimhaltung kümmern muss, wenn diese Geheimhaltung Bill zugutekommt. Alice möchte vielleicht ihren Ruf wahren, damit auch Bills Freund Bob an sie spendet. Aber es ist auch möglich, dass es ihr nichts ausmachen würde, Bill zu entlarven, denn dann hätte er Angst davor, was passieren wird, wenn Carol gewinnt. Bill könnte Alice am Ende sogar noch mehr Unterstützung gewähren. + +### Verwendung mehrerer Stealth-Ebenen {#multi-layer} + +Anstatt sich darauf zu verlassen, dass Alice Bills Privatsphäre schützt, kann Bill dies selbst tun. Er kann mehrere Meta-Adressen für fiktive Personen, Bob und Bella, generieren. Bill sendet dann ETH an Bob, und "Bob" (der eigentlich Bill ist) sendet sie an Bella. "Bella" (ebenfalls Bill) sendet es an Alice. + +Carol kann immer noch eine Verkehrsanalyse durchführen und die Pipeline von Bill zu Bob zu Bella zu Alice sehen. Wenn "Bob" und "Bella" ETH jedoch auch für andere Zwecke verwenden, wird es nicht so aussehen, als hätte Bill etwas an Alice überwiesen, selbst wenn Alice sofort von der Stealth-Adresse auf ihre bekannte Kampagnenadresse abhebt. + +## Schreiben einer Stealth-Adressen-Anwendung {#write-app} + +Dieser Artikel erklärt eine Stealth-Adressen-Anwendung, die [auf GitHub verfügbar ist](https://github.com/qbzzt/251022-stealth-addresses.git). + +### Werkzeuge {#tools} + +Es gibt [eine TypeScript Stealth-Adressen-Bibliothek](https://github.com/ScopeLift/stealth-address-sdk), die wir verwenden könnten. Kryptographische Operationen können jedoch CPU-intensiv sein. Ich bevorzuge es, sie in einer kompilierten Sprache wie [Rust](https://rust-lang.org/) zu implementieren und [WASM](https://webassembly.org/) zu verwenden, um den Code im Browser auszuführen. + +Wir werden [Vite](https://vite.dev/) und [React](https://react.dev/) verwenden. Dies sind branchenübliche Werkzeuge; wenn Sie mit ihnen nicht vertraut sind, können Sie [dieses Tutorial](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) verwenden. Um Vite zu verwenden, benötigen wir Node. + +### Stealth-Adressen in Aktion sehen {#in-action} + +1. Installieren Sie die notwendigen Werkzeuge: [Rust](https://rust-lang.org/tools/install/) und [Node](https://nodejs.org/en/download). + +2. Klonen Sie das GitHub-Repository. + + ```sh + git clone https://github.com/qbzzt/251022-stealth-addresses.git + cd 251022-stealth-addresses + ``` + +3. Installieren Sie die Voraussetzungen und kompilieren Sie den Rust-Code. + + ```sh + cd src/rust-wasm + rustup target add wasm32-unknown-unknown + cargo install wasm-pack + wasm-pack build --target web + ``` + +4. Starten Sie den Webserver. + + ```sh + cd ../.. + npm install + npm run dev + ``` + +5. Rufen Sie [die Anwendung](http://localhost:5173/) auf. Diese Anwendungsseite hat zwei Frames: einen für Alices Benutzeroberfläche und den anderen für die von Bill. Die beiden Frames kommunizieren nicht; sie befinden sich nur aus praktischen Gründen auf derselben Seite. + +6. Klicken Sie als Alice auf **Eine Stealth-Meta-Adresse generieren**. Dadurch werden die neue Stealth-Adresse und die entsprechenden privaten Schlüssel angezeigt. Kopieren Sie die Stealth-Meta-Adresse in die Zwischenablage. + +7. Fügen Sie als Bill die neue Stealth-Meta-Adresse ein und klicken Sie auf **Eine Adresse generieren**. Dies gibt Ihnen die Adresse, die Sie für Alice finanzieren sollen. + +8. Kopieren Sie die Adresse und Bills öffentlichen Schlüssel und fügen Sie sie in den Bereich "Privater Schlüssel für von Bill generierte Adresse" in Alices Benutzeroberfläche ein. Sobald diese Felder ausgefüllt sind, sehen Sie den privaten Schlüssel für den Zugriff auf Vermögenswerte unter dieser Adresse. + +9. Sie können [einen Online-Rechner](https://iancoleman.net/ethereum-private-key-to-address/) verwenden, um sicherzustellen, dass der private Schlüssel mit der Adresse übereinstimmt. + +### Wie das Programm funktioniert {#how-the-program-works} + +#### Die WASM-Komponente {#wasm} + +Der Quellcode, der zu WASM kompiliert wird, ist in [Rust](https://rust-lang.org/) geschrieben. Sie können es in [`src/rust_wasm/src/lib.rs`](https://github.com/qbzzt/251022-stealth-addresses/blob/main/src/rust-wasm/src/lib.rs) sehen. Dieser Code ist in erster Linie eine Schnittstelle zwischen dem JavaScript-Code und [der `eth-stealth-addresses`-Bibliothek](https://github.com/kassandraoftroy/eth-stealth-addresses). + +**`Cargo.toml`** + +[`Cargo.toml`](https://doc.rust-lang.org/cargo/reference/manifest.html) in Rust ist analog zu [`package.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json) in JavaScript. Es enthält Paketinformationen, Abhängigkeitsdeklarationen usw. + +```toml +[package] +name = "rust-wasm" +version = "0.1.0" +edition = "2024" + +[dependencies] +eth-stealth-addresses = "0.1.0" +hex = "0.4.3" +wasm-bindgen = "0.2.104" +getrandom = { version = "0.2", features = ["js"] } +``` + +Das [`getrandom`](https://docs.rs/getrandom/latest/getrandom/)-Paket muss Zufallswerte generieren. Dies kann nicht durch rein algorithmische Mittel geschehen; es erfordert den Zugriff auf einen physikalischen Prozess als Quelle der Entropie. Diese Definition legt fest, dass wir diese Entropie erhalten, indem wir den Browser abfragen, in dem wir laufen. + +```toml +console_error_panic_hook = "0.1.7" +``` + +[Diese Bibliothek](https://docs.rs/console_error_panic_hook/latest/console_error_panic_hook/) gibt uns aussagekräftigere Fehlermeldungen, wenn der WASM-Code in Panik gerät und nicht fortfahren kann. + +```toml +[lib] +crate-type = ["cdylib", "rlib"] +``` + +Der Ausgabetyp, der zur Erzeugung von WASM-Code erforderlich ist. + +**`lib.rs`** + +Das ist der eigentliche Rust-Code. + +```rust +use wasm_bindgen::prelude::*; +``` + +Die Definitionen zum Erstellen eines WASM-Pakets aus Rust. Sie sind [hier](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/index.html) dokumentiert. + +```rust +use eth_stealth_addresses::{ + generate_stealth_meta_address, + generate_stealth_address, + compute_stealth_key +}; +``` + +Die Funktionen, die wir aus [der `eth-stealth-addresses`-Bibliothek](https://github.com/kassandraoftroy/eth-stealth-addresses) benötigen. + +```rust +use hex::{decode,encode}; +``` + +Rust verwendet normalerweise Byte-[Arrays](https://doc.rust-lang.org/std/primitive.array.html) (`[u8; ]`) für Werte. Aber in JavaScript verwenden wir normalerweise hexadezimale Zeichenketten. [Die `hex`-Bibliothek](https://docs.rs/hex/latest/hex/) übersetzt für uns von einer Darstellung in die andere. + +```rust +#[wasm_bindgen] +``` + +Generieren Sie WASM-Bindungen, um diese Funktion von JavaScript aus aufrufen zu können. + +```rust +pub fn wasm_generate_stealth_meta_address() -> String { +``` + +Der einfachste Weg, ein Objekt mit mehreren Feldern zurückzugeben, ist die Rückgabe einer JSON-Zeichenkette. + +```rust + let (address, spend_private_key, view_private_key) = + generate_stealth_meta_address(); +``` + +Die [`generate_stealth_meta_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_meta_address.html) gibt drei Felder zurück: + +- Die Meta-Adresse (_Kpub_ und _Vpub_) +- Der private Ansichtsschlüssel (_Vpriv_) +- Der private Ausgabenschlüssel (_Kpriv_) + +Die [Tupel](https://doc.rust-lang.org/std/primitive.tuple.html)-Syntax lässt uns diese Werte wieder trennen. + +```rust + format!("{{\"address\":\"{}\",\"view_private_key\":\"{}\",\"spend_private_key\":\"{}\"}}", + encode(address), + encode(view_private_key), + encode(spend_private_key) + ) +} +``` + +Verwenden Sie das [`format!`](https://doc.rust-lang.org/std/fmt/index.html)-Makro, um die JSON-kodierte Zeichenkette zu generieren. Verwenden Sie [`hex::encode`](https://docs.rs/hex/latest/hex/fn.encode.html), um die Arrays in Hex-Strings zu ändern. + +```rust +fn str_to_array(s: &str) -> Option<[u8; N]> { +``` + +Diese Funktion wandelt eine Hex-Zeichenkette (von JavaScript bereitgestellt) in ein Byte-Array um. Wir verwenden sie, um Werte zu parsen, die vom JavaScript-Code bereitgestellt werden. Diese Funktion ist kompliziert, weil Rust mit Arrays und Vektoren umgeht. + +Der Ausdruck `` wird als [Generic](https://doc.rust-lang.org/book/ch10-01-syntax.html) bezeichnet. `N` ist ein Parameter, der die Länge des zurückgegebenen Arrays steuert. Die Funktion wird eigentlich `str_to_array::` genannt, wobei `n` die Array-Länge ist. + +Der Rückgabewert ist `Option<[u8; N]>`, was bedeutet, dass das zurückgegebene Array [optional](https://doc.rust-lang.org/std/option/) ist. Dies ist ein typisches Muster in Rust für Funktionen, die fehlschlagen können. + +Wenn wir zum Beispiel `str_to_array::10("bad060a7")` aufrufen, soll die Funktion ein Array mit zehn Werten zurückgeben, aber die Eingabe besteht nur aus vier Bytes. Die Funktion muss fehlschlagen, und das tut sie, indem sie `None` zurückgibt. Der Rückgabewert für `str_to_array::4("bad060a7")` wäre `Some<[0xba, 0xd0, 0x60, 0xa7]>`. + +```rust + // decode returns Result, _> + let vec = decode(s).ok()?; +``` + +Die [`hex::decode`](https://docs.rs/hex/latest/hex/fn.decode.html)-Funktion gibt ein `Result, FromHexError>` zurück. Der Typ [`Result`](https://doc.rust-lang.org/std/result/) kann entweder ein erfolgreiches Ergebnis (`Ok(value)`) oder einen Fehler (`Err(error)`) enthalten. + +Die `.ok()`-Methode wandelt das `Result` in eine `Option` um, deren Wert entweder der `Ok()`-Wert ist, wenn erfolgreich, oder `None`, wenn nicht. Schließlich bricht der [Fragezeichen-Operator](https://doc.rust-lang.org/std/option/#the-question-mark-operator-) die aktuelle Funktion ab und gibt ein `None` zurück, wenn die `Option` leer ist. Andernfalls entpackt er den Wert und gibt diesen zurück (in diesem Fall, um `vec` einen Wert zuzuweisen). + +Dies sieht nach einer seltsam verschlungenen Methode zur Fehlerbehandlung aus, aber `Result` und `Option` stellen sicher, dass alle Fehler auf die eine oder andere Weise behandelt werden. + +```rust + if vec.len() != N { return None; } +``` + +Wenn die Anzahl der Bytes falsch ist, ist das ein Fehler, und wir geben `None` zurück. + +```rust + // try_into consumes vec and attempts to make [u8; N] + let array: [u8; N] = vec.try_into().ok()?; +``` + +Rust hat zwei Array-Typen. [Arrays](https://doc.rust-lang.org/std/primitive.array.html) haben eine feste Größe. [Vektoren](https://doc.rust-lang.org/std/vec/index.html) können wachsen und schrumpfen. `hex::decode` gibt einen Vektor zurück, aber die `eth_stealth_addresses`-Bibliothek möchte Arrays empfangen. [`.try_into()`](https://doc.rust-lang.org/std/convert/trait.TryInto.html#required-methods) konvertiert einen Wert in einen anderen Typ, zum Beispiel einen Vektor in ein Array. + +```rust + Some(array) +} +``` + +Rust erfordert nicht, dass Sie das Schlüsselwort [`return`](https://doc.rust-lang.org/std/keyword.return.html) verwenden, wenn Sie am Ende einer Funktion einen Wert zurückgeben. + +```rust +#[wasm_bindgen] +pub fn wasm_generate_stealth_address(stealth_address: &str) -> Option { +``` + +Diese Funktion empfängt eine öffentliche Meta-Adresse, die sowohl _Vpub_ als auch _Kpub_ enthält. Sie gibt die Stealth-Adresse, den zu veröffentlichenden öffentlichen Schlüssel (_Rpub_) und einen Ein-Byte-Scan-Wert zurück, der die Identifizierung beschleunigt, welche veröffentlichten Adressen Alice gehören könnten. + +Der Scan-Wert ist Teil des gemeinsamen Geheimnisses (_S = GRprivVpriv_). Dieser Wert steht Alice zur Verfügung, und seine Überprüfung ist viel schneller als die Überprüfung, ob _f(Kpub+G\*hash(S))_ mit der veröffentlichten Adresse übereinstimmt. + +```rust + let (address, r_pub, scan) = + generate_stealth_address(&str_to_array::<66>(stealth_address)?); +``` + +Wir verwenden [`generate_stealth_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_address.html) der Bibliothek. + +```rust + format!("{{\"address\":\"{}\",\"rPub\":\"{}\",\"scan\":\"{}\"}}", + encode(address), + encode(r_pub), + encode(&[scan]) + ).into() +} +``` + +Bereiten Sie die JSON-kodierte Ausgabezeichenkette vor. + +```rust +#[wasm_bindgen] +pub fn wasm_compute_stealth_key( + address: &str, + bill_pub_key: &str, + view_private_key: &str, + spend_private_key: &str +) -> Option { + . + . + . +} +``` + +Diese Funktion verwendet die [`compute_stealth_key`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.compute_stealth_key.html)-Funktion der Bibliothek, um den privaten Schlüssel zum Abheben von der Adresse (_Rpriv_) zu berechnen. Diese Berechnung erfordert diese Werte: + +- Die Adresse (_Address=f(Ppub)_) +- Der von Bill generierte öffentliche Schlüssel (_Rpub_) +- Der private Ansichtsschlüssel (_Vpriv_) +- Der private Ausgabenschlüssel (_Kpriv_) + +```rust +#[wasm_bindgen(start)] +``` + +[`#[wasm_bindgen(start)]`](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/on-rust-exports/start.html) legt fest, dass die Funktion ausgeführt wird, wenn der WASM-Code initialisiert wird. + +```rust +pub fn main() { + console_error_panic_hook::set_once(); +} +``` + +Dieser Code legt fest, dass die Panikausgabe an die JavaScript-Konsole gesendet wird. Um es in Aktion zu sehen, verwenden Sie die Anwendung und geben Sie Bill eine ungültige Meta-Adresse (ändern Sie einfach eine hexadezimale Ziffer). Sie werden diesen Fehler in der JavaScript-Konsole sehen: + +``` +rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/subtle-2.6.1/src/lib.rs:701:9: +assertion `left == right` failed + left: 0 + right: 1 +``` + +Gefolgt von einem Stack-Trace. Geben Sie Bill dann die gültige Meta-Adresse und Alice entweder eine ungültige Adresse oder einen ungültigen öffentlichen Schlüssel. Sie werden diesen Fehler sehen: + +``` +rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/eth-stealth-addresses-0.1.0/src/lib.rs:78:9: +keys do not generate stealth address +``` + +Wiederum gefolgt von einem Stack-Trace. + +#### Die Benutzeroberfläche {#ui} + +Die Benutzeroberfläche ist mit [React](https://react.dev/) geschrieben und wird von [Vite](https://vite.dev/) bereitgestellt. Sie können sich mit [diesem Tutorial](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) darüber informieren. Es besteht hier keine Notwendigkeit für [WAGMI](https://wagmi.sh/), da wir nicht direkt mit einer Blockchain oder einer Wallet interagieren. + +Der einzige nicht offensichtliche Teil der Benutzeroberfläche ist die WASM-Konnektivität. So funktioniert es. + +**`vite.config.js`** + +Diese Datei enthält [die Vite-Konfiguration](https://vite.dev/config/). + +```js +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import wasm from "vite-plugin-wasm"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), wasm()], +}) +``` + +Wir benötigen zwei Vite-Plugins: [react](https://www.npmjs.com/package/@vitejs/plugin-react) und [wasm](https://github.com/Menci/vite-plugin-wasm#readme). + +**`App.jsx`** + +Diese Datei ist die Hauptkomponente der Anwendung. Es ist ein Container, der zwei Komponenten enthält: `Alice` und `Bill`, die Benutzeroberflächen für diese Benutzer. Der für WASM relevante Teil ist der Initialisierungscode. + +```jsx +import init from './rust-wasm/pkg/rust_wasm.js' +``` + +Wenn wir [`wasm-pack`](https://rustwasm.github.io/docs/wasm-pack/) verwenden, erstellt es zwei Dateien, die wir hier verwenden: eine wasm-Datei mit dem eigentlichen Code (hier `src/rust-wasm/pkg/rust_wasm_bg.wasm`) und eine JavaScript-Datei mit den Definitionen zur Verwendung (hier `src/rust_wasm/pkg/rust_wasm.js`). Der Standardexport dieser JavaScript-Datei ist Code, der zur Initiierung von WASM ausgeführt werden muss. + +```jsx +function App() { + . + . + . + useEffect(() => { + const loadWasm = async () => { + try { + await init(); + setWasmReady(true) + } catch (err) { + console.error('Error loading wasm:', err) + alert("Wasm error: " + err) + } + } + + loadWasm() + }, [] + ) +``` + +Der [`useEffect`-Hook](https://react.dev/reference/react/useEffect) ermöglicht es Ihnen, eine Funktion anzugeben, die ausgeführt wird, wenn sich Zustandsvariablen ändern. Hier ist die Liste der Zustandsvariablen leer (`[]`), sodass diese Funktion nur einmal ausgeführt wird, wenn die Seite geladen wird. + +Die Effektfunktion muss sofort zurückkehren. Um asynchronen Code wie das WASM-`init` zu verwenden (das die `.wasm`-Datei laden muss und daher Zeit benötigt), definieren wir eine interne [`async`](https://en.wikipedia.org/wiki/Async/await)-Funktion und führen sie ohne `await` aus. + +**`Bill.jsx`** + +Dies ist die Benutzeroberfläche für Bill. Es hat eine einzige Aktion, das Erstellen einer Adresse basierend auf der von Alice bereitgestellten Stealth-Meta-Adresse. + +```jsx +import { wasm_generate_stealth_address } from './rust-wasm/pkg/rust_wasm.js' +``` + +Zusätzlich zum Standardexport exportiert der von `wasm-pack` generierte JavaScript-Code eine Funktion für jede Funktion im WASM-Code. + +```jsx + - - + + + ) ``` diff --git a/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md index e021dee6f14..07e9a34ef7d 100644 --- a/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/de/developers/tutorials/hello-world-smart-contract/index.md @@ -1,6 +1,6 @@ --- -title: Hello World-Smart Contract für Einsteiger -description: Einführungstutorial zum Schreiben und Bereitstellen eines einfachen Smart Contracts auf Ethereum. +title: "Hello World-Smart Contract für Einsteiger" +description: "Einführungstutorial zum Schreiben und Bereitstellen eines einfachen Smart Contracts auf Ethereum." author: "elanh" tags: [ diff --git a/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md index e411d70a1ee..56823c7ccb3 100644 --- a/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-mint-an-nft/index.md @@ -1,6 +1,6 @@ --- -title: Wie man einen NFT prägt (Teil 2/3 der NFT-Tutorial-Reihe) -description: In diesem Tutorial wird beschrieben, wie Sie einen NFT auf der Ethereum-Blockchain mit unserem Smart Contract und Web3 prägen können. +title: "Wie man einen NFT prägt (Teil 2/3 der NFT-Tutorial-Reihe)" +description: "In diesem Tutorial wird beschrieben, wie Sie einen NFT auf der Ethereum-Blockchain mit unserem Smart Contract und Web3 prägen können." author: "Sumi Mudgil" tags: [ diff --git a/public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md b/public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md index 20da987ce84..40d6220d0cb 100644 --- a/public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md @@ -1,6 +1,6 @@ --- -title: So simulieren Sie Solidity Smart Contracts für Testzwecke -description: Warum Sie sich beim Testen über Ihre Verträge lustig machen sollten +title: "So simulieren Sie Solidity Smart Contracts für Testzwecke" +description: "Warum Sie sich beim Testen über Ihre Verträge lustig machen sollten" author: Markus Waas lang: de tags: diff --git a/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md index c8af715fb23..896d8de3017 100644 --- a/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md @@ -13,7 +13,7 @@ tags: ] skill: advanced published: 2020-04-10 -source: Aufbau sicherer Verträge +source: "Aufbau sicherer Verträge" sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna --- diff --git a/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md index 642a506ae7c..8b0e2a7c02c 100644 --- a/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md @@ -13,7 +13,7 @@ tags: ] skill: advanced published: 13.01.2020 -source: Aufbau sicherer Verträge +source: "Aufbau sicherer Verträge" sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore --- diff --git a/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md index acd355d4efd..fa79c810ead 100644 --- a/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md @@ -12,7 +12,7 @@ tags: ] skill: advanced published: 2020-06-09 -source: Aufbau sicherer Verträge +source: "Aufbau sicherer Verträge" sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither --- diff --git a/public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md index 20b64b9aa74..e01437df73b 100644 --- a/public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md @@ -1,6 +1,6 @@ --- title: Wie Sie Tellor als Ihr Orakel einrichten -description: Eine Anleitung für den Einstieg in die Integration des Tellor-Orakels in Ihr Protokoll +description: "Eine Anleitung für den Einstieg in die Integration des Tellor-Orakels in Ihr Protokoll" author: "Tellor" lang: de tags: [ "solidity", "intelligente Verträge", "Orakel" ] diff --git a/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md b/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md index 562d5176e24..343d763a224 100644 --- a/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-view-nft-in-metamask/index.md @@ -1,6 +1,6 @@ --- title: So zeigen Sie Ihr NFT in Ihrem Wallet an (Teil 3/3 der NFT-Tutorialreihe) -description: Dieses Tutorial beschreibt, wie Sie ein bestehendes NFT auf MetaMask anzeigen können! +description: "Dieses Tutorial beschreibt, wie Sie ein bestehendes NFT auf MetaMask anzeigen können!" author: "Sumi Mudgil" tags: [ "ERC-721", "Alchemy", "Solidity" ] skill: beginner diff --git a/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index a96b1825106..df5a6043ea3 100644 --- a/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -1,6 +1,6 @@ --- -title: So erstellen und veröffentlichen Sie einen NFT (Teil 1/3 der NFT-Tutorial-Reihe) -description: Dieses Tutorial ist Teil 1 einer Serie über NFTs, die Ihnen Schritt für Schritt zeigt, wie Sie einen Non Fungible Token (ERC-721 Token) Smart Contract mit Ethereum und Inter Planetary File System (IPFS) erstellen und veröffentlichen. +title: "So erstellen und veröffentlichen Sie einen NFT (Teil 1/3 der NFT-Tutorial-Reihe)" +description: "Dieses Tutorial ist Teil 1 einer Serie über NFTs, die Ihnen Schritt für Schritt zeigt, wie Sie einen Non Fungible Token (ERC-721 Token) Smart Contract mit Ethereum und Inter Planetary File System (IPFS) erstellen und veröffentlichen." author: "Sumi Mudgil" tags: [ "ERC-721", "Alchemy", "Solidity", "Smart Contracts" ] skill: beginner diff --git a/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md b/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md index b82d4d482d6..5a4a3c04c34 100644 --- a/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md +++ b/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md @@ -1,6 +1,6 @@ --- -title: IPFS für dezentralisierte Benutzeroberflächen -description: Dieses Tutorial zeigt dem Leser, wie man IPFS nutzt, um die Benutzeroberfläche für eine Dapp zu speichern. Obwohl die Daten und die Geschäftslogik der Anwendung dezentralisiert sind, könnten Benutzer ohne eine zensurresistente Benutzeroberfläche trotzdem den Zugriff darauf verlieren. +title: "IPFS für dezentralisierte Benutzeroberflächen" +description: "Dieses Tutorial zeigt dem Leser, wie man IPFS nutzt, um die Benutzeroberfläche für eine Dapp zu speichern. Obwohl die Daten und die Geschäftslogik der Anwendung dezentralisiert sind, könnten Benutzer ohne eine zensurresistente Benutzeroberfläche trotzdem den Zugriff darauf verlieren." author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide tags: [ "ipfs" ] skill: beginner diff --git a/public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index e9232251e92..21e45c2af6c 100644 --- a/public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/de/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -1,6 +1,6 @@ --- title: Starte deine Dapp-Frontend-Entwicklung mit create-eth-app -description: Ein Überblick über die Verwendung und Funktionen von create-eth-app +description: "Ein Überblick über die Verwendung und Funktionen von create-eth-app" author: "Markus Waas" tags: [ diff --git a/public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md b/public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md index 8872be138ea..46a59320013 100644 --- a/public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md +++ b/public/content/translations/de/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md @@ -1,6 +1,6 @@ --- title: Grundlegende Ethereum-Themen mit SQL lernen -description: Dieses Tutorial hilft Lesern, grundlegende Ethereum-Konzepte wie Transaktionen, Blöcke und Gas zu verstehen, indem sie On-Chain-Daten mit der Structured Query Language (SQL) abfragen. +description: "Dieses Tutorial hilft Lesern, grundlegende Ethereum-Konzepte wie Transaktionen, Blöcke und Gas zu verstehen, indem sie On-Chain-Daten mit der Structured Query Language (SQL) abfragen." author: "Paul Apivat" tags: [ "SQL", "Abfragen", "Transaktionen" ] skill: beginner diff --git a/public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md b/public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md index 12a4ea98838..bc37e712c09 100644 --- a/public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md +++ b/public/content/translations/de/developers/tutorials/logging-events-smart-contracts/index.md @@ -1,6 +1,6 @@ --- title: Protokollierung von Daten aus Smart Contracts mit Ereignissen -description: Eine Einführung in Smart-Contract-Ereignisse und wie Sie diese zur Datenprotokollierung verwenden können +description: "Eine Einführung in Smart-Contract-Ereignisse und wie Sie diese zur Datenprotokollierung verwenden können" author: "jdourlens" tags: [ diff --git a/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md b/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md index a592da5e65d..cfaebd49b30 100644 --- a/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md +++ b/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md @@ -1,6 +1,6 @@ --- -title: Merkle-Beweise für Offline Datenintegrität -description: Sicherstellung der Datenintegrität onchain für Daten, die größtenteils offchain gespeichert sind +title: "Merkle-Beweise für Offline Datenintegrität" +description: "Sicherstellung der Datenintegrität onchain für Daten, die größtenteils offchain gespeichert sind" author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide tags: [ "Speicher" ] skill: advanced @@ -232,7 +232,7 @@ Diese Funktion erzeugt einen Paar-Hash. Es ist nur die Solidity-Übersetzung des }  // MarkleProof ``` -In mathematischer Notation sieht die Verifizierung eines Merkle-Beweises so aus: `H(proof_n, H(proof_n-1, H(proof_n-2, ...` H(proof_1, H(proof_0, value))...)))\`. Dieser Code implementiert sie. +In mathematischer Notation sieht die Verifizierung eines Merkle-Beweises so aus: `H(proof_n, H(proof_n-1, H(proof_n-2, ...` H(proof_1, H(proof_0, value))...)))`. Dieser Code implementiert sie. ## Merkle-Beweise und Rollups vertragen sich nicht {#merkle-proofs-and-rollups} diff --git a/public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md b/public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md index 7f1a167d61d..eecc90e0410 100644 --- a/public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md +++ b/public/content/translations/de/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md @@ -1,6 +1,6 @@ --- -title: Überwachung von Geth mit InfluxDB und Grafana -description: Richten Sie die Überwachung für Ihren Geth-Node mit InfluxDB und Grafana ein, um die Leistung zu verfolgen und Probleme zu identifizieren. +title: "Überwachung von Geth mit InfluxDB und Grafana" +description: "Richten Sie die Überwachung für Ihren Geth-Node mit InfluxDB und Grafana ein, um die Leistung zu verfolgen und Probleme zu identifizieren." author: "Mario Havel" tags: [ "Clients", "Nodes" ] skill: intermediate diff --git a/public/content/translations/de/developers/tutorials/nft-minter/index.md b/public/content/translations/de/developers/tutorials/nft-minter/index.md index 639817b074a..0e2c455f72b 100644 --- a/public/content/translations/de/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/de/developers/tutorials/nft-minter/index.md @@ -185,7 +185,7 @@ return ( NFT minten

{status}

- + ) ``` diff --git a/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 59a7e410e1c..55f5ac6afc7 100644 --- a/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1,6 +1,6 @@ --- title: "Walkthrough zum Vertrag der Optimism-Standard-Brücke" -description: Wie funktioniert die Standard-Brücke für Optimism? Warum funktioniert sie auf diese Weise? +description: "Wie funktioniert die Standard-Brücke für Optimism? Warum funktioniert sie auf diese Weise?" author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide tags: [ "solidity", "Brücke", "Layer 2" ] skill: intermediate diff --git a/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md index b443271c60c..69721c8aada 100644 --- a/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md +++ b/public/content/translations/de/developers/tutorials/run-node-raspberry-pi/index.md @@ -1,6 +1,6 @@ --- title: Betreibe einen Ethereum-Node auf einem Raspberry Pi 4 -description: Flashe deinen Raspberry Pi 4, stecke ein Ethernet-Kabel ein, schließe die SSD-Festplatte an und schalte das Gerät ein, um den Raspberry Pi 4 in einen vollwertigen Ethereum-Node + Validator zu verwandeln +description: "Flashe deinen Raspberry Pi 4, stecke ein Ethernet-Kabel ein, schließe die SSD-Festplatte an und schalte das Gerät ein, um den Raspberry Pi 4 in einen vollwertigen Ethereum-Node + Validator zu verwandeln" author: "EthereumOnArm" tags: [ diff --git a/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md b/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md index 1f72cf3b464..7b7f86f44f4 100644 --- a/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md +++ b/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md @@ -1,6 +1,6 @@ --- title: "Einige Tricks, die von Betrugs-Tokens verwendet werden, und wie man sie erkennt" -description: In diesem Tutorial analysieren wir einen Betrugs-Token, um einige der Tricks zu sehen, die Betrüger anwenden, wie sie sie implementieren und wie wir sie erkennen können. +description: "In diesem Tutorial analysieren wir einen Betrugs-Token, um einige der Tricks zu sehen, die Betrüger anwenden, wie sie sie implementieren und wie wir sie erkennen können." author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide tags: [ diff --git a/public/content/translations/de/developers/tutorials/secret-state/index.md b/public/content/translations/de/developers/tutorials/secret-state/index.md index be7d522918b..78414174214 100644 --- a/public/content/translations/de/developers/tutorials/secret-state/index.md +++ b/public/content/translations/de/developers/tutorials/secret-state/index.md @@ -1,6 +1,6 @@ --- -title: Verwendung von Zero-Knowledge für einen geheimen Zustand -description: Onchain-Spiele sind begrenzt, da sie keine versteckten Informationen enthalten können. Nach der Lektüre dieses Tutorials ist der Leser in der Lage, Zero-Knowledge-Beweise und Serverkomponenten zu kombinieren, um verifizierbare Spiele mit einer geheimen Offchain-Zustandskomponente zu erstellen. Die Technik dafür wird durch die Erstellung eines Minesweeper-Spiels demonstriert. +title: "Verwendung von Zero-Knowledge für einen geheimen Zustand" +description: "Onchain-Spiele sind begrenzt, da sie keine versteckten Informationen enthalten können. Nach der Lektüre dieses Tutorials ist der Leser in der Lage, Zero-Knowledge-Beweise und Serverkomponenten zu kombinieren, um verifizierbare Spiele mit einer geheimen Offchain-Zustandskomponente zu erstellen. Die Technik dafür wird durch die Erstellung eines Minesweeper-Spiels demonstriert." author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide tags: [ diff --git a/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md index 8053e043a96..b54fa5d3820 100644 --- a/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md @@ -6,7 +6,7 @@ tags: [ "Smart Contracts", "Sicherheit", "Solidity" ] skill: intermediate lang: de published: 07.09.2020 -source: Aufbau sicherer Verträge +source: "Aufbau sicherer Verträge" sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md --- diff --git a/public/content/translations/de/developers/tutorials/server-components/index.md b/public/content/translations/de/developers/tutorials/server-components/index.md index 25859af76d9..b3784445bc1 100644 --- a/public/content/translations/de/developers/tutorials/server-components/index.md +++ b/public/content/translations/de/developers/tutorials/server-components/index.md @@ -1,6 +1,6 @@ --- title: "Server-Komponenten und Agenten für Web3-Apps" -description: Nach dem Lesen dieses Tutorials können Sie TypeScript-Server schreiben, die auf Ereignisse auf einer Blockchain lauschen und entsprechend mit ihren eigenen Transaktionen reagieren. Dies ermöglicht es Ihnen, zentralisierte Anwendungen zu schreiben (da der Server ein Single Point of Failure ist), die jedoch mit Web3-Entitäten interagieren können. Die gleichen Techniken können auch verwendet werden, um einen Agenten zu schreiben, der auf On-Chain-Ereignisse ohne menschliches Eingreifen reagiert. +description: "Nach dem Lesen dieses Tutorials können Sie TypeScript-Server schreiben, die auf Ereignisse auf einer Blockchain lauschen und entsprechend mit ihren eigenen Transaktionen reagieren. Dies ermöglicht es Ihnen, zentralisierte Anwendungen zu schreiben (da der Server ein Single Point of Failure ist), die jedoch mit Web3-Entitäten interagieren können. Die gleichen Techniken können auch verwendet werden, um einen Agenten zu schreiben, der auf On-Chain-Ereignisse ohne menschliches Eingreifen reagiert." author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide lang: de diff --git a/public/content/translations/de/developers/tutorials/short-abi/index.md b/public/content/translations/de/developers/tutorials/short-abi/index.md index 7939010d55e..b1a8bc3c69f 100644 --- a/public/content/translations/de/developers/tutorials/short-abi/index.md +++ b/public/content/translations/de/developers/tutorials/short-abi/index.md @@ -1,6 +1,6 @@ --- title: "Kurze ABIs zur Calldata-Optimierung" -description: Optimierung von Smart Contracts für Optimistic Rollups +description: "Optimierung von Smart Contracts für Optimistic Rollups" author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide lang: de tags: [ "Layer 2" ] diff --git a/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md index c54e39a3bd8..56c9bcb29e3 100644 --- a/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md +++ b/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md @@ -1,12 +1,12 @@ --- title: Smart-Contract-Sicherheitsrichtlinien -description: Eine Checkliste der Sicherheitsrichtlinien, die beim Erstellen Ihrer dapp berücksichtigt werden sollen +description: "Eine Checkliste der Sicherheitsrichtlinien, die beim Erstellen Ihrer dapp berücksichtigt werden sollen" author: "Spuren von bits" tags: [ "solidity", "Smart Contracts", "Sicherheit" ] skill: intermediate lang: de published: 06.09.2020 -source: Aufbau sicherer Verträge +source: "Aufbau sicherer Verträge" sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md --- diff --git a/public/content/translations/de/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/de/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 230078a08f3..aa78539e4f7 100644 --- a/public/content/translations/de/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/de/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -1,6 +1,6 @@ --- title: "The Graph: Die Behebung der Datenabfrage in Web3" -description: Eine Blockchain ist wie eine Datenbank, aber ohne SQL. Alle Daten sind vorhanden, aber es gibt keine Möglichkeit, auf sie zuzugreifen. Ich zeige Ihnen, wie Sie dies mit The Graph und GraphQL beheben können. +description: "Eine Blockchain ist wie eine Datenbank, aber ohne SQL. Alle Daten sind vorhanden, aber es gibt keine Möglichkeit, auf sie zuzugreifen. Ich zeige Ihnen, wie Sie dies mit The Graph und GraphQL beheben können." author: Markus Waas lang: de tags: diff --git a/public/content/translations/de/developers/tutorials/token-integration-checklist/index.md b/public/content/translations/de/developers/tutorials/token-integration-checklist/index.md index 988df33d2f3..c264f614f86 100644 --- a/public/content/translations/de/developers/tutorials/token-integration-checklist/index.md +++ b/public/content/translations/de/developers/tutorials/token-integration-checklist/index.md @@ -1,5 +1,5 @@ --- -title: Checkliste für die Token-Integration +title: "Checkliste für die Token-Integration" description: Eine Checkliste mit Punkten, die bei der Interaktion mit Token zu beachten sind author: "Spuren von bits" lang: de @@ -12,7 +12,7 @@ tags: ] skill: intermediate published: 13.08.2020 -source: Aufbau sicherer Verträge +source: "Aufbau sicherer Verträge" sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/token_integration.md --- diff --git a/public/content/translations/de/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md b/public/content/translations/de/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md index 9158ce84c8d..5803ab88ea2 100644 --- a/public/content/translations/de/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md +++ b/public/content/translations/de/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md @@ -1,6 +1,6 @@ --- -title: Übertragung und Genehmigung von ERC-20-Token aus einem Solidity-Smart-Contract -description: Erstellen Sie einen DEX-Smart-Contract, der ERC-20-Token-Übertragungen und -Genehmigungen mit Solidity handhabt. +title: "Übertragung und Genehmigung von ERC-20-Token aus einem Solidity-Smart-Contract" +description: "Erstellen Sie einen DEX-Smart-Contract, der ERC-20-Token-Übertragungen und -Genehmigungen mit Solidity handhabt." author: "jdourlens" tags: [ diff --git a/public/content/translations/de/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md b/public/content/translations/de/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md index 75e8e9b6bec..c3dd25d25ad 100644 --- a/public/content/translations/de/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md +++ b/public/content/translations/de/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md @@ -1,6 +1,6 @@ --- title: Den ERC-20-Token-Smart-Contract verstehen -description: Lernen Sie, wie Sie den ERC-20-Token-Standard mit einem vollständigen Solidity-Smart-Contract-Beispiel und einer Erklärung implementieren. +description: "Lernen Sie, wie Sie den ERC-20-Token-Standard mit einem vollständigen Solidity-Smart-Contract-Beispiel und einer Erklärung implementieren." author: "jdourlens" tags: [ diff --git a/public/content/translations/de/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/de/developers/tutorials/waffle-test-simple-smart-contract/index.md index 6001aab3ca5..f4f079b5062 100644 --- a/public/content/translations/de/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/translations/de/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -1,6 +1,6 @@ --- title: Testen eines einfachen Smart Contracts mit der Waffle-Bibliothek -description: Tutorial für Anfänger +description: "Tutorial für Anfänger" author: Ewa Kowalska tags: [ diff --git a/public/content/translations/de/developers/tutorials/yellow-paper-evm/index.md b/public/content/translations/de/developers/tutorials/yellow-paper-evm/index.md index 799884b082f..3111f8ebfdc 100644 --- a/public/content/translations/de/developers/tutorials/yellow-paper-evm/index.md +++ b/public/content/translations/de/developers/tutorials/yellow-paper-evm/index.md @@ -1,6 +1,6 @@ --- -title: Verständnis der EVM-Spezifikationen des Yellow Papers -description: Verständnis des Teils des Yellow Papers, den formalen Spezifikationen für Ethereum, der die Ethereum Virtual Machine (EVM) erklärt. +title: "Verständnis der EVM-Spezifikationen des Yellow Papers" +description: "Verständnis des Teils des Yellow Papers, den formalen Spezifikationen für Ethereum, der die Ethereum Virtual Machine (EVM) erklärt." author: "qbzzt" tags: [ "evm" ] skill: intermediate diff --git a/public/content/translations/de/eips/index.md b/public/content/translations/de/eips/index.md index c072c24f11b..08ea56934c3 100644 --- a/public/content/translations/de/eips/index.md +++ b/public/content/translations/de/eips/index.md @@ -1,6 +1,6 @@ --- -title: Ethereum – Vorschläge zur Verbesserung (EIPs) -description: Grundlegende Informationen, die Sie benötigen, um EIPs zu verstehen +title: "Ethereum – Vorschläge zur Verbesserung (EIPs)" +description: "Grundlegende Informationen, die Sie benötigen, um EIPs zu verstehen" lang: de --- diff --git a/public/content/translations/de/energy-consumption/index.md b/public/content/translations/de/energy-consumption/index.md index a6c460f7d90..aebfde6a48b 100644 --- a/public/content/translations/de/energy-consumption/index.md +++ b/public/content/translations/de/energy-consumption/index.md @@ -1,6 +1,6 @@ --- title: Ethereums Energieverbrauch -description: Grundlegende Informationen, um den generellen Energieverbrauch von Ethereum verstehen zu können +description: "Grundlegende Informationen, um den generellen Energieverbrauch von Ethereum verstehen zu können" lang: de --- diff --git a/public/content/translations/de/eth/supply/index.md b/public/content/translations/de/eth/supply/index.md index d6fc3e888d9..fd47c324d0d 100644 --- a/public/content/translations/de/eth/supply/index.md +++ b/public/content/translations/de/eth/supply/index.md @@ -1,5 +1,5 @@ --- -title: Ein Überblick über Angebot und Ausgabe von ETH +title: "Ein Überblick über Angebot und Ausgabe von ETH" description: Ein einsteigerfreundlicher Leitfaden zum ETH-Angebot und zur ETH-Emission, der zentrale Konzepte wie EIPs, PoS und EIP-1559 behandelt. lang: de --- diff --git a/public/content/translations/de/ethereum-forks/index.md b/public/content/translations/de/ethereum-forks/index.md index 793aa8b62f1..bb9f5fa75b6 100644 --- a/public/content/translations/de/ethereum-forks/index.md +++ b/public/content/translations/de/ethereum-forks/index.md @@ -1,6 +1,6 @@ --- title: Zeitachse aller Ethereum-Forks (2014 bis heute) -description: Eine Geschichte der Ethereum-Blockchain, einschließlich der wichtigsten Meilensteine, Veröffentlichungen und Abspaltungen. +description: "Eine Geschichte der Ethereum-Blockchain, einschließlich der wichtigsten Meilensteine, Veröffentlichungen und Abspaltungen." lang: de sidebarDepth: 1 --- @@ -16,7 +16,6 @@ Forks entstehen, wenn wichtige technische Neuerungen oder Änderungen am Netzwer Wenn für eine Standardsoftware eine Aktualisierung benötigt wird, veröffentlicht der Hersteller lediglich eine neue Version für den Endbenutzer. Blockchains arbeiten anders, da es keinen alleinigen Besitzer gibt. [Ethereum Anwendungen](/developers/docs/nodes-and-clients/) müssen die Software aktualisieren um neue Regeln zu implementieren. Plus Block Ersteller (Miner in einer Proof-of-Work Umgebung, Validatoren in einer Proof-of-Stake Umgebung) und Nodes erstellen neue Blöcke und müssen diese, entsprechend der neuen Richtlinien, validieren. [Mehr zu Konsensmechanismen](/developers/docs/consensus-mechanisms/) Diese Regeländerungen können eine vorübergehende Spaltung des Netzwerks verursachen. Neue Blöcke konnen nach den neuen oder den alten Regeln erzeugt werden. Forks werden in der Regel im Voraus vereinbart, damit die Clients die Änderungen einheitlich übernehmen und der Fork mit den Upgrades zur Main Chain wird. In seltenen Fällen können jedoch Meinungsverschiedenheiten über Forks dazu führen, dass das Netzwerk dauerhaft gespalten wird – am bekanntesten ist die Entstehung von Ethereum Classic durch den DAO Fork. - @@ -62,7 +61,6 @@ Die Upgrades der Ausführungs- und Konsens-Ebene wurden ursprünglich zu untersc | Cancun | Deneb | "Dencun" | | Prag | Electra | "Pectra" | | Osaka | Fulu | "Fusaka" | - Direkt zu den Informationen über einige der besonders wichtigen vergangenen Upgrades springen: [Die Beacon Chain](/roadmap/beacon-chain/); [The Merge](/roadmap/merge/); und [EIP-1559](#london) @@ -116,7 +114,6 @@ Protokollverbesserungen und -sicherheitsverbesserungen:
  • EIP-2935 - Historische Blockhashs im Zustand speichern
  • EIP-7549 - Komiteeindex außerhalb der Bestätigung verschieben
  • - - [Pectra.wtf](https://pectra.wtf) @@ -148,7 +145,6 @@ Insbesondere enthält es EIP-4844, bekannt als **Proto-Danksharding**, das die K
  • EIP-6780SELFDESTRUCT nur in derselben Transaktion
  • EIP-7516 - BLOBBASEFEE Operationscode
  • - - [Layer-2-Rollups](/layer-2/) @@ -173,7 +169,6 @@ EIP-7514 führt zu einer Verschärfung der ETH-Ausgabe, indem die „Churn“-Ra
  • EIP-7045 - Erhöhen Sie die maximale Bescheinigung für den Einschluss inkl. Slot                                                                                                                 
  • EIP-7514 - Hinzufügen der maximalen Epochen-Abwanderungsgrenze                                                                                                   
  • - - [Lesen Sie die Deneb-Upgrade-Spezifikationen](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/) @@ -200,7 +195,6 @@ Das Shanghai-Update ebnete den Weg für Staking-Auszahlungen auf der Ausführung
  • EIP-4895Beacon Chain Push-Abhebungen als Operationen
  • EIP-6049Veraltet SELFDESTRUCT
  • - - [Lesen Sie die Shanghai-Upgrade-Spezifikation](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/shanghai.md) @@ -236,7 +230,6 @@ Das Paris-Upgrade wurde ausgelöst, als die Proof-of-Work-Blockchain eine [termi
  • EIP-3675Ermöglicht den Übergang des Ethereum-Netzwerks vom Konsensmechanismus Proof-of-Work (PoW) zum Proof-of-Stake (PoS).
  • EIP-4399 Die SCHWIERIGKEITEN mit der Wiederverwendung und Lesbarkeit des Opcodes werden durch den PREVRANDAO behoben
  • - --- @@ -268,7 +261,6 @@ Das Gray Glacier-Netzwerk-Upgrade hat die [Schwierigkeitsbombe](/glossary/#diffi
    • EIP-5133Verzögert die Explosion der Schwierigkeitsbombe bis Ende September 2022
    - @@ -291,7 +283,6 @@ Das Arrow-Glacier-Netzwerk-Upgrade verschob die [Schwierigkeitsbombe](/glossary/
    • EIP-4345verzögert die Schwierigkeitsbombe bis Juni 2022
    - --- @@ -349,7 +340,6 @@ Dieses Video erklärt EIP-1559 und die Vorteile, die es mit sich bringt: [EIP-15
  • EIP-3541verhindert die Bereitstellung von Verträgen, verhindert, die mit 0xEF beginnen
  • EIP-3554plant, das Ice Age bis Dezember 2021 zu verlängern
  • - --- @@ -373,7 +363,6 @@ Mit dem Berliner Upgrade wurden die Gaskosten für bestimmte EVM-Aktionen optimi
  • EIP-2929Gaskostenerhöhung für Zustandszugriffs-Opcodes
  • EIP-2930fügt eine optionale Zugriffsliste hinzu
  • - @@ -428,7 +417,6 @@ Der Muir-Glacier-Fork führte eine Verzögerung der [Schwierigkeitsbombe](/gloss
    • EIP-2384verzögert die Schwierigkeitsbombe um weitere 4.000.000 Blöcke, oder etwa 611 Tage.
    - @@ -462,7 +450,6 @@ Die Istanbul-Abspaltung:
  • EIP-2200 weitere Änderungen der Gaspreisverfahrenscodes.
  • - --- @@ -490,7 +477,6 @@ Die Constantinople-Fork:
  • EIP-1052führt die EXTCODEHASH-Anweisung ein, um den Hash des Codes eines anderen Vertrags abzurufen.
  • EIP-1234stellt sicher, dass die Blockchain vor dem Übergang zu Proof-of-Stake nicht einfriert und reduziert die Blockbelohnung von 3 auf 2 ETH.
  • - @@ -525,7 +511,6 @@ Die Byzantium-Fork:
  • EIP-100ändert die Formel für die Einstellung des Schwierigkeitsgrades.
  • EIP-649verzögert [Difficulty Bomb](/glossary/#difficulty-bomb) um 1 Jahr und reduziert die Blockbelohnung von 5 auf 3 ETH.
  • - @@ -554,7 +539,6 @@ Die Spurious-Dragon-Fork war die zweite Reaktion auf die Denial-of-Service(DoS)-
  • EIP-161ermöglicht das Löschen leerer Konten, die bei DOS-Attacken hinzugefügt wurden.
  • EIP-170ändert die maximale Codegröße, die ein Vertrag in der Blockchain haben kann, in 24576 Bytes.
  • - --- @@ -577,7 +561,6 @@ Die Tangerine-Whistle-Fork war die erste Reaktion auf die Denial-of-Service(DoS)
  • EIP-150erhöht die Gaskosten der Verfahrenscodes, die bei Spam-Attacken verwendet werden können.
  • EIP-158reduziert die Zustandsgröße, indem sie eine große Anzahl leerer Konten entfernt, die aufgrund von Fehlern in früheren Versionen des Ethereum-Protokolls ursprünglich minimale Transaktionsgebühren enthielten.
  • - --- @@ -616,7 +599,6 @@ Die Homestead-Abspaltung, die in die Zukunft schaute. Sie enthielt mehrere Proto führt einen neuen Verfahrenscode ein: DELEGATECALL
  • EIP-8präsentiert DEVP2P zur Erfüllung der Kompatibilitätsanforderungen
  • - diff --git a/public/content/translations/de/foundation/index.md b/public/content/translations/de/foundation/index.md index bedb9a671e6..0e8c044d629 100644 --- a/public/content/translations/de/foundation/index.md +++ b/public/content/translations/de/foundation/index.md @@ -1,6 +1,6 @@ --- title: Ethereum Foundation -description: Erfahren Sie mehr über die Ethereum Foundation (EF), eine gemeinnützige Organisation, die sich der Förderung von Ethereum und verwandten Technologien widmet. +description: "Erfahren Sie mehr über die Ethereum Foundation (EF), eine gemeinnützige Organisation, die sich der Förderung von Ethereum und verwandten Technologien widmet." hideEditButton: true lang: de --- diff --git a/public/content/translations/de/gaming/index.md b/public/content/translations/de/gaming/index.md index 273bf7ae907..dc678ca5f13 100644 --- a/public/content/translations/de/gaming/index.md +++ b/public/content/translations/de/gaming/index.md @@ -4,9 +4,9 @@ lang: de template: use-cases image: /images/robot-help-bar.png sidebarDepth: 2 -summaryPoint1: Spielregeln und Spielzustand können durch die Blockchain und nicht durch die Server eines Studios durchgesetzt werden -summaryPoint2: Jeder kann Mods, Bots oder völlig neue Spiele entwickeln, die auf dieselben Onchain-Daten zugreifen. -summaryPoint3: Speziell entwickelte L2s wie Redstone und Frameworks wie MUD senken die Kosten so weit, dass sie Gameplay in Echtzeit ermöglichen. +summaryPoint1: "Spielregeln und Spielzustand können durch die Blockchain und nicht durch die Server eines Studios durchgesetzt werden" +summaryPoint2: "Jeder kann Mods, Bots oder völlig neue Spiele entwickeln, die auf dieselben Onchain-Daten zugreifen." +summaryPoint3: "Speziell entwickelte L2s wie Redstone und Frameworks wie MUD senken die Kosten so weit, dass sie Gameplay in Echtzeit ermöglichen." buttons: - content: Mehr erfahren toId: how-gaming-on-ethereum-works diff --git a/public/content/translations/de/glossary/index.md b/public/content/translations/de/glossary/index.md index bc7b11ff84f..a7fccc11281 100644 --- a/public/content/translations/de/glossary/index.md +++ b/public/content/translations/de/glossary/index.md @@ -1,6 +1,6 @@ --- title: Ethereum Glossar -description: Ein unvollständiges Glossar technischer und nicht technischer Begriffe, bezogen auf Ethereum +description: "Ein unvollständiges Glossar technischer und nicht technischer Begriffe, bezogen auf Ethereum" lang: de --- diff --git a/public/content/translations/de/governance/index.md b/public/content/translations/de/governance/index.md index 46662383473..c4acca4e7c1 100644 --- a/public/content/translations/de/governance/index.md +++ b/public/content/translations/de/governance/index.md @@ -1,6 +1,6 @@ --- title: Ethereum-Governance -description: Eine Einführung in die Entscheidungsfindung bei Ethereum +description: "Eine Einführung in die Entscheidungsfindung bei Ethereum" lang: de --- diff --git a/public/content/translations/de/guides/how-to-create-an-ethereum-account/index.md b/public/content/translations/de/guides/how-to-create-an-ethereum-account/index.md index 59b7e15151c..c4d6753e1ce 100644 --- a/public/content/translations/de/guides/how-to-create-an-ethereum-account/index.md +++ b/public/content/translations/de/guides/how-to-create-an-ethereum-account/index.md @@ -1,6 +1,6 @@ --- -title: Wie man ein Ethereum-Konto „anlegt" -description: Eine Schritt-für-Schritt-Anleitung für die Erstellung eines Ethereum-Kontos mithilfe einer Wallet. +title: "Wie man ein Ethereum-Konto „anlegt\"" +description: "Eine Schritt-für-Schritt-Anleitung für die Erstellung eines Ethereum-Kontos mithilfe einer Wallet." lang: de --- @@ -42,7 +42,8 @@ Einige Apps werden Sie auffordern, eine geheime „Wiederherstellungsphrase“ ( -
    Wallet installiert?
    Erfahren Sie, wie Sie sie verwenden.
    +
    Wallet installiert?
    Erfahren Sie, wie Sie sie verwenden. +
    So verwenden Sie eine Wallet diff --git a/public/content/translations/de/guides/how-to-id-scam-tokens/index.md b/public/content/translations/de/guides/how-to-id-scam-tokens/index.md index 6e729d28045..ecaa167c1c0 100644 --- a/public/content/translations/de/guides/how-to-id-scam-tokens/index.md +++ b/public/content/translations/de/guides/how-to-id-scam-tokens/index.md @@ -1,6 +1,6 @@ --- -title: So erkennen Sie betrügerische Token -description: Erkennen von betrügerischen Token, wie sie sich legitim erscheinen lassen und wie sie sich vermeiden lassen. +title: "So erkennen Sie betrügerische Token" +description: "Erkennen von betrügerischen Token, wie sie sich legitim erscheinen lassen und wie sie sich vermeiden lassen." lang: de --- @@ -20,7 +20,6 @@ title="Was ist ARB?" contentPreview=''> Arbitrum ist eine Organisation, die [Optimistic Rollups](/developers/docs/scaling/optimistic-rollups/) entwickelt und verwaltet. Ursprünglich war Arbitrum als gewinnorientiertes Unternehmen organisiert, unternahm dann aber Schritte zur Dezentralisierung. Als Teil dieses Prozesses haben sie einen handelbaren [Governance-Token](/dao/#token-based-membership) ausgegeben. - In Ethereum gibt es eine Konvention: Wird ein Asset erstellt, das nicht ERC-20-kompatibel ist, wird eine " Wrapped"-Version erstellt wird, deren Name mit "w" beginnt. So gibt es beispielsweise wBTC für Bitcoin und wETH für Ether. Es ergibt keinen Sinn, eine Wrapped-Version eines ERC-20-Tokens zu erstellen, der bereits auf Ethereum vorhanden ist, aber Betrüger verlassen sich eher auf den Anschein von Legitimität als auf die zugrunde liegende Realität. - ## Wie funktionieren betrügerische Token? {#how-do-scam-tokens-work} @@ -42,7 +40,6 @@ title="Was sind Smart Contracts?" contentPreview=''> [Smart Contracts](/developers/docs/smart-contracts/) sind die Programme, die auf der Ethereum-Blockchain ausgeführt werden. Jeder ERC-20 Token ist beispielsweise als Smart Contract implementiert. - Genauer gesagt hat Arbitrum einen Vertrag bereitgestellt, der das Symbol `ARB` verwendet. Doch das hält andere Menschen nicht davon ab, ebenfalls einen Contract einzusetzen, der dasselbe oder ein ähnliches Symbol nutzt. Wer den Contract schreibt, kann bestimmen, wofür er verwendet wird. diff --git a/public/content/translations/de/guides/how-to-revoke-token-access/index.md b/public/content/translations/de/guides/how-to-revoke-token-access/index.md index ade47f4b6fd..59bf6b53032 100644 --- a/public/content/translations/de/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/de/guides/how-to-revoke-token-access/index.md @@ -1,6 +1,6 @@ --- title: So widerrufen Sie den Smart-Contract-Zugriff auf Ihre Krypto-Geldmittel -description: Ein Leitfaden für den Widerruf des Zugriffs auf ausbeuterische Smart Contract Token +description: "Ein Leitfaden für den Widerruf des Zugriffs auf ausbeuterische Smart Contract Token" lang: de --- @@ -49,7 +49,8 @@ Wir empfehlen Ihnen, das Widerrufs-Tool nach einigen Minuten zu aktualisieren un -
    Möchten Sie mehr erfahren?
    +
    Möchten Sie mehr erfahren? +
    Sehen Sie unsere anderen Anleitungen diff --git a/public/content/translations/de/guides/how-to-swap-tokens/index.md b/public/content/translations/de/guides/how-to-swap-tokens/index.md index 7ee9ebedcf2..69b481ac259 100644 --- a/public/content/translations/de/guides/how-to-swap-tokens/index.md +++ b/public/content/translations/de/guides/how-to-swap-tokens/index.md @@ -52,7 +52,8 @@ Sie werden die getauschten Token automatisch in Ihrer Krypto-Wallet erhalten, we -
    Möchten Sie mehr erfahren?
    +
    Möchten Sie mehr erfahren? +
    Sehen Sie unsere anderen Anleitungen diff --git a/public/content/translations/de/guides/how-to-use-a-bridge/index.md b/public/content/translations/de/guides/how-to-use-a-bridge/index.md index 8f49656896f..aa4fd9914cc 100644 --- a/public/content/translations/de/guides/how-to-use-a-bridge/index.md +++ b/public/content/translations/de/guides/how-to-use-a-bridge/index.md @@ -1,6 +1,6 @@ --- -title: Wie man Token auf die Layer 2 überträgt -description: Ein Leitfaden, der erklärt, wie man Token von Ethereum mithilfe eines Übergangs zu Ebene 2 überträgt. +title: "Wie man Token auf die Layer 2 überträgt" +description: "Ein Leitfaden, der erklärt, wie man Token von Ethereum mithilfe eines Übergangs zu Ebene 2 überträgt." lang: de --- @@ -54,7 +54,8 @@ Sie können [chainlist.org](http://chainlist.org) verwenden, um die RPC-Details -
    Möchten Sie mehr erfahren?
    +
    Möchten Sie mehr erfahren? +
    Sehen Sie unsere anderen Anleitungen diff --git a/public/content/translations/de/guides/how-to-use-a-wallet/index.md b/public/content/translations/de/guides/how-to-use-a-wallet/index.md index 2046f7ac5d0..4919ad467eb 100644 --- a/public/content/translations/de/guides/how-to-use-a-wallet/index.md +++ b/public/content/translations/de/guides/how-to-use-a-wallet/index.md @@ -1,6 +1,6 @@ --- title: So verwendest du eine Wallet -metaTitle: Der richtige Umgang mit Ethereum-Wallets | Eine Schritt-für-Schritt-Anleitung +metaTitle: "Der richtige Umgang mit Ethereum-Wallets | Eine Schritt-für-Schritt-Anleitung" description: Ein Leitfaden zum Versenden, Empfangen von Token und Verbinden mit Web-3 Projekten. lang: de --- @@ -65,7 +65,8 @@ Ihre Adresse wird auf allen Ethereum Projekten dieselbe sein. Sie brauchen sich -
    Möchten Sie mehr erfahren?
    +
    Möchten Sie mehr erfahren? +
    Sehen Sie unsere anderen Anleitungen diff --git a/public/content/translations/de/guides/index.md b/public/content/translations/de/guides/index.md index d08d6094dea..6d211e636cb 100644 --- a/public/content/translations/de/guides/index.md +++ b/public/content/translations/de/guides/index.md @@ -1,6 +1,6 @@ --- -title: Ethereum Leitfäden -description: Eine Sammlung an praktischen Leitfäden, welche Anfängern die Grundlagen von Ethereum erklärt. +title: "Ethereum Leitfäden" +description: "Eine Sammlung an praktischen Leitfäden, welche Anfängern die Grundlagen von Ethereum erklärt." lang: de --- diff --git a/public/content/translations/de/nft/index.md b/public/content/translations/de/nft/index.md index 885351eea9d..cdc97c65d59 100644 --- a/public/content/translations/de/nft/index.md +++ b/public/content/translations/de/nft/index.md @@ -1,7 +1,7 @@ --- title: Non Fungible Token (NFT) metaTitle: Was sind NFTs? | Vorteile und Verwendung -description: Ein Überblick über NFTs bei Ethereum +description: "Ein Überblick über NFTs bei Ethereum" lang: de template: use-cases emoji: ":frame_with_picture:" @@ -10,7 +10,7 @@ image: /images/infrastructure_transparent.png alt: Ein als Hologramm abgebildetes ETH-Logo. summaryPoint1: Ein Weg, alles Einzigartige als eine Ethereum-basierte Anlage darzustellen. summaryPoint2: NFTs geben Inhaltserstellern mehr Einfluss denn je. -summaryPoint3: Auf Grundlage von intelligenten Verträgen auf der Ethereum-Blockchain. +summaryPoint3: "Auf Grundlage von intelligenten Verträgen auf der Ethereum-Blockchain." --- ## Was sind NFTs? {#what-are-nfts} @@ -58,7 +58,8 @@ Vielleicht sind Sie ein Künstler, der seine Werke mithilfe von NFTs verbreiten -
    Entdecken, kaufen oder erstellen Sie Ihre eigene(n) NFT-Kunst/Sammelgegenstände ...
    +
    Entdecken, kaufen oder erstellen Sie Ihre eigene(n) NFT-Kunst/Sammelgegenstände ... +
    NFT-Kunst entdecken diff --git a/public/content/translations/de/payments/index.md b/public/content/translations/de/payments/index.md index 90a42389b02..3bf21207194 100644 --- a/public/content/translations/de/payments/index.md +++ b/public/content/translations/de/payments/index.md @@ -1,15 +1,15 @@ --- title: Ethereum-Zahlungen metaTitle: Zahlungen auf Ethereum -description: Ein Überblick über Zahlungen auf Ethereum +description: "Ein Überblick über Zahlungen auf Ethereum" lang: de template: use-cases emoji: ":frame_with_picture:" sidebarDepth: 2 image: /images/impact_transparent.png -alt: Ein ETH-Logo, das zusammen mit gebenden Händen abgebildet ist. +alt: "Ein ETH-Logo, das zusammen mit gebenden Händen abgebildet ist." summaryPoint1: Eine Welt, in der sich Geld so frei bewegt wie Informationen -summaryPoint2: Offen und global, ermöglicht grenzenlose Transaktionen für alle +summaryPoint2: "Offen und global, ermöglicht grenzenlose Transaktionen für alle" summaryPoint3: Zahlungen, die innerhalb einer Minute eingehen --- @@ -20,7 +20,6 @@ Dies ist kein ferner Traum – es geschieht heute auf Ethereum. Obwohl tradition
    ![Ethereum-Logo auf dem Computerbildschirm](./computer.png) -
    ## Überweisungen: günstigere internationale Transfers {#remittances} @@ -61,7 +60,8 @@ In Ländern, in denen ihre Zahlungsmittel vom Rest der Welt abgekoppelt wurden, -
    Erstellen Sie noch heute Ihr Ethereum-Konto mit einer Wallet-App.
    +
    Erstellen Sie noch heute Ihr Ethereum-Konto mit einer Wallet-App. +
    Jetzt loslegen @@ -143,7 +143,6 @@ Das Ergebnis? Über 6 Millionen Dollar wurden innerhalb weniger Tage gesammelt,
    ![Ethereum Roboter-Bild](./eth_robot.png) -
    ## Ethereum vs. Fiat {#ethereum-vs-fiat} @@ -190,7 +189,6 @@ Mit Ethereum kann jeder sehen, wie sich Geld bewegt und wie Kosten umgesetzt wer
    ![Gehendes Bild](./walking.png) -
    Während Fiat-Währungen den Vorteil der weit verbreiteten Akzeptanz und Stabilität haben, bietet Ethereum einzigartige Vorteile, die es zu einer attraktiven Option für bestimmte Arten von Transaktionen machen. @@ -200,7 +198,8 @@ Von der Erleichterung der schnellen Katastrophenhilfe bis zur Stärkung globaler -
    Zeit, Ihr eigenes Ethereum-Konto zu erstellen.
    +
    Zeit, Ihr eigenes Ethereum-Konto zu erstellen. +
    Jetzt loslegen! diff --git a/public/content/translations/de/prediction-markets/index.md b/public/content/translations/de/prediction-markets/index.md index 2058e16bd83..fce64fa499a 100644 --- a/public/content/translations/de/prediction-markets/index.md +++ b/public/content/translations/de/prediction-markets/index.md @@ -1,11 +1,11 @@ --- -title: Prognosemärkte +title: "Prognosemärkte" lang: de template: use-cases image: /images/use-cases/prediction-markets.png sidebarDepth: 2 -summaryPoint1: Finanzielle Anreize für die Erstellung präziser Prognosen erhalten -summaryPoint2: Hochwertige Vorhersagen zu zukünftigen Ereignissen +summaryPoint1: "Finanzielle Anreize für die Erstellung präziser Prognosen erhalten" +summaryPoint2: "Hochwertige Vorhersagen zu zukünftigen Ereignissen" buttons: - content: Mehr erfahren toId: how-prediction-markets-work diff --git a/public/content/translations/de/privacy/index.md b/public/content/translations/de/privacy/index.md index 173ab4e4846..8bd6096d63d 100644 --- a/public/content/translations/de/privacy/index.md +++ b/public/content/translations/de/privacy/index.md @@ -1,6 +1,6 @@ --- title: Datenschutz auf Ethereum -description: Werkzeuge und Techniken zum Schutz Ihrer Privatsphäre auf Ethereum +description: "Werkzeuge und Techniken zum Schutz Ihrer Privatsphäre auf Ethereum" lang: de --- diff --git a/public/content/translations/de/real-world-assets/index.md b/public/content/translations/de/real-world-assets/index.md index 8a83ac2e000..ceb6a3272f0 100644 --- a/public/content/translations/de/real-world-assets/index.md +++ b/public/content/translations/de/real-world-assets/index.md @@ -1,16 +1,16 @@ --- -title: Real wertige Vermögenswerte (RWAs) -metaTitle: Was sind Real-World-Assets (RWAs)? | Vorteile und Einsatzmöglichkeiten von Real-World Assets (RWAs) -description: Ein Überblick über Real-World Assets (RWAs) auf Ethereum +title: "Real wertige Vermögenswerte (RWAs)" +metaTitle: "Was sind Real-World-Assets (RWAs)? | Vorteile und Einsatzmöglichkeiten von Real-World Assets (RWAs)" +description: "Ein Überblick über Real-World Assets (RWAs) auf Ethereum" lang: de template: use-cases emoji: ":house_buildings:" image: /images/man-and-dog-playing.png alt: Mann und Hund beim Spielen. sidebarDepth: 2 -summaryPoint1: Eine Methode, um wertvolle Güter in digitale Token umzuwandeln. -summaryPoint2: Es ist nun möglich, Anteile an realen Objekten oder Vermögenswerten zu erwerben, anstatt eine vollständige Immobilie oder ein gesamtes Objekt kaufen zu müssen. -summaryPoint3: Verbindet die traditionelle Finanzwelt mit dem Blockchain-Ökosystem. +summaryPoint1: "Eine Methode, um wertvolle Güter in digitale Token umzuwandeln." +summaryPoint2: "Es ist nun möglich, Anteile an realen Objekten oder Vermögenswerten zu erwerben, anstatt eine vollständige Immobilie oder ein gesamtes Objekt kaufen zu müssen." +summaryPoint3: "Verbindet die traditionelle Finanzwelt mit dem Blockchain-Ökosystem." --- Reale Vermögenswerte (RWAs) sind Token, die bestehende Formen von Vermögen repräsentieren, wie etwa Immobilien, Gold, Aktien, Kunstwerke, Maschinen oder Sammlerstücke. Die Tokenisierung dieser Vermögenswerte überführt sie in digitale Form, wodurch eine Aufteilung auf mehrere Eigentümer ermöglicht und ihr Handel erleichtert wird. diff --git a/public/content/translations/de/refi/index.md b/public/content/translations/de/refi/index.md index a6f4475bac3..a1e2ba3c180 100644 --- a/public/content/translations/de/refi/index.md +++ b/public/content/translations/de/refi/index.md @@ -1,6 +1,6 @@ --- title: Regenerative Finanzen (ReFi) -description: Ein Überblick über ReFi und die aktuellen Anwendungsfälle. +description: "Ein Überblick über ReFi und die aktuellen Anwendungsfälle." lang: de template: use-cases emoji: ":recycle:" @@ -8,8 +8,8 @@ sidebarDepth: 2 image: /images/future_transparent.png alt: "" summaryPoint1: Ein alternatives, auf regenerativen Prinzipien beruhendes Wirtschaftssystem -summaryPoint2: Ein Versuch, Ethereum für die Lösung globaler Koordinationskrisen wie dem Klimawandel nutzbar zu machen -summaryPoint3: Ein Werkzeug zur drastischen Skalierung von Vermögenswerten mit ökologischem Nutzen, wie z. B. verifizierten Kohlenstoffgutschriften +summaryPoint2: "Ein Versuch, Ethereum für die Lösung globaler Koordinationskrisen wie dem Klimawandel nutzbar zu machen" +summaryPoint3: "Ein Werkzeug zur drastischen Skalierung von Vermögenswerten mit ökologischem Nutzen, wie z. B. verifizierten Kohlenstoffgutschriften" --- ## Was ist ReFi? {#what-is-refi} diff --git a/public/content/translations/de/restaking/index.md b/public/content/translations/de/restaking/index.md index bbe7292e275..95c3b9bdd3e 100644 --- a/public/content/translations/de/restaking/index.md +++ b/public/content/translations/de/restaking/index.md @@ -1,14 +1,14 @@ --- title: Restaking metaTitle: Was ist Restaking? | Vorteile und Nutzung von Restaking -description: Verwenden Sie gestakte ETH, um andere dezentralisierte Dienste abzusichern und zusätzliche Belohnungen zu verdienen. +description: "Verwenden Sie gestakte ETH, um andere dezentralisierte Dienste abzusichern und zusätzliche Belohnungen zu verdienen." lang: de template: use-cases emoji: ":recycle:" image: /images/use-cases/restaking.png alt: Eine visuelle Darstellung des Restakings auf Ethereum. sidebarDepth: 2 -summaryPoint1: Verwenden Sie gestakte ETH, um andere dezentralisierte Dienste abzusichern und zusätzliche Belohnungen zu verdienen. +summaryPoint1: "Verwenden Sie gestakte ETH, um andere dezentralisierte Dienste abzusichern und zusätzliche Belohnungen zu verdienen." buttons: - content: Was ist Restaking? toId: what-is-restaking diff --git a/public/content/translations/de/roadmap/account-abstraction/index.md b/public/content/translations/de/roadmap/account-abstraction/index.md index 4a9f869ab7d..b4d4f568f69 100644 --- a/public/content/translations/de/roadmap/account-abstraction/index.md +++ b/public/content/translations/de/roadmap/account-abstraction/index.md @@ -1,6 +1,6 @@ --- title: Kontoabstraktion -description: Ein Überblick über die Pläne von Ethereum, Nutzerkonten einfacher und sicherer zu machen +description: "Ein Überblick über die Pläne von Ethereum, Nutzerkonten einfacher und sicherer zu machen" lang: de summaryPoints: - Account-Abstraktion macht es deutlich einfacher, Smart-Contract-Wallets zu bauen diff --git a/public/content/translations/de/roadmap/beacon-chain/index.md b/public/content/translations/de/roadmap/beacon-chain/index.md index f447de61f69..20c2f249734 100644 --- a/public/content/translations/de/roadmap/beacon-chain/index.md +++ b/public/content/translations/de/roadmap/beacon-chain/index.md @@ -1,13 +1,13 @@ --- title: Die Beacon-Chain -description: Informieren Sie sich über die Beacon Chain – das Upgrade, mit dem Proof-of-Stake für Ethereum eingeführt wurde +description: "Informieren Sie sich über die Beacon Chain – das Upgrade, mit dem Proof-of-Stake für Ethereum eingeführt wurde" lang: de template: upgrade image: /images/upgrades/core.png alt: -summaryPoint1: Mit der Bacon Chain wurde Proof-of-Stake in das Ethereum-Ökosystem eingeführt. -summaryPoint2: Sie wurde im September 2022 mit der ursprünglichen Proof-of-Work-Blockchain von Ethereum vereinigt. -summaryPoint3: Mit der Beacon Chain wurde die Konsenslogik und das Block-Gossip-Protokoll eingeführt, die heute für die Sicherheit von Ethereum sorgen. +summaryPoint1: "Mit der Bacon Chain wurde Proof-of-Stake in das Ethereum-Ökosystem eingeführt." +summaryPoint2: "Sie wurde im September 2022 mit der ursprünglichen Proof-of-Work-Blockchain von Ethereum vereinigt." +summaryPoint3: "Mit der Beacon Chain wurde die Konsenslogik und das Block-Gossip-Protokoll eingeführt, die heute für die Sicherheit von Ethereum sorgen." --- @@ -18,8 +18,7 @@ summaryPoint3: Mit der Beacon Chain wurde die Konsenslogik und das Block-Gossip- Die Beacon Chain ist der Name der ursprünglichen Proof-of-Stake (Anteilsnachweis) Blockchain, die im Jahr 2020 eingeführt wurde. Sie wurde geschaffen, um sicherzustellen, dass die Proof-of-Stake Konsenslogik sicher und nachhaltig ist, bevor sie auf dem Ethereum Mainnet eingeführt wurde. Sie wurde daher neben dem ursprünglichen Proof-of-Work Konsens für Ethereum betrieben. Die Beacon Chain bestand aus 'leeren' Blöcken. Die Umstellung von Proof-of-Work (Arbeitsnachweis) auf den Proof-of-Stake (Anteilsnachweis) Mechanismus auf Ethereum erforderte jedoch, dass die Beacon Chain angewiesen wurde, Transaktionsdaten von Ausführungsklienten anzunehmen, sie zu Blockbündeln zusammenzuführen und sie dann mithilfe eines auf dem Proof-of-Stake-Mechanismus basierenden Konsensverfahrens in eine Blockchain zu organisieren. Zur gleichen Zeit haben die ursprünglichen Ethereum Clients ihr Mining, die Blockausbreitung und die Konsenslogik abgeschaltet und alles an die Beacon Chain übergeben. Dieses Ereignis war als [The Merge](/roadmap/merge/) bekannt. Nachdem das Merge (Fusion)-Ereignis erfolgreich abgeschlossen war, existierten keine zwei Blockchains mehr. Stattdessen existierte nur noch ein Proof-of-Stake Ethereum, für das nun pro Knoten zwei verschiedene Klienten erforderlich waren. Die Beacon Chain ist nun die Konsensus-Ebene, ein Peer-to-Peer-Netzwerk von Konsens-Clients, das für den Block-Tratsch und die Konsensus-Logik zuständig ist, während die ursprünglichen Clients die Ausführungs-Ebene bilden, die für den Tratsch und die Ausführung von Transaktionen sowie die Verwaltung des Ethereum-Status verantwortlich ist. Die beiden Schichten können über die Engine-API miteinander kommunizieren. -## Welche Funktion hat die Beacon Chain? Welche Funktion hat die Beacon Chain? {#what-does-the-beacon-chain-do} - +## Welche Funktion hat die Beacon Chain? {#what-does-the-beacon-chain-do} Die Beacon Chain ist die Bezeichnung für ein Hauptbuch von Konten, das das Netzwerk der Ethereum-[Staker](/staking/) betrieb und koordinierte, bevor diese Staker mit der Validierung echter Ethereum-Blöcke begannen. Es werden jedoch keine Transaktionen verarbeitet oder Smart-Contract-Interaktionen abgewickelt, da dies in der Ausführungs-Ebene geschieht. Die Beacon Chain ist verantwortlich für Dinge wie die Handhabung von Blöcken und Bescheinigungen, die Ausführung des Fork-Choice-Algorithmus und die Verwaltung von Belohnungen und Strafen. Lesen Sie mehr auf unserer [Seite zur Node-Architektur](/developers/docs/nodes-and-clients/node-architecture/#node-comparison). diff --git a/public/content/translations/de/roadmap/danksharding/index.md b/public/content/translations/de/roadmap/danksharding/index.md index ea39ade36f7..b35f8fccdce 100644 --- a/public/content/translations/de/roadmap/danksharding/index.md +++ b/public/content/translations/de/roadmap/danksharding/index.md @@ -1,6 +1,6 @@ --- title: Danksharding -description: Erfahre mehr über Proto-Danksharding und Danksharding - zwei aufeinanderfolgende Upgrades zur Skalierung von Ethereum. +description: "Erfahre mehr über Proto-Danksharding und Danksharding - zwei aufeinanderfolgende Upgrades zur Skalierung von Ethereum." lang: de summaryPoints: - Danksharding ist ein mehrphasiges Upgrade, um die Skalierbarkeit und Kapazität von Ethereum zu verbessern. @@ -22,13 +22,11 @@ Das ist teuer, weil die Daten von allen Ethereum-Nodes verarbeitet werden und f Rollups sind eine Möglichkeit, Ethereum zu skalieren, indem Transaktionen offchain gebatcht und die Ergebnisse dann auf Ethereum gepostet werden. Ein Rollup besteht im Wesentlichen aus zwei Teilen: Daten und Ausführungsprüfung. Die Daten sind die vollständige Abfolge von Transaktionen, die von einem Rollup verarbeitet werden, um die Zustandsänderung zu erzeugen, die zu Ethereum gepostet wird. Die Ausführungsprüfung ist die Wiederholung dieser Transaktionen durch einen ehrlichen Akteur (einen "Prover"), um sicherzustellen, dass die vorgeschlagene Zustandsänderung korrekt ist. Um die Ausführungsprüfung durchführen zu können, müssen die Transaktionsdaten lange genug verfügbar sein, damit sie von jedem heruntergeladen und überprüft werden können. Das bedeutet, dass jedes unehrliche Verhalten des Rollup-Sequenzierers vom Beweiser erkannt und herausgefordert werden kann. Allerdings muss es nicht für immer verfügbar sein. - Rollups veröffentlichen onchain Commitments zu ihren Transaktionsdaten und stellen die eigentlichen Daten in Daten-Blobs zur Verfügung. Das bedeutet, dass Beweiser überprüfen können, ob die Verpflichtungen gültig sind, oder Daten herausfordern können, von denen sie glauben, dass sie falsch sind. Auf Node-Ebene werden die Datenblobs im Konsens-Client gehalten. Die Konsens-Clients bezeugen, dass sie die Daten gesehen haben und dass sie im Netzwerk verbreitet wurden. Wenn die Daten für immer aufbewahrt würden, würden diese Clients aufgebläht und zu hohen Hardwareanforderungen für den Betrieb von Nodes führen. Stattdessen werden die Daten alle 18 Tage automatisch aus dem Node gelöscht. Die Beglaubigungen des Konsens-Clients belegen, dass Beweisende ausreichend Gelegenheit hatten, die Daten zu überprüfen. Die eigentlichen Daten können von Rollup-Betreibern, Benutzern oder anderen offchain gespeichert werden. - ### Wie werden Blob-Daten überprüft? {#how-are-blobs-verified} @@ -48,13 +46,11 @@ Die EIP-4844 KZG-Zeremonie war für die Öffentlichkeit zugänglich. Zehntausend Wenn ein Rollup Daten in einem Blob postet, stellt es ein "Commitment" zur Verfügung, das onchain gepostet wird. Dieses Commitment ist das Ergebnis der Auswertung eines an die Daten angepassten Polynoms an bestimmten Punkten. Diese Punkte werden durch die in der KZG-Zeremonie erzeugten Zufallszahlen definiert. Beweiser können dann das Polynom an denselben Punkten auswerten, um die Daten zu überprüfen - wenn sie zu denselben Werten kommen, dann sind die Daten korrekt. - Wenn jemand die zufälligen Stellen kennt, die für das Commitment verwendet werden, ist es einfach, ein neues Polynom zu erzeugen, das an diesen spezifischen Punkten passt (d. h. eine "Kollision"). Das bedeutet, sie könnten Daten zum Blob hinzufügen oder daraus entfernen und dennoch einen gültigen Nachweis liefern. Um dies zu verhindern, erhalten die Beweiser statt der tatsächlichen geheimen Positionen diese Positionen eingehüllt in eine kryptographische "Black Box" unter Verwendung elliptischer Kurven. Diese verzerren die Werte effektiv auf eine Weise, dass die ursprünglichen Werte nicht rückentwickelt werden können, aber mit einiger cleverer Algebra können Beweiser und Verifizierer immer noch Polynome an den Punkten auswerten, die sie repräsentieren. - @@ -70,13 +66,11 @@ Dies funktioniert, indem die an die Blöcke angehängten Blobs von sechs (6) bei Die Trennung von Vorschlagenden und Erstellenden ist notwendig, um zu verhindern, dass einzelne Validatoren teure Verpflichtungen und Nachweise für 32MB Blob-Daten erzeugen müssen. Dies würde zu einer zu großen Belastung für Heim-Staker führen und sie dazu zwingen, in leistungsfähigere Hardware zu investieren, was die Dezentralisierung beeinträchtigen würde. Stattdessen übernehmen spezialisierte Blockersteller die Verantwortung für diese aufwändige Rechenarbeit. Dann stellen sie ihre Blöcke den Blockvorschlägern zur Verfügung, um sie zu senden. Der Blockvorschläger wählt einfach den Block aus, der am rentabelsten ist. Jeder kann die Blobs kostengünstig und schnell überprüfen, was bedeutet, dass jeder normale Validator überprüfen kann, ob die Blockersteller ehrlich handeln. Dies ermöglicht die Verarbeitung der großen Blobs, ohne die Dezentralisierung zu opfern. Block Builder, die sich schlecht verhalten, könnten einfach aus dem Netzwerk geworfen und bestraft werden - andere würden ihren Platz einnehmen, weil Block Building eine profitable Tätigkeit ist. - Validators only have to download a small piece of each blob in order to verify its availability, rather than the entire thing. Mithilfe des Data Availability Samplings können die Validatoren sehr sicher sein, dass die Blob-Daten verfügbar waren und korrekt bestätigt wurden. Jeder Validator kann zufällig nur einige Datenpunkte abrufen und einen Nachweis erstellen, was bedeutet, dass kein Validator den gesamten Blob überprüfen muss. Fehlen irgendwelche Daten, wird dies schnell erkannt und der Blob abgelehnt. - ### Aktueller Fortschritt {#current-progress} diff --git a/public/content/translations/de/roadmap/dencun/index.md b/public/content/translations/de/roadmap/dencun/index.md index 2032036d02f..64087ab051d 100644 --- a/public/content/translations/de/roadmap/dencun/index.md +++ b/public/content/translations/de/roadmap/dencun/index.md @@ -1,6 +1,6 @@ --- title: FAQs zu Cancun-Deneb (Dencun) -description: Häufig gestellte Fragen zum Netzwerk-Upgrade Cancun-Deneb (Dencun) +description: "Häufig gestellte Fragen zum Netzwerk-Upgrade Cancun-Deneb (Dencun)" lang: de --- diff --git a/public/content/translations/de/roadmap/fusaka/index.md b/public/content/translations/de/roadmap/fusaka/index.md index 3f88caaea2d..ea4d90f7205 100644 --- a/public/content/translations/de/roadmap/fusaka/index.md +++ b/public/content/translations/de/roadmap/fusaka/index.md @@ -1,6 +1,6 @@ --- title: Fulu-Osaka (Fusaka) -description: Erfahren Sie mehr über das Fusaka-Protokoll-Upgrade +description: "Erfahren Sie mehr über das Fusaka-Protokoll-Upgrade" lang: de --- diff --git a/public/content/translations/de/roadmap/fusaka/peerdas/index.md b/public/content/translations/de/roadmap/fusaka/peerdas/index.md index bc39e0641db..b77a2af24da 100644 --- a/public/content/translations/de/roadmap/fusaka/peerdas/index.md +++ b/public/content/translations/de/roadmap/fusaka/peerdas/index.md @@ -1,6 +1,6 @@ --- title: PeerDAS -description: Erfahren Sie mehr über PeerDAS als Teil des Fusaka-Ethereum-Protokoll-Upgrades +description: "Erfahren Sie mehr über PeerDAS als Teil des Fusaka-Ethereum-Protokoll-Upgrades" lang: de --- diff --git a/public/content/translations/de/roadmap/future-proofing/index.md b/public/content/translations/de/roadmap/future-proofing/index.md index 8267831e776..0f48902bfe5 100644 --- a/public/content/translations/de/roadmap/future-proofing/index.md +++ b/public/content/translations/de/roadmap/future-proofing/index.md @@ -1,6 +1,6 @@ --- title: Zukunftssicherung von Ethereum -description: Diese Verbesserungen festigen Ethereum als widerstandsfähige und dezentrale Grundlage für die ungewisse Zukunft. +description: "Diese Verbesserungen festigen Ethereum als widerstandsfähige und dezentrale Grundlage für die ungewisse Zukunft." lang: de image: /images/roadmap/roadmap-future.png alt: "Ethereum-Roadmap" diff --git a/public/content/translations/de/roadmap/merge/index.md b/public/content/translations/de/roadmap/merge/index.md index 56eee057a37..963c03b3739 100644 --- a/public/content/translations/de/roadmap/merge/index.md +++ b/public/content/translations/de/roadmap/merge/index.md @@ -1,13 +1,13 @@ --- title: Der Zusammenschluss -description: Erfahren Sie mehr über die Zusammenführung, als Mainnet Ethereum Proof-of-Stake einführte. +description: "Erfahren Sie mehr über die Zusammenführung, als Mainnet Ethereum Proof-of-Stake einführte." lang: de template: upgrade image: /images/upgrades/merge.png alt: summaryPoint1: Im Ethereum Mainnet wird Proof-of-Stake verwendet, aber dies war nicht immer der Fall. -summaryPoint2: Der Wechsel vom ursprünglichen Proof-of-Work-Mechanismus zu Proof-of-Stake wurde The Merge genannt. -summaryPoint3: The Merge bezieht sich darauf, dass das ursprüngliche Ethereum Mainnet mit einer separaten Proof-of-Stake-Blockchain namens Beacon Chain zusammengeführt wurde und somit nun beide als eine Blockchain existieren. +summaryPoint2: "Der Wechsel vom ursprünglichen Proof-of-Work-Mechanismus zu Proof-of-Stake wurde The Merge genannt." +summaryPoint3: "The Merge bezieht sich darauf, dass das ursprüngliche Ethereum Mainnet mit einer separaten Proof-of-Stake-Blockchain namens Beacon Chain zusammengeführt wurde und somit nun beide als eine Blockchain existieren." summaryPoint4: Nach The Merge reduzierte sich Ethereums Energieverbrauch um ~99,95 %. --- @@ -70,7 +70,8 @@ Zu den Schlüsselaktionen gehören: Wenn Sie die ersten beiden obigen Elemente nicht abschließen, wird Ihre Node als "offline" betrachtet, bis beide Ebenen synchronisiert und authentifiziert sind. -Wenn kein "Gebührenempfänger" gesetzt wird, kann sich dein Validator wie üblich verhalten, aber Sie werden auf unverbrannte Gebührentipps verzichten und alle MEV, die Sie sonst in Blöcken verdient hätten, die Ihr Validator vorschlägt. +Wenn kein "Gebührenempfänger" gesetzt wird, kann sich dein Validator wie üblich verhalten, aber Sie werden auf unverbrannte Gebührentipps verzichten und alle MEV, die Sie sonst in Blöcken verdient hätten, die Ihr Validator vorschlägt. + Weitere Informationen findest Du in diesem Blogartikel von Tim Heiko zum Thema The Merge Update: Welche Auswirkungen hat das Ereignis auf die Ethereum-Execution Layer?. - ## Die Zusammenführung und der Energieverbrauch {#merge-and-energy} @@ -134,7 +133,6 @@ Jeder kann einen Knoten betreiben, der allerdings nicht erlaubt, andere Blöcke Die Möglichkeit für jeden, einen eigenen Node zu betreiben, ist absolut essentiell zur Aufrechterhaltung der Dezentralisierung des Ethereum-Netzwerks. [Mehr zum Betreiben Ihrer eigenen Node](/run-a-node/) - Rollup-zentrierten Roadmap konzentrieren sich die Bemühungen auf die Skalierung der Benutzeraktivität auf [Ebene 2](/layer-2/), während das Mainnet der Ebene 1 als sichere dezentrale Abwicklungsebene aktiviert wird, die für die Speicherung von Rollup-Daten optimiert ist, um Rollup-Transaktionen exponentiell günstiger zu machen. Der Übergang zu Proof-of-Stake ist ein entscheidender Vorläufer für die Umsetzung. [Mehr zu Gas und Gebühren.](/developers/docs/gas/) - Abhebungsadresse um automatische Auszahlungen von überschüssigem für Staking eingesetzten ETH zu erhalten (ETH über 32 aus Protokollbelohnungen). Mit diesem Upgrade wurde auch die Möglichkeit geschaffen, dass ein Validator sein gesamtes Guthaben beim Verlassen des Netzwerkes entsperren und zurückfordern kann. [Mehr zu Staking-Auszahlungen](/staking/withdrawals/) - +Der effektive Jahreszins ist auch bewusst dynamisch, damit ein Markt von Stakern abwägen kann, wie viel sie bereit sind, für die Sicherung des Netzwerks zu zahlen. Wenn die Rate zu niedrig ist, werden die Validatoren mit einer durch das Protokoll begrenzten Rate aussteigen. Nach und nach wird dadurch die APR für alle erhöht, die bleiben und wieder neue oder wiederkehrende Staker anziehen. + ## Was ist mit „Eth2“ passiert? {#eth2} diff --git a/public/content/translations/de/roadmap/merge/issuance/index.md b/public/content/translations/de/roadmap/merge/issuance/index.md index 35ab26c04ed..b5562115967 100644 --- a/public/content/translations/de/roadmap/merge/issuance/index.md +++ b/public/content/translations/de/roadmap/merge/issuance/index.md @@ -1,6 +1,6 @@ --- title: Wie hat The Merge das ETH-Angebot beeinflusst -description: Aufschlüsselung darüber, wie The Merge das ETH-Angebot beeinflusst hat +description: "Aufschlüsselung darüber, wie The Merge das ETH-Angebot beeinflusst hat" lang: de --- @@ -23,7 +23,6 @@ title="ETH-Emission kurz erklärt"> - Die genaue Staking-Emission schwankt je nach der Gesamtmenge der gestaketen ETH. - **Seit The Merge verbleiben nur noch die ~1.700 ETH/Tag, wodurch die gesamte neue ETH-Emission um ~88 % sinkt.** - Die Verbrennung: Diese schwankt je nach Netzwerknachfrage. _Wenn_ für einen bestimmten Tag ein durchschnittlicher Gaspreis von mindestens 16 Gwei beobachtet wird, kompensiert dies effektiv die ~1.700 ETH, die an die Validatoren ausgegeben werden, und bringt die Netto-ETH-Inflation für diesen Tag auf Null oder weniger. - ## Vor dem Merge (historisch) {#pre-merge} @@ -61,7 +60,10 @@ Gesamtes ETH-Angebot: **~120.520.000 ETH** (zum Zeitpunkt von The Merge im Septe **~88,7 %** der Emission ging an Miner auf der Ausführungsebene (4,09 / 4,61 \* 100) -**~11,3 %** wurden an Staker auf der Konsensebene emittiert (0,52 / 4,61 \* 100)
    +**~11,3 %** wurden an Staker auf der Konsensebene emittiert (0,52 / 4,61 \* 100) + +
    +
    ## Nach dem Merge (heute) {#post-merge} @@ -92,7 +94,10 @@ Wenn mehr Validatoren aussteigen, wird die maximale Anzahl der ausscheidenden Va Gesamte annualisierte Emissionsrate: **~0,52 %** -Nettorückgang der jährlichen ETH-Emission: **~88,7 %** ((4,61 % - 0,52 %) / 4,61 % \* 100)
    +Nettorückgang der jährlichen ETH-Emission: **~88,7 %** ((4,61 % - 0,52 %) / 4,61 % \* 100) + +
    +
    ## Die Verbrennung {#the-burn} @@ -102,7 +107,10 @@ Die Gegenkraft zur ETH-Ausgabe ist die Geschwindigkeit, mit der die ETH verbrann -Das Verbrennen von Gebühren wurde mit dem [London-Upgrade](/ethereum-forks/#london) im August 2021 eingeführt und ist seit The Merge unverändert.
    +Das Verbrennen von Gebühren wurde mit dem [London-Upgrade](/ethereum-forks/#london) im August 2021 eingeführt und ist seit The Merge unverändert. + +
    +
    Zusätzlich zu den Gebühren, die durch das London Upgrade verbrannt werden, können Validatoren auch mit Strafen belegt werden, wenn sie offline sind, oder schlimmer noch, ihr Stake kann gekürzt werden, wenn sie gegen bestimmte Regeln verstoßen, die die Netzsicherheit gefährden. Diese Strafen führen zu einer Verringerung des ETH-Guthabens dieses Validators, das nicht auf ein anderes Konto überwiesen wird, sondern effektiv verbrannt/aus dem Verkehr gezogen wird. diff --git a/public/content/translations/de/roadmap/pbs/index.md b/public/content/translations/de/roadmap/pbs/index.md index a5f0b4ea8a5..5f56b2c803d 100644 --- a/public/content/translations/de/roadmap/pbs/index.md +++ b/public/content/translations/de/roadmap/pbs/index.md @@ -1,6 +1,6 @@ --- title: Proposer-Builder-Trennung -description: Lerne wie und warum die Ethereum-Validatoren ihre Verantwortung für die Blockproduktion und Blockübertragung aufteilen. +description: "Lerne wie und warum die Ethereum-Validatoren ihre Verantwortung für die Blockproduktion und Blockübertragung aufteilen." lang: de --- @@ -21,7 +21,6 @@ Ein Beispiel hierfür sind Einschlusslisten, die verwendet werden können, damit Einflussreiche Organisationen können Validatoren dazu drängen, Transaktionen zu zensieren, die von oder zu bestimmten Adressen erfolgen. Die Validatoren geben diesem Druck nach, indem sie Adressen auf der schwarzen Liste in ihrem Transaktionspool erkennen und sie auf den von ihnen vorgeschlagenen Blöcken auslassen. Nach der Einführung von PBS wird dies nicht mehr möglich sein, da Block-Vorschlagende nicht mehr wissen werden, welche Transaktionen sie in ihren Blöcken übertragen. Für bestimmte Personen oder Anwendungen könnte es wichtig sein, die Zensurvorschriften einzuhalten, z. B. wenn sie in ihrer Region gesetzlich vorgeschrieben sind. In solchen Fällen erfolgt die Einhaltung auf Anwendungsebene, während das Protokoll weiterhin erlaubnis- und zensurfrei bleibt. - ## PBS und MEV {#pbs-and-mev} @@ -32,7 +31,8 @@ Das PBS löst dieses Problem, indem es die Wirtschaftlichkeit von MEV neu konfig -Aufgrund der verbesserten Belohnungen durch ausgeklügelte MEV-Strategien könnten Einzelpersonen dazu angeregt werden, sich Pools anzuschließen, anstatt alleine zu staken. Die Trennung der Block-Erstellung vom Block-Vorschlagsverfahren führt dazu, dass die extrahierte MEV auf eine größere Anzahl von Validatoren verteilt wird, anstatt sich bei dem effektivsten MEV-Sucher zu zentralisieren. Gleichzeitig nimmt das Erlauben von spezialisierten Blockproduzenten die Last der Blockerstellung weg vom Einzelnen und verhindert das Stehlen von MEV einzelner für sich selber, während die Anzahl individueller, unabhängiger Validatoren, die Blöcke auf ehrliche weise überprüfen, maximiert wird. Das wichtige Konzept ist die "Beweiser-Verifizierer Asymetrie", welche die Idee beschreibt, dass zentralisierte Blockproduktion okay ist, solange es ein robustes und maximal dezentralisiertes Netzwerk von ehrlichen Validatoren gibt, die die Blöcke überprüfen. Dezentralisierung ist ein Mittel, kein Endziel - worauf es uns ankommt, sind ehrliche Blöcke. +Aufgrund der verbesserten Belohnungen durch ausgeklügelte MEV-Strategien könnten Einzelpersonen dazu angeregt werden, sich Pools anzuschließen, anstatt alleine zu staken. Die Trennung der Block-Erstellung vom Block-Vorschlagsverfahren führt dazu, dass die extrahierte MEV auf eine größere Anzahl von Validatoren verteilt wird, anstatt sich bei dem effektivsten MEV-Sucher zu zentralisieren. Gleichzeitig nimmt das Erlauben von spezialisierten Blockproduzenten die Last der Blockerstellung weg vom Einzelnen und verhindert das Stehlen von MEV einzelner für sich selber, während die Anzahl individueller, unabhängiger Validatoren, die Blöcke auf ehrliche weise überprüfen, maximiert wird. Das wichtige Konzept ist die "Beweiser-Verifizierer Asymetrie", welche die Idee beschreibt, dass zentralisierte Blockproduktion okay ist, solange es ein robustes und maximal dezentralisiertes Netzwerk von ehrlichen Validatoren gibt, die die Blöcke überprüfen. Dezentralisierung ist ein Mittel, kein Endziel - worauf es uns ankommt, sind ehrliche Blöcke. + ## PBS und Danksharding {#pbs-and-danksharding} diff --git a/public/content/translations/de/roadmap/pectra/7702/index.md b/public/content/translations/de/roadmap/pectra/7702/index.md index d673a6204f1..8ff65bd87dd 100644 --- a/public/content/translations/de/roadmap/pectra/7702/index.md +++ b/public/content/translations/de/roadmap/pectra/7702/index.md @@ -1,6 +1,6 @@ --- title: Pectra 7702-Richtlinien -description: Erfahren Sie mehr über 7702 in der Pectra-Version +description: "Erfahren Sie mehr über 7702 in der Pectra-Version" lang: de --- diff --git a/public/content/translations/de/roadmap/pectra/index.md b/public/content/translations/de/roadmap/pectra/index.md index f0484d5ff48..f8401707961 100644 --- a/public/content/translations/de/roadmap/pectra/index.md +++ b/public/content/translations/de/roadmap/pectra/index.md @@ -1,6 +1,6 @@ --- title: Prag-Electra (Pectra) -description: Erfahre mehr über das Pectra-Protokoll-Upgrade +description: "Erfahre mehr über das Pectra-Protokoll-Upgrade" lang: de --- diff --git a/public/content/translations/de/roadmap/pectra/maxeb/index.md b/public/content/translations/de/roadmap/pectra/maxeb/index.md index cb909971712..21b9253d02e 100644 --- a/public/content/translations/de/roadmap/pectra/maxeb/index.md +++ b/public/content/translations/de/roadmap/pectra/maxeb/index.md @@ -1,6 +1,6 @@ --- title: Pectra MaxEB -description: Erfahren Sie mehr über MaxEB in der Pectra-Version +description: "Erfahren Sie mehr über MaxEB in der Pectra-Version" lang: de --- diff --git a/public/content/translations/de/roadmap/scaling/index.md b/public/content/translations/de/roadmap/scaling/index.md index 083067283dc..997847da60b 100644 --- a/public/content/translations/de/roadmap/scaling/index.md +++ b/public/content/translations/de/roadmap/scaling/index.md @@ -1,6 +1,6 @@ --- title: Ethereum zu skalieren -description: Durch das Bündeln von Transaktionen off-chain verringern Rollups die Kosten für den Anwender. Die derzeitige Art und Weise, wie Rollups Daten verwenden, ist jedoch zu teuer und schränkt ein, wie günstig Transaktionen sein könnten. Proto-Danksharding behebt das. +description: "Durch das Bündeln von Transaktionen off-chain verringern Rollups die Kosten für den Anwender. Die derzeitige Art und Weise, wie Rollups Daten verwenden, ist jedoch zu teuer und schränkt ein, wie günstig Transaktionen sein könnten. Proto-Danksharding behebt das." lang: de image: /images/roadmap/roadmap-transactions.png alt: "Ethereum-Roadmap" diff --git a/public/content/translations/de/roadmap/secret-leader-election/index.md b/public/content/translations/de/roadmap/secret-leader-election/index.md index 2537e8e604b..907d7607163 100644 --- a/public/content/translations/de/roadmap/secret-leader-election/index.md +++ b/public/content/translations/de/roadmap/secret-leader-election/index.md @@ -1,6 +1,6 @@ --- -title: Geheime Führungswahl -description: Erklärung wie geheime Führungswahlen helfen können, Validatoren von Angreifen zu schützen +title: "Geheime Führungswahl" +description: "Erklärung wie geheime Führungswahlen helfen können, Validatoren von Angreifen zu schützen" lang: de summaryPoints: - Die IP-Adresse von Blockantragstellern (Proposern) kann im Vorne herein bekannt sein, was sie Angriffen aussetzt diff --git a/public/content/translations/de/roadmap/security/index.md b/public/content/translations/de/roadmap/security/index.md index ddd71c58df3..718d56ee887 100644 --- a/public/content/translations/de/roadmap/security/index.md +++ b/public/content/translations/de/roadmap/security/index.md @@ -1,6 +1,6 @@ --- title: Ein sichereres Ethereum Netzwerk -description: Ethereum ist die sicherste und dezentralisierte Smart-Contract-Plattform, die es gibt. Es gibt jedoch immer noch Verbesserungen, die vorgenommen werden können, um Ethereum bis weit in die Zukunft hinein gegen jegliche Art von Angriffen zu wappnen. +description: "Ethereum ist die sicherste und dezentralisierte Smart-Contract-Plattform, die es gibt. Es gibt jedoch immer noch Verbesserungen, die vorgenommen werden können, um Ethereum bis weit in die Zukunft hinein gegen jegliche Art von Angriffen zu wappnen." lang: de image: /images/roadmap/roadmap-security.png alt: "Ethereum-Roadmap" diff --git a/public/content/translations/de/roadmap/single-slot-finality/index.md b/public/content/translations/de/roadmap/single-slot-finality/index.md index ce1bc16c003..833e15c5bad 100644 --- a/public/content/translations/de/roadmap/single-slot-finality/index.md +++ b/public/content/translations/de/roadmap/single-slot-finality/index.md @@ -1,6 +1,6 @@ --- -title: Einzelplatzfinalität (single slot finality) -description: Erklärung von Einzelplatzfinalität (single slot finality) +title: "Einzelplatzfinalität (single slot finality)" +description: "Erklärung von Einzelplatzfinalität (single slot finality)" lang: de --- @@ -39,7 +39,8 @@ Der derzeitige Konsensmechanismus verbindet Attestierungen mehrerer Validatoren, Dieser Prozess gibt für jeden Validatoren ausreichende Kapazität, in jeder Epoche abzustimmen, da 32 Plätze \* 64 Komitees \* 256 Validator pro Komitee 524 288 Validatoren pro Epoche ergeben. Zum Zeitpunkt der Erstellung dieses Artikels (Februar 2023) gibt es ~513 000 aktive Validatoren. -In diesem Schema ist es für jeden Validatoren möglich für einen Block abzustimmen, indem er seine Attestierungen über die gesamte Epoche verteilen. Jedoch gibt es potentielle Wege diesen Mechanismus zu verbessern, sodass _jeder Validator die Chance hat in jedem Platz zu attestieren_. +In diesem Schema ist es für jeden Validatoren möglich für einen Block abzustimmen, indem er seine Attestierungen über die gesamte Epoche verteilen. Jedoch gibt es potentielle Wege diesen Mechanismus zu verbessern, sodass _jeder Validator die Chance hat in jedem Platz zu attestieren_. + Seit der Ethereum Konsensmechanismus entwickelt wurde, hat sich das Unterschriften-Aggregationsschema (BLS) als deutlich skalierbarer als erwartet erwiesen, dabei wurde auch die Fähigkeit von Clients, die Unterschriften zu verarbeiten und unterschreiben, verbessert. Es stellt sich heraus, dass das Verarbeiten von Attestierungen in großer Anzahl von Validatoren in einem einzelnen Platz möglich ist. Zum Beispiel müssten Nodes, bei einer Million Validatoren, die zweimal pro Platz wählen und dem Verändern von der Zeit pro Slot (Platz) auf 16 Sekunden, Unterschriften mit mindestens 125 000 Aggregationen pro Sekunde funktionieren, um alle Attestierungen innerhalb des Platzes zu verarbeiten. In Wirklichkeit benötigt ein gewöhnlicher Computer ungefähr 500 Nanosekunden um eine Unterschrift zu verifizieren, das heißt, dass 125 000 Verifikationen in ~62,5 ms durchgeführt werden könnten. Das wäre weit unter der Ein-Sekunden-Grenze. diff --git a/public/content/translations/de/roadmap/statelessness/index.md b/public/content/translations/de/roadmap/statelessness/index.md index 8d179ad2404..72b96654c0c 100644 --- a/public/content/translations/de/roadmap/statelessness/index.md +++ b/public/content/translations/de/roadmap/statelessness/index.md @@ -1,6 +1,6 @@ --- title: Zustandslosigkeit, Zustandsverfall und Verfall des Vergangenen (history expiry) -description: Erklärung vom Verfall des Vergangenen (history expiry) und der Zustandslosigkeit auf Ethereum +description: "Erklärung vom Verfall des Vergangenen (history expiry) und der Zustandslosigkeit auf Ethereum" lang: de --- @@ -72,7 +72,8 @@ Damit dies geschehen kann, müssen [Verkle-Trees](/roadmap/verkle-trees/) bereit Zustandslosigkeit stützt sich auf Blockerzeuger, welche eine Kopie der vollen Zustandsdaten pflegen, sodass sie Zeugen generieren können, welche genutzt werden um Blöcke zu verifizieren. Andere Nodes müssen die Zustandsdaten nicht abrufen, da alle benötigten Informationen für das Verifizieren eines Blocks im Zeugen vorhanden sind. Das erzeugt eine Situation, in der das Vorschlagen eines Blocks teuer, das Verifizieren jedoch günstig ist, was bedeutet, das weniger Operatoren einen blockvorschlagenden Node betreiben werden. Jedoch ist die Dezentralisation von Block Proposern nicht kritisch, solange möglichst viele Teilnehmende unabhängig voneinander verifizieren können, dass der vorgeschlagene Block valide ist. -Lesen Sie mehr in Dankrads Notizen +Lesen Sie mehr in Dankrads Notizen + Block Proposer nutzen die Zustandsdaten, um "Zeugen" zu erzeugen - die minimale Menge an Daten, die die Werte des Zustands beweisen, welche während einer Transaktion in einem Block geändert werden. Andere Validatoren halten nicht den Zustand, sie speichern nur die Wurzel des Zustands (state root) (einen Hash des gesamten Zustands). Sie erhalten einen Block und einen Zeugen und nutzen diese, um ihre Wurzel des Zustands zu aktualisieren. Das macht einen validierenden Node extrem leichtgewichtig. diff --git a/public/content/translations/de/roadmap/user-experience/index.md b/public/content/translations/de/roadmap/user-experience/index.md index 84901f49964..54bc14a5972 100644 --- a/public/content/translations/de/roadmap/user-experience/index.md +++ b/public/content/translations/de/roadmap/user-experience/index.md @@ -1,6 +1,6 @@ --- title: Verbesserung der Benutzererfahrung -description: Für die meisten Menschen ist es immer noch zu kompliziert Ethereum zu benutzen. Um die Massenakzeptanz von Ethereum zu fördern, müssen die Eintrittsbarrieren drastisch gesenkt werden - die Nutzer müssen die Vorteile eines dezentralisierten, erlaubnisfreien und zensurresistenten Zugangs zu Ethereum nutzen können, der jedoch so reibungslos sein muss wie die Nutzung einer herkömmlichen Web2-App. +description: "Für die meisten Menschen ist es immer noch zu kompliziert Ethereum zu benutzen. Um die Massenakzeptanz von Ethereum zu fördern, müssen die Eintrittsbarrieren drastisch gesenkt werden - die Nutzer müssen die Vorteile eines dezentralisierten, erlaubnisfreien und zensurresistenten Zugangs zu Ethereum nutzen können, der jedoch so reibungslos sein muss wie die Nutzung einer herkömmlichen Web2-App." lang: de image: /images/roadmap/roadmap-ux.png alt: "Ethereum-Roadmap" diff --git a/public/content/translations/de/roadmap/verkle-trees/index.md b/public/content/translations/de/roadmap/verkle-trees/index.md index 8dc8eabc9a0..b529c4a6431 100644 --- a/public/content/translations/de/roadmap/verkle-trees/index.md +++ b/public/content/translations/de/roadmap/verkle-trees/index.md @@ -18,7 +18,6 @@ Verkle Bäume sind ein kritischer Schritt hin zu Zustandsfreien Ethereum Clients Ethereum Clients nutzen momentan eine Datenstruktur, die als Patricia Merkle Trie bekannt ist, um ihre Zustandsdaten zu speichern. Informationen über einzelne Accounts sind als Blätter auf der Baumstruktur gespeichert und Paare von Blättern werden wiederholt gehashed, bis nur ein einzelner Hash bleibt. Der endgültige Hash ist bekannt als die "Wurzel". Um Blöcke zu überprüfen, führen Ethereum Clients alle Transaktionen in einem Block aus und aktualisieren ihren lokalen Zustandsbaum. Der Block wird als gültig angesehen, wenn die Wurzel des lokalen Baumes identisch zu der vom Block-Vorschlagenden ist, weil jeder Unterschied in der Berechnung des Block-Vorschlagenden und der überprüfenden Node einen komplett anderen Wurzelhash ergeben würde. Das Problem hierbei ist, dass die Überprüfung der Blockchain erfordert, dass jeder Client den gesamten Zustandsbaum des Kopf-Blocks und mehrere historische Blöcke (der Standard in Geth ist, die Zustandsdaten für 128 Blöcke hinter dem Kopf zu behalten) erfordert. Dies setzt voraus, dass Clients über große Mengen an Speicherplatz verfügen, was wiederum eine Barriere für günstige ressourcenschonende Hardware ist. Eine Lösung hierfür ist ein Update des Zutandsbaumes auf eine effizientere Struktur (Verkle Tree), die Daten effizient über kleine "Zeugen" teilen kann, anstatt den vollständigen Zustand von Ethereum zu übertragen. Den Datenzustand in Verkle Trees umzuschreiben, ist ein großer Schritt hin zu Zustandsfreien Clients. - ## Was ist ein Zeuge und warum brauchen wir sie? {#what-is-a-witness} @@ -34,7 +33,6 @@ In einem Polynombindungs-Schema haben die Zeugen überschaubare Größen, die le Die Größe des Zeugen variiert abhängig von der Anzahl der Blätter, die er enthält. Davon ausgehend, dass ein Zeuge 1000 Blätter abdeckt, wäre ein Zeuge für einen Merkle Baum ungefähr 3,5 MB (von 7 Ebenen im Trie ausgehend). Ein Zeuge für die selben Daten in einem Verkle Baum (von 4 Ebenen zum Baum ausgehend) würde ungefähr 150 kB an Daten ergeben -**etwa 23x kleiner**. Diese Reduktion der Zeugengröße wird Zeugen in zustandsfreien Clients ermöglichen, akzeptabel klein zu sein. Polynomzeugen sind 0,128–1 kB groß; abhängig davon, welches spezifische Polynom-Commitment verwendet wird. - ## Wie sieht die Struktur von Verkle Bäumen aus? Was ist die Struktur eines Verkle-Trees? {#what-is-the-structure-of-a-verkle-tree} diff --git a/public/content/translations/de/security/index.md b/public/content/translations/de/security/index.md index 609c15b8a28..ae63e484602 100644 --- a/public/content/translations/de/security/index.md +++ b/public/content/translations/de/security/index.md @@ -1,5 +1,5 @@ --- -title: Ethereum – Sicherheits- und Betrugsvorbeugung +title: "Ethereum – Sicherheits- und Betrugsvorbeugung" description: Ethereum sicher nutzen lang: de --- diff --git a/public/content/translations/de/smart-contracts/index.md b/public/content/translations/de/smart-contracts/index.md index 2d6b14bad01..d4e94949277 100644 --- a/public/content/translations/de/smart-contracts/index.md +++ b/public/content/translations/de/smart-contracts/index.md @@ -1,7 +1,7 @@ --- title: Smart Contracts metaTitle: "Smart Contracts: Was sie sind und ihre Vorteile" -description: Eine nicht-technische Einführung in Smart Contracts +description: "Eine nicht-technische Einführung in Smart Contracts" lang: de --- diff --git a/public/content/translations/de/social-networks/index.md b/public/content/translations/de/social-networks/index.md index 219d95dfd67..fc9b2ffa397 100644 --- a/public/content/translations/de/social-networks/index.md +++ b/public/content/translations/de/social-networks/index.md @@ -1,13 +1,13 @@ --- title: Dezentralisierte soziale Netzwerke -description: Eine Übersicht über dezentralisierte soziale Netzwerke in der Ethereum-Blockchain +description: "Eine Übersicht über dezentralisierte soziale Netzwerke in der Ethereum-Blockchain" lang: de template: use-cases emoji: ":mega:" sidebarDepth: 2 image: /images/ethereum-learn.png -summaryPoint1: Blockchain-basierte Plattformen für soziale Interaktionen und Content-Erstellung und -Verteilung. -summaryPoint2: Dezentralisierte Social-Media-Netzwerke schützen die Privatsphäre der Benutzer und erhöhen Datensicherheit. +summaryPoint1: "Blockchain-basierte Plattformen für soziale Interaktionen und Content-Erstellung und -Verteilung." +summaryPoint2: "Dezentralisierte Social-Media-Netzwerke schützen die Privatsphäre der Benutzer und erhöhen Datensicherheit." summaryPoint3: Token und NFTs erschaffen neue Wege zur Monetarisierung von Inhalten. --- diff --git a/public/content/translations/de/staking/dvt/index.md b/public/content/translations/de/staking/dvt/index.md index 1362f42de9d..9c848501488 100644 --- a/public/content/translations/de/staking/dvt/index.md +++ b/public/content/translations/de/staking/dvt/index.md @@ -1,6 +1,6 @@ --- title: Verteilte Validierungstechnologie (VVT) -description: Verteilte Validierungstechnologie (VVT) ermöglicht den verteilten Betrieb eines Ethereum-Validators durch mehrere Parteien. +description: "Verteilte Validierungstechnologie (VVT) ermöglicht den verteilten Betrieb eines Ethereum-Validators durch mehrere Parteien." lang: de --- diff --git a/public/content/translations/de/staking/pools/index.md b/public/content/translations/de/staking/pools/index.md index d8961d00818..cdf8d71f63e 100644 --- a/public/content/translations/de/staking/pools/index.md +++ b/public/content/translations/de/staking/pools/index.md @@ -1,6 +1,6 @@ --- title: Gepooltes Staking -description: Erfahren Sie mehr über Staking-Pools +description: "Erfahren Sie mehr über Staking-Pools" lang: de template: staking emoji: ":money_with_wings:" @@ -13,8 +13,7 @@ summaryPoints: - Halten Sie Staking-Token in Ihrer eigenen Wallet --- -## Was sind Staking-Pools? Was sind Staking-Pools? {#what-are-staking-pools} - +## Was sind Staking-Pools? {#what-are-staking-pools} Staking-Pools sind ein kollaborativer Ansatz, um es vielen Menschen mit kleineren ETH-Beträgen zu ermöglichen, die 32 ETH zu erhalten, die zur Aktivierung eines Satzes von Validator-Schlüsseln erforderlich sind. Die Pooling-Funktionalität wird innerhalb des Protokolls nicht nativ unterstützt, daher wurden separate Lösungen entwickelt, um diesen Bedarf zu decken. Einige Pools arbeiten mit Smart Contracts, bei denen Gelder in einen Vertrag eingezahlt werden können, der Ihren Einsatz (Stake) vertrauenswürdig verwaltet und verfolgt und Ihnen einen Token ausstellt, der diesen Wert widerspiegelt. Andere Pools beinhalten möglicherweise keine Smart-Contracts und werden stattdessen off-chain vermittelt. @@ -68,13 +67,16 @@ Sofort! Die Aktualisierung des Netzwerks auf Shanghai/Capella erfolgte im April Alternativ dazu ermöglichen Pools, die einen ERC-20 Staking-Token verwenden, den Handel mit diesem Token auf dem freien Markt, so dass Sie Ihre Staking-Position verkaufen können, ohne tatsächlich ETH aus dem Staking-Vertrag zu entnehmen. -Mehr zu Staking-Auszahlungen\n +Mehr zu Staking-Auszahlungen\n + -\nEs gibt viele Ähnlichkeiten zwischen diesen gepoolten Staking-Optionen und zentralisierten Börsen, wie z. B. die Möglichkeit, kleine ETH-Beträge zu staken und sie zu bündeln, um Validatoren zu aktivieren. + +\nEs gibt viele Ähnlichkeiten zwischen diesen gepoolten Staking-Optionen und zentralisierten Börsen, wie z. B. die Möglichkeit, kleine ETH-Beträge zu staken und sie zu bündeln, um Validatoren zu aktivieren. Im Gegensatz zu zentralisierten Börsen nutzen viele andere gepoolte Staking-Optionen Smart Contracts und/oder Staking-Token, bei denen es sich in der Regel um ERC-20-Token handelt, die Sie in Ihrer eigenen Wallet halten und wie jeden anderen Token kaufen oder verkaufen können. Dies bietet eine gewisse Souveränität und Sicherheit, da Sie die Kontrolle über Ihre Token besitzen. Allerdings haben Sie immer noch keine direkte Kontrolle über den Validator-Client, der in Ihrem Namen im Hintergrund Attestierungen ausgibt. -Einige Pooling-Optionen sind im Hinblick auf die Nodes, die sie unterstützen, stärker dezentralisiert als andere. Um die Gesundheit und Dezentralisierung des Netzwerks zu fördern, werden Staker immer dazu ermutigt, einen Pooling-Service auszuwählen, der eine genehmigungsfreie, dezentrale Gruppe von Node-Betreibern ermöglicht. +Einige Pooling-Optionen sind im Hinblick auf die Nodes, die sie unterstützen, stärker dezentralisiert als andere. Um die Gesundheit und Dezentralisierung des Netzwerks zu fördern, werden Staker immer dazu ermutigt, einen Pooling-Service auszuwählen, der eine genehmigungsfreie, dezentrale Gruppe von Node-Betreibern ermöglicht. + ## Weiterführende Lektüre {#further-reading} diff --git a/public/content/translations/de/staking/saas/index.md b/public/content/translations/de/staking/saas/index.md index 826943a8f9e..c141b6873c9 100644 --- a/public/content/translations/de/staking/saas/index.md +++ b/public/content/translations/de/staking/saas/index.md @@ -1,6 +1,6 @@ --- title: Staking als Service -description: Erfahren Sie mehr über Staking als Service +description: "Erfahren Sie mehr über Staking als Service" lang: de template: staking emoji: ":money_with_wings:" @@ -70,20 +70,24 @@ Das Aktualisieren der Auszahlungsberechtigungen ist ein erforderlicher Schritt, Stellen Sie sicher, dass Sie diese Seed-Phrase sicher aufbewahren, sonst können Sie Ihre Auszahlungsschlüssel nicht generieren, wenn es soweit ist. -\*Staker, die bei der Ersteinzahlung eine Auszahlungsadresse angegeben haben, müssen dies nicht festlegen. Bitte wenden Sie sich an Ihren SaaS-Anbieter, um Unterstützung bei der Vorbereitung Ihres Validators zu erhalten. +\*Staker, die bei der Ersteinzahlung eine Auszahlungsadresse angegeben haben, müssen dies nicht festlegen. Bitte wenden Sie sich an Ihren SaaS-Anbieter, um Unterstützung bei der Vorbereitung Ihres Validators zu erhalten. + -\nStaker müssen (sofern nicht bereits bei der Ersteinzahlung geschehen) eine Auszahlungsadresse bereitstellen. Belohnungen werden daraufhin automatisch alle paar Tage in regelmäßigen Abständen ausgezahlt. + +\nStaker müssen (sofern nicht bereits bei der Ersteinzahlung geschehen) eine Auszahlungsadresse bereitstellen. Belohnungen werden daraufhin automatisch alle paar Tage in regelmäßigen Abständen ausgezahlt. Validatoren haben auch die Möglichkeit, ihre Tätigkeit als Validator zu beenden. Das ermöglicht die Auszahlung ihres restlichen ETH-Guthabens. Konten, die eine Auszahlungsadresse angegeben und den Austrittsprozess abgeschlossen haben, erhalten ihr gesamtes Guthaben bei der nächsten Validatorendurchsicht auf die angegebene Auszahlungsadresse. -Mehr zu Staking-Auszahlungen\n +Mehr zu Staking-Auszahlungen\n + Durch die Nutzung eines SaaS-Anbieters vertrauen Sie den Betrieb Ihrer Nodes jemand anderem an. Dies birgt das Risiko einer schlechten Node-Leistung, auf die Sie keinen Einfluss haben. Falls Ihr Validator geslashed wird, wird Ihr Validator-Guthaben bestraft und zwangsweise aus dem Validator-Pool entfernt. Nach Abschluss des Slashing-/Austrittsprozesses werden diese Mittel an die dem Validator zugewiesene Auszahlungsadresse übertragen. Dies erfordert die Angabe einer Auszahlungsadresse zur Aktivierung. Diese Adresse kann bei der anfänglichen Einzahlung angegeben worden sein. Falls nicht, müssen die Auszahlungsschlüssel des Validators verwendet werden, um eine Nachricht zu unterschreiben, die eine Auszahlungsadresse angibt. Wenn keine Auszahlungsadresse angegeben wurde, bleibt das Guthaben bis zur Angabe gesperrt. -Für weitere Informationen zu Garantien oder Versicherungsoptionen sowie zur Anleitung zur Bereitstellung einer Abhebungsadresse wenden Sie sich bitte an Ihren individuellen SaaS-Anbieter. Wenn Sie lieber die volle Kontrolle über Ihr Validator Setup haben möchten, [erfahren Sie mehr darüber, wie Sie Ihr ETH alleine einsetzen](/staking/solo/). +Für weitere Informationen zu Garantien oder Versicherungsoptionen sowie zur Anleitung zur Bereitstellung einer Abhebungsadresse wenden Sie sich bitte an Ihren individuellen SaaS-Anbieter. Wenn Sie lieber die volle Kontrolle über Ihr Validator Setup haben möchten, [erfahren Sie mehr darüber, wie Sie Ihr ETH alleine einsetzen](/staking/solo/). + ## Weiterführende Lektüre {#further-reading} diff --git a/public/content/translations/de/staking/solo/index.md b/public/content/translations/de/staking/solo/index.md index d0f31e3ad77..0770029cc61 100644 --- a/public/content/translations/de/staking/solo/index.md +++ b/public/content/translations/de/staking/solo/index.md @@ -1,6 +1,6 @@ --- title: Setzen Sie Ihre ETH zu Hause ein -description: Eine Übersicht über die ersten Schritte beim Home-Staking Ihres ETH +description: "Eine Übersicht über die ersten Schritte beim Home-Staking Ihres ETH" lang: de template: staking emoji: ":money_with_wings:" @@ -43,17 +43,20 @@ So sehr wir uns auch wünschen, dass Home-Staking für jeden zugänglich und ris Wenn Sie Ihren eigenen Knoten betreiben, sollten Sie sich etwas Zeit nehmen, um zu lernen, wie Sie die von Ihnen gewählte Software verwenden. Dazu gehört das Lesen der relevanten Dokumentation und die Kenntnis der Kommunikationskanäle dieser Entwicklerteams. -Je mehr Sie über die von Ihnen verwendete Software und die Funktionsweise von Proof-of-Stake verstehen, desto weniger riskant ist es als Staker und desto einfacher wird es, als Knotenbetreiber alle auftretenden Probleme zu beheben. +Je mehr Sie über die von Ihnen verwendete Software und die Funktionsweise von Proof-of-Stake verstehen, desto weniger riskant ist es als Staker und desto einfacher wird es, als Knotenbetreiber alle auftretenden Probleme zu beheben. + Das Einrichten von Knoten erfordert einen gewissen Grad an Vertrautheit im Umgang mit Computern, obwohl neue Tools dies im Laufe der Zeit einfacher machen. Das Verständnis der Kommandozeilenschnittstelle ist hilfreich, aber nicht mehr zwingend erforderlich. -Es erfordert auch eine sehr einfache Hardware-Einrichtung und ein gewisses Verständnis der empfohlenen Mindestspezifikationen. +Es erfordert auch eine sehr einfache Hardware-Einrichtung und ein gewisses Verständnis der empfohlenen Mindestspezifikationen. + So wie private Schlüssel Ihre Ethereum-Adresse sichern, müssen Sie auch speziell für Ihren Validator Schlüssel generieren. Sie müssen verstehen, wie Sie Seed-Phrases oder private Schlüssel sicher aufbewahren.{' '} -[Ethereum-Sicherheit und Betrugsprävention](/security/) +[Ethereum-Sicherheit und Betrugsprävention](/security/) + Hardware fällt gelegentlich aus, Netzwerkverbindungen schlagen fehl und Client-Software muss gelegentlich aktualisiert werden. Die Wartung von Knoten ist unvermeidlich und erfordert gelegentlich Ihre Aufmerksamkeit. Sie sollten sicherstellen, dass Sie über alle erwarteten Netzwerk-Upgrades oder andere wichtige Client-Upgrades informiert bleiben. @@ -66,7 +69,9 @@ Ihre Belohnungen sind proportional zu der Zeit, in der Ihr Validator online ist Im Gegensatz zu Inaktivitätsstrafen für das Offline-Sein ist Slashing eine wesentlich schwerwiegendere Strafe, die böswilligen Verstößen vorbehalten ist. Indem Sie einen Minderheits-Client betreiben und Ihre Schlüssel nur auf einem einzigen Gerät geladen haben, wird Ihr Risiko eines Slashings minimiert. Dennoch müssen sich alle Staker der Risiken des Slashings bewusst sein. - Mehr über Slashing und den Lebenszyklus von Validatoren + Mehr über Slashing und den Lebenszyklus von Validatoren + + @@ -125,7 +130,6 @@ Das sind einige der häufigsten Fragen zum Thema Staking. Es ist lohnenswert sic Ein Validator ist eine virtuelle Entität, die auf Ethereum lebt und am Konsens des Ethereum-Protokolls teilnimmt. Validatoren werden durch ein Guthaben, einen öffentlichen Schlüssel und andere Eigenschaften dargestellt. Ein Validator-Client ist die Software, die im Namen des Validators handelt, indem sie dessen privaten Schlüssel hält und verwendet. Ein einzelner Validator-Client kann viele Schlüsselpaare enthalten und somit viele Validatoren steuern. - @@ -137,14 +141,16 @@ Dieser Puffer verhindert auch, dass ein effektiver Saldo sinkt, bis er 0,25 ETH Jedes Schlüsselpaar, das einem Validator zugeordnet ist, benötigt mindestens 32 ETH, um aktiviert zu werden. Jedes darüber hinausgehende Guthaben kann jederzeit durch eine mit dieser Adresse signierte Transaktion an die zugehörige Auszahlungsadresse ausgezahlt werden. Alle Gelder, die das maximale effektive Guthaben übersteigen, werden in regelmäßigen Abständen automatisch ausgezahlt. -Wenn Ihnen Home-Staking zu anspruchsvoll erscheint, ziehen Sie die Nutzung eines [Staking-as-a-Service](/staking/saas/)-Anbieters in Betracht, oder sehen Sie sich die [Staking-Pools](/staking/pools/) an, wenn Sie mit weniger als 32 ETH arbeiten. +Wenn Ihnen Home-Staking zu anspruchsvoll erscheint, ziehen Sie die Nutzung eines [Staking-as-a-Service](/staking/saas/)-Anbieters in Betracht, oder sehen Sie sich die [Staking-Pools](/staking/pools/) an, wenn Sie mit weniger als 32 ETH arbeiten. + Offline zu gehen, während das Netzwerk ordnungsgemäß finalisiert, führt NICHT zu Slashing. Geringe Inaktivitätsstrafen fallen an, wenn Ihr Validator für eine bestimmte Epoche (jeweils 6,4 Minuten lang) nicht für Bestätigungen zur Verfügung steht, was sich jedoch stark von Slashing unterscheidet. Diese Strafen sind etwas geringer als die Belohnung, die Sie erhalten hätten, wenn der Validator für Bestätigungen zur Verfügung gestanden hätte. Die Verluste können durch eine ungefähr gleich lange Zeit, in der Sie wieder online sind, ausgeglichen werden. Beachten Sie, dass die Strafen für Inaktivität proportional zur Anzahl der gleichzeitig offline geschalteten Validatoren sind. In Fällen, in denen ein großer Teil des Netzwerks gleichzeitig offline ist, sind die Strafen für jeden dieser Validatoren höher als bei der Nichtverfügbarkeit eines einzelnen Validators. -In extremen Fällen, wenn das Netzwerk die Finalisierung einstellt, weil mehr als ein Drittel der Validatoren offline ist, erleiden diese Benutzer einen sogenannten quadratischen Inaktivitätsverlust, der einen exponentiellen Abfluss von ETH von Offline-Validator-Konten darstellt. Dies ermöglicht es dem Netzwerk, sich schließlich selbst zu heilen, indem die ETH inaktiver Validatoren verbrannt werden, bis ihr Guthaben 16 ETH erreicht. An diesem Punkt werden sie automatisch aus dem Validator-Pool entfernt. Die verbleibenden Online-Validatoren werden schließlich wieder mehr als 2/3 des Netzwerks ausmachen und so die erforderliche Supermajorität erreichen, um die Kette erneut zu finalisieren. +In extremen Fällen, wenn das Netzwerk die Finalisierung einstellt, weil mehr als ein Drittel der Validatoren offline ist, erleiden diese Benutzer einen sogenannten quadratischen Inaktivitätsverlust, der einen exponentiellen Abfluss von ETH von Offline-Validator-Konten darstellt. Dies ermöglicht es dem Netzwerk, sich schließlich selbst zu heilen, indem die ETH inaktiver Validatoren verbrannt werden, bis ihr Guthaben 16 ETH erreicht. An diesem Punkt werden sie automatisch aus dem Validator-Pool entfernt. Die verbleibenden Online-Validatoren werden schließlich wieder mehr als 2/3 des Netzwerks ausmachen und so die erforderliche Supermajorität erreichen, um die Kette erneut zu finalisieren. + Kurz gesagt, dies kann nie vollständig garantiert werden, aber wenn Sie in gutem Glauben handeln, einen Minderheits-Client betreiben und Ihre Signaturschlüssel jeweils nur auf einem Computer aufbewahren, ist das Risiko eines Slashings nahezu null. @@ -166,14 +172,16 @@ Einzelne Clients können sich in Bezug auf Leistung und Benutzeroberfläche geri Da alle Produktions-Clients die gleiche Grundfunktionalität bieten, ist es sehr wichtig, dass Sie einen Minderheits-Client wählen, d. h. einen Client, der derzeit NICHT von einer Mehrheit der Validatoren im Netzwerk verwendet wird. Dies mag kontraintuitiv klingen, aber der Betrieb eines Majoritäts- oder Supermajoritäts-Clients setzt Sie einem erhöhten Slashing-Risiko aus, falls in diesem Client ein Fehler auftritt. Der Betrieb eines Minderheits-Clients begrenzt diese Risiken drastisch. -Erfahren Sie mehr darüber, warum Client-Diversität entscheidend ist +Erfahren Sie mehr darüber, warum Client-Diversität entscheidend ist + Obwohl ein virtueller privater Server (VPS) als Ersatz für die Hardware zu Hause verwendet werden kann, sind der physische Zugang und der Standort Ihres Validator-Clients sehr wohl von Bedeutung. Zentralisierte Cloud-Lösungen wie Amazon Web Services oder Digital Ocean bieten den Komfort, keine Hardware beschaffen und betreiben zu müssen, gehen aber auf Kosten der Zentralisierung des Netzwerks. Je mehr Validator-Clients auf einer einzigen zentralisierten Cloud-Speicherlösung laufen, desto gefährlicher wird es für diese Benutzer. Jedes Ereignis, das diese Anbieter offline schaltet, sei es durch einen Angriff, regulatorische Anforderungen oder einfach nur Strom-/Internetausfälle, führt dazu, dass jeder Validator-Client, der auf diesen Server angewiesen ist, gleichzeitig offline geht. -Offline-Strafen sind proportional zur Anzahl der anderen, die gleichzeitig offline sind. Die Verwendung eines VPS erhöht das Risiko, dass Offline-Strafen schwerwiegender ausfallen, und erhöht Ihr Risiko von quadratischem Verlust oder Slashing, falls der Ausfall groß genug ist. Um Ihr eigenes Risiko und das Risiko für das Netzwerk zu minimieren, wird den Benutzern dringend empfohlen, ihre eigene Hardware zu beschaffen und zu betreiben. +Offline-Strafen sind proportional zur Anzahl der anderen, die gleichzeitig offline sind. Die Verwendung eines VPS erhöht das Risiko, dass Offline-Strafen schwerwiegender ausfallen, und erhöht Ihr Risiko von quadratischem Verlust oder Slashing, falls der Ausfall groß genug ist. Um Ihr eigenes Risiko und das Risiko für das Netzwerk zu minimieren, wird den Benutzern dringend empfohlen, ihre eigene Hardware zu beschaffen und zu betreiben. + @@ -185,7 +193,8 @@ Sobald die Auszahlungsdaten festgelegt sind, werden Prämienzahlungen (über den Um Ihr gesamtes Guthaben zu entsperren und zu erhalten, müssen Sie auch den Prozess des Verlassens Ihres Validators abschließen. -Mehr zu Staking-Auszahlungen\n +Mehr zu Staking-Auszahlungen\n + ## Weiterführende Lektüre {#further-reading} diff --git a/public/content/translations/de/staking/withdrawals/index.md b/public/content/translations/de/staking/withdrawals/index.md index 60812282b6b..f6c6f67b40f 100644 --- a/public/content/translations/de/staking/withdrawals/index.md +++ b/public/content/translations/de/staking/withdrawals/index.md @@ -1,6 +1,6 @@ --- title: Staking-Auszahlungen -description: Seite mit einer Zusammenfassung zu Staking-Push-Auszahlungen, wie sie funktionieren und was Staker tun müssen, um ihre Belohnungen zu erhalten +description: "Seite mit einer Zusammenfassung zu Staking-Push-Auszahlungen, wie sie funktionieren und was Staker tun müssen, um ihre Belohnungen zu erhalten" lang: de template: staking image: /images/staking/leslie-withdrawal.png @@ -42,7 +42,8 @@ Die Angabe einer Auszahlungsadresse ist ein erforderlicher Schritt für jedes Va -Jedem Validatorkonto kann nur ein einziges Mal eine Auszahlungsadresse zugewiesen werden. Sobald eine Adresse ausgewählt und an die Konsensebene übermittelt wurde, kann dies nicht mehr rückgängig gemacht oder geändert werden. Überprüfen Sie die Besitzverhältnisse und die Richtigkeit der angegebenen Adresse, bevor Sie sie einreichen. + +Jedem Validatorkonto kann nur ein einziges Mal eine Auszahlungsadresse zugewiesen werden. Sobald eine Adresse ausgewählt und an die Konsensebene übermittelt wurde, kann dies nicht mehr rückgängig gemacht oder geändert werden. Überprüfen Sie die Besitzverhältnisse und die Richtigkeit der angegebenen Adresse, bevor Sie sie einreichen. @@ -137,7 +138,8 @@ title="Kann ich eine Auszahlungsadresse, nachdem ich sie einmal angegeben habe, eventCategory="FAQ" eventAction="Once I have provided a withdrawal address, can I change it to an alternative withdrawal address?" eventName="read more"> -Nein, der Prozess zur Bereitstellung von Auszahlungsberechtigungen ist ein einmaliger Prozess und kann nach der Einreichung nicht mehr geändert werden. +Nein, der Prozess zur Bereitstellung von Auszahlungsberechtigungen ist ein einmaliger Prozess und kann nach der Einreichung nicht mehr geändert werden. + +Als Alternative zur Änderung der Auszahlungsadresse für einen bestimmten Validator können sich Benutzer dafür entscheiden, einen intelligenten Vertrag als ihre Auszahlungsadresse festzulegen, der Schlüsselrotationen handhaben könnte, wie zum Beispiel ein Safe. Benutzer, die ihre Mittel auf ihr eigenes extern kontrolliertes Konto (EOA) setzen, können einen vollständigen Ausstieg durchführen, um all ihre gestakten Mittel abzuheben, und dann mit neuen Anmeldeinformationen erneut staken. + Bist du in einem [Staking-Pool](/staking/pools/) oder hältst Staking-Token? Dann frage bei deinem Anbieter nach den Details zur Auszahlung, da die Handhabung je nach Dienst variiert. Im Allgemeinen sollten Benutzer in der Lage sein, ihr zugrundeliegendes gestaktes ETH zurückzufordern oder zu ändern, welchen Staking-Anbieter sie nutzen. Wenn ein bestimmter Pool zu groß wird, können Mittel abgezogen, eingelöst und mit einem kleineren Anbieter neu gestaked werden. Alternativ kannst du, wenn du genügend ETH besitzt, auch [von zu Hause aus staken](/staking/solo/). - -Ja, solange Ihr Validator eine Auszahlungsadresse angegeben hat. Diese muss einmal bereitgestellt werden, um Auszahlungen zu ermöglichen, danach werden Belohnungszahlungen automatisch alle paar Tage mit jedem Durchlauf des Validators ausgelöst. +Ja, solange Ihr Validator eine Auszahlungsadresse angegeben hat. Diese muss einmal bereitgestellt werden, um Auszahlungen zu ermöglichen, danach werden Belohnungszahlungen automatisch alle paar Tage mit jedem Durchlauf des Validators ausgelöst. + Nein, wenn Ihr Validator noch aktiv im Netzwerk ist, erfolgt keine automatische Auszahlung. Dies erfordert das manuelle Einleiten eines freiwilligen Ausstiegs. Sobald ein Validator den Ausstiegsprozess abgeschlossen hat und vorausgesetzt, das Konto verfügt über Auszahlungsberechtigungen, wird das verbleibende Guthaben dann während des nächsten Validator-Durchlaufs abgehoben. - Auszahlungen sind darauf ausgelegt, automatisch angestoßen zu werden, wobei alle ETH übertragen werden, die nicht aktiv zum Stake beitragen. Dies beinhaltet vollständige Salden für Konten, die den Ausstiegsprozess abgeschlossen haben. -Es ist nicht möglich, manuell spezifische Mengen an ETH zur Auszahlung anzufordern. +Es ist nicht möglich, manuell spezifische Mengen an ETH zur Auszahlung anzufordern. + Validator-Betreibern wird empfohlen, die Seite Startplattform für Staking-Auszahlungen zu besuchen. Dort können sie mehr Details darüber erfahren, wie Sie Ihren Validator auf Auszahlungen vorbereiten, sowie Informationen zum Zeitpunkt der Ereignisse und zur Funktionsweise von Auszahlungen erhalten. Um Ihr Setup zuerst auf einem Testnet auszuprobieren, besuchen Sie das Hoodi Testnet Staking Launchpad, um zu beginnen. - -Nein. Sobald ein Validator ausgetreten ist und sein gesamtes Guthaben abgehoben wurde, werden alle zusätzlichen Einzahlungen auf diesen Validator automatisch während des nächsten Validator-Durchlaufs an die Auszahlungsadresse übertragen. Um ETH erneut zu staken, muss ein neuer Validator aktiviert werden. +Nein. Sobald ein Validator ausgetreten ist und sein gesamtes Guthaben abgehoben wurde, werden alle zusätzlichen Einzahlungen auf diesen Validator automatisch während des nächsten Validator-Durchlaufs an die Auszahlungsadresse übertragen. Um ETH erneut zu staken, muss ein neuer Validator aktiviert werden. + ## Weiterführende Lektüre {#further-reading} diff --git a/public/content/translations/de/web3/index.md b/public/content/translations/de/web3/index.md index 36818219521..dbac1da16ba 100644 --- a/public/content/translations/de/web3/index.md +++ b/public/content/translations/de/web3/index.md @@ -1,6 +1,6 @@ --- title: Was ist Web3 und warum ist es wichtig? -description: Eine Einführung in Web3 – die nächste Entwicklung des Internets – und warum es wichtig ist. +description: "Eine Einführung in Web3 – die nächste Entwicklung des Internets – und warum es wichtig ist." lang: de --- @@ -69,7 +69,8 @@ Web3 ermöglicht direktes Eigentum durch [nicht-fungible Token (NFTs)](/glossary -
    Mehr über NFTs erfahren
    +
    Mehr über NFTs erfahren +
    Mehr zu NFTs @@ -97,7 +98,8 @@ Allerdings definieren Menschen viele Web3-Communities als DAOs. Diese Gemeinscha -
    Erfahren Sie mehr über DAOs
    +
    Erfahren Sie mehr über DAOs +
    Mehr über DAOs diff --git a/public/content/translations/de/what-are-apps/index.md b/public/content/translations/de/what-are-apps/index.md index 4239e12954c..7799ff1e5a5 100644 --- a/public/content/translations/de/what-are-apps/index.md +++ b/public/content/translations/de/what-are-apps/index.md @@ -1,14 +1,14 @@ --- title: Ethereum-Anwendungen metaTitle: Ethereum Anwendungen | Dezentrale Anwendungen auf Ethereum -description: Ethereum-Apps sind kostenlos, global nutzbar und basieren auf öffentlichen Blockchains statt auf privaten Unternehmensservern. Das heißt, Sie können in allen Projekten das gleiche Konto nutzen, und gleichzeitig Ihre Privatsphäre wahren. +description: "Ethereum-Apps sind kostenlos, global nutzbar und basieren auf öffentlichen Blockchains statt auf privaten Unternehmensservern. Das heißt, Sie können in allen Projekten das gleiche Konto nutzen, und gleichzeitig Ihre Privatsphäre wahren." lang: de template: use-cases emoji: ":handshake:" sidebarDepth: 2 showDropdown: false image: /images/doge-computer.png -summary: Ethereum-Apps sind kostenlos, global nutzbar und basieren auf öffentlichen Blockchains statt auf privaten Unternehmensservern. Das heißt, Sie können in allen Projekten das gleiche Konto nutzen, und gleichzeitig Ihre Privatsphäre wahren. +summary: "Ethereum-Apps sind kostenlos, global nutzbar und basieren auf öffentlichen Blockchains statt auf privaten Unternehmensservern. Das heißt, Sie können in allen Projekten das gleiche Konto nutzen, und gleichzeitig Ihre Privatsphäre wahren." --- ## Apps mit Superpower {#apps-with-superpowers} @@ -51,7 +51,6 @@ Apps laufen über Smart Contracts - Programmcodes, die auf der Ethereum-Blockcha
    ![](./developers-eth-blocks.png) -
    ## Ethereum-Apps sind wie Legosteine {#ethereum-apps-are-like-legos} diff --git a/public/content/translations/de/whitepaper/index.md b/public/content/translations/de/whitepaper/index.md index 52f9524c268..55187467578 100644 --- a/public/content/translations/de/whitepaper/index.md +++ b/public/content/translations/de/whitepaper/index.md @@ -1,6 +1,6 @@ --- title: Ethereum Whitepaper -description: Eine einleitende Arbeit zu Ethereum, veröffentlicht im Jahr 2013 vor seiner Einführung. +description: "Eine einleitende Arbeit zu Ethereum, veröffentlicht im Jahr 2013 vor seiner Einführung." lang: de sidebarDepth: 2 hideEditButton: true diff --git a/public/content/translations/de/wrapped-eth/index.md b/public/content/translations/de/wrapped-eth/index.md index 1c3f5433aaa..43f942a8cf0 100644 --- a/public/content/translations/de/wrapped-eth/index.md +++ b/public/content/translations/de/wrapped-eth/index.md @@ -1,6 +1,6 @@ --- -title: Was ist „Wrapped Ether“ (WETH) -description: Eine Einführung in Wrapped Ether (WETH) – ein ERC20-kompatibler Wrapper für Ether (ETH). +title: "Was ist „Wrapped Ether“ (WETH)" +description: "Eine Einführung in Wrapped Ether (WETH) – ein ERC20-kompatibler Wrapper für Ether (ETH)." lang: de --- @@ -8,7 +8,8 @@ lang: de -
    Verbinden Sie Ihr Wallet, um ETH auf einer beliebigen Chain auf [WrapETH.com](https://www.wrapeth.com/) zu wrappen oder zu unwrappen.
    +
    Verbinden Sie Ihr Wallet, um ETH auf einer beliebigen Chain auf [WrapETH.com](https://www.wrapeth.com/) zu wrappen oder zu unwrappen. +
    Ether (ETH) ist die Hauptwährung von Ethereum. Es wird für verschiedene Zwecke verwendet, wie Staking, als Währung und zur Bezahlung von Gasgebühren für Berechnungen. **WETH ist im Grunde eine erweiterte Form von ETH mit gewisser zusätzlicher Funktionalität, die von vielen Anwendungen und [ERC-20-Token](/glossary/#erc-20)** benötigt wird, welche andere Arten von digitalen Assets auf Ethereum darstellen. Um mit diesen Token arbeiten zu können, muss ETH dieselben Regeln befolgen, auch als ERC-20-Standard bekannt. @@ -40,19 +41,16 @@ Sie können WETH in ETH umwandeln, indem Sie den WETH-Smart Contract verwenden. Sie zahlen Gasgebühren, um ETH mit dem WETH-Vertrag zu verpacken oder zu entpacken. - WETH gilt allgemein als sicher, da es auf einem einfachen, bewährten Smart Contract basiert. Der WETH-Vertrag wurde zudem formal verifiziert, was den höchsten Sicherheitsstandard für Smart Contracts auf Ethereum darstellt. - Neben der [kanonischen Implementierung von WETH](https://etherscan.io/token/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2), die auf dieser Seite beschrieben ist, gibt es auch andere Varianten. Diese können benutzerdefinierte Token sein, die von App-Entwicklern erstellt wurden, oder Versionen, die auf anderen Blockchains herausgegeben wurden, und sich unterschiedlich verhalten oder unterschiedliche Sicherheitseigenschaften haben. **Überprüfen Sie immer die Token-Informationen, um zu erfahren, mit welcher WETH-Implementierung Sie interagieren.** - @@ -60,7 +58,6 @@ Neben der [kanonischen Implementierung von WETH](https://etherscan.io/token/0xc0 - [Ethereum-Mainnet](https://etherscan.io/token/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) - [Arbitrum](https://arbiscan.io/token/0x82af49447d8a07e3bd95bd0d56f35241523fbab1) - [Optimism](https://optimistic.etherscan.io/token/0x4200000000000000000000000000000000000006) - ## Weiterführende Lektüre {#further-reading} diff --git a/public/content/translations/de/zero-knowledge-proofs/index.md b/public/content/translations/de/zero-knowledge-proofs/index.md index e96689a66d4..b1b799bf0f4 100644 --- a/public/content/translations/de/zero-knowledge-proofs/index.md +++ b/public/content/translations/de/zero-knowledge-proofs/index.md @@ -1,6 +1,6 @@ --- title: Null-Wissen-Beweise -description: Eine nicht-technische Einführung in Zero-Knowledge-Beweise für Anfänger. +description: "Eine nicht-technische Einführung in Zero-Knowledge-Beweise für Anfänger." lang: de --- @@ -59,8 +59,8 @@ Zero-Knowledge-Beweise sind besonders nützlich im Kontext der [dezentralen Iden

    Erfahre mehr über Bhutan NDI in der Fallstudie zur dezentralen Identität.

    - -
    + +
    ### Proof of Humanity {#proof-of-humanity} From 5801c74817ac5b3632c62b04908ddd5bd26b99be Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 13 Feb 2026 12:39:21 +0000 Subject: [PATCH 4/9] fix(i18n): run sanitizer on de translations --- .../translations/de/ai-agents/index.md | 1 + .../translations/de/community/grants/index.md | 3 +-- .../translations/de/community/online/index.md | 27 ++++++++++++++++--- .../de/community/research/index.md | 2 +- .../translatathon/details/index.md | 2 +- .../translatathon/index.md | 2 +- public/content/translations/de/dao/index.md | 4 +-- .../de/decentralized-identity/index.md | 2 ++ public/content/translations/de/defi/index.md | 3 +-- .../pos/block-proposal/index.md | 1 + .../docs/intro-to-ethereum/index.md | 1 + .../docs/nodes-and-clients/index.md | 1 + .../developers/docs/scaling/plasma/index.md | 2 +- .../developers/docs/scaling/validium/index.md | 1 + .../developers/docs/smart-contracts/index.md | 1 + .../docs/smart-contracts/languages/index.md | 18 +++++++++++++ .../docs/smart-contracts/upgrading/index.md | 1 + .../de/developers/docs/wrapped-eth/index.md | 8 ++---- .../index.md | 2 +- .../tutorials/all-you-can-cache/index.md | 4 +-- .../developers/tutorials/app-plasma/index.md | 2 +- .../index.md | 2 +- .../index.md | 4 +-- .../erc-721-vyper-annotated-code/index.md | 3 ++- .../tutorials/erc20-annotated-code/index.md | 2 +- .../erc20-with-safety-rails/index.md | 2 +- .../tutorials/ethereum-for-web2-auth/index.md | 2 +- .../index.md | 2 +- .../index.md | 6 ++--- .../index.md | 2 +- .../index.md | 4 +-- .../index.md | 8 +++--- .../index.md | 4 +-- .../tutorials/ipfs-decentralized-ui/index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../reverse-engineering-a-contract/index.md | 2 +- .../tutorials/scam-token-tricks/index.md | 4 +-- .../tutorials/secret-state/index.md | 2 +- .../secure-development-workflow/index.md | 6 ++--- .../index.md | 2 +- .../tutorials/server-components/index.md | 2 +- .../developers/tutorials/short-abi/index.md | 2 +- .../index.md | 6 ++--- .../tutorials/stealth-addr/index.md | 2 +- .../index.md | 2 +- .../token-integration-checklist/index.md | 6 ++--- .../uniswap-v2-annotated-code/index.md | 5 ++-- .../tutorials/using-websockets/index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- .../translations/de/ethereum-forks/index.md | 2 +- .../index.md | 3 +-- .../how-to-revoke-token-access/index.md | 3 +-- .../de/guides/how-to-swap-tokens/index.md | 3 +-- .../de/guides/how-to-use-a-bridge/index.md | 3 +-- .../de/guides/how-to-use-a-wallet/index.md | 3 +-- public/content/translations/de/nft/index.md | 3 +-- .../content/translations/de/payments/index.md | 8 +++--- .../de/prediction-markets/index.md | 2 ++ .../de/roadmap/beacon-chain/index.md | 1 + .../translations/de/roadmap/dencun/index.md | 8 +++--- .../translations/de/roadmap/fusaka/index.md | 2 +- .../de/roadmap/merge/issuance/index.md | 6 +++++ .../translations/de/roadmap/pectra/index.md | 2 +- .../translations/de/staking/pools/index.md | 1 + .../translations/de/staking/solo/index.md | 1 + public/content/translations/de/web3/index.md | 6 ++--- .../translations/de/wrapped-eth/index.md | 3 +-- 69 files changed, 142 insertions(+), 100 deletions(-) diff --git a/public/content/translations/de/ai-agents/index.md b/public/content/translations/de/ai-agents/index.md index c35726ce1ad..b61f2b94e89 100644 --- a/public/content/translations/de/ai-agents/index.md +++ b/public/content/translations/de/ai-agents/index.md @@ -111,6 +111,7 @@ Während Lunas Social-Media-Kampagne #LunaMuralChallenge auf X wählte Luna die

    Gut zu wissen

    KI-Agenten und zugehörige Tools befinden sich noch in der frühen Entwicklung und sind sehr experimentell – verwenden Sie sie mit Vorsicht.

    +
    ## Kontrollieren Sie Ihre Wallet mit Chat-Befehlen {#control-your-wallet-using-chat-commands} diff --git a/public/content/translations/de/community/grants/index.md b/public/content/translations/de/community/grants/index.md index e573a0d9680..e5ad3218f65 100644 --- a/public/content/translations/de/community/grants/index.md +++ b/public/content/translations/de/community/grants/index.md @@ -12,8 +12,7 @@ Diese Liste wird von unserer Community verwaltet. Wenn Informationen fehlen oder -
    Gründer, benötigen Sie Hilfe, um Ihr Unternehmen zu beschleunigen? [Besuchen Sie die Gründerunterstützung](/founders/) -
    +
    Gründer, benötigen Sie Hilfe, um Ihr Unternehmen zu beschleunigen? [Besuchen Sie die Gründerunterstützung](/founders/)
    ## Breites Ethereum-Ökosystem {#broad-ethereum-ecosystem} diff --git a/public/content/translations/de/community/online/index.md b/public/content/translations/de/community/online/index.md index 21e64d64ce5..c01cf0ca522 100644 --- a/public/content/translations/de/community/online/index.md +++ b/public/content/translations/de/community/online/index.md @@ -32,17 +32,36 @@ Um die Integrität und den Wert der gelisteten Communities zu wahren, verfolgt e Wenn Sie der Meinung sind, dass eine Community auf Grundlage dieser Richtlinien hinzugefügt oder entfernt werden sollte, [eröffnen Sie bitte ein Issue in unserem GitHub-Repository](https://github.com/ethereum/ethereum-org-website/issues). -## Foren {#foren} +## Foren {#forums} -r/ethereum - alles rund um Ethereum r/ethfinance - die finanzielle Seite von Ethereum, einschließlich DeFi r/ethdev - konzentriert auf die Ethereum-Entwicklung r/ethtrader - Trends & Marktanalyse r/ethstaker - willkommen für alle, die am Staking auf Ethereum interessiert sind Fellowship of Ethereum Magicians - eine Community, die sich auf technische Standards in Ethereum konzentriert Ethereum Stackexchange - Diskussion und Hilfe für Ethereum-Entwickler Ethereum Research - das einflussreichste Forum für kryptökonomische Forschung +r/ethereum - alles rund um Ethereum +r/ethfinance - die finanzielle Seite von Ethereum, einschließlich DeFi +r/ethdev - konzentriert auf die Ethereum-Entwicklung +r/ethtrader - Trends & Marktanalyse +r/ethstaker - willkommen für alle, die am Staking auf Ethereum interessiert sind +Fellowship of Ethereum Magicians - eine Community, die sich auf technische Standards in Ethereum konzentriert +Ethereum Stackexchange - Diskussion und Hilfe für Ethereum-Entwickler +Ethereum Research - das einflussreichste Forum für kryptökonomische Forschung ## Chaträume {#chat-rooms} -Ethereum Cat Herders - eine Community, die Projektmanagement-Unterstützung für die Ethereum-Entwicklung anbietet Ethereum Hackers - von ETHGlobal betriebener Discord-Chat: eine Online-Community für Ethereum-Hacker aus der ganzen Welt CryptoDevs - auf die Ethereum-Entwicklung ausgerichtete Discord-Community EthStaker Discord - von der Community geführte Anleitung, Bildung, Unterstützung und Ressourcen für bestehende und potenzielle Staker Ethereum.org-Website-Team - schauen Sie vorbei und chatten Sie mit dem Team und Leuten aus der Community über die Webentwicklung und das Design von ethereum.org Matos Discord - Web3-Creator-Community, in der sich Builder, Branchengrößen und Ethereum-Enthusiasten treffen. Wir sind begeistert von Web3-Entwicklung, Design und Kultur. Bauen Sie mit uns. Solidity Gitter - Chat für die Solidity-Entwicklung (Gitter) Solidity Matrix - Chat für die Solidity-Entwicklung (Matrix) Ethereum Stack Exchange - Frage-und-Antwort-Forum Peera Community Forum - dezentralisiertes Frage-und-Antwort-Forum +Ethereum Cat Herders - eine Community, die Projektmanagement-Unterstützung für die Ethereum-Entwicklung anbietet +Ethereum Hackers - von ETHGlobal betriebener Discord-Chat: eine Online-Community für Ethereum-Hacker aus der ganzen Welt +CryptoDevs - auf die Ethereum-Entwicklung ausgerichtete Discord-Community +EthStaker Discord - von der Community geführte Anleitung, Bildung, Unterstützung und Ressourcen für bestehende und potenzielle Staker +Ethereum.org-Website-Team - schauen Sie vorbei und chatten Sie mit dem Team und Leuten aus der Community über die Webentwicklung und das Design von ethereum.org +Matos Discord - Web3-Creator-Community, in der sich Builder, Branchengrößen und Ethereum-Enthusiasten treffen. Wir sind begeistert von Web3-Entwicklung, Design und Kultur. Bauen Sie mit uns. +Solidity Gitter - Chat für die Solidity-Entwicklung (Gitter) +Solidity Matrix - Chat für die Solidity-Entwicklung (Matrix) +Ethereum Stack Exchange - Frage-und-Antwort-Forum +Peera Community Forum - dezentralisiertes Frage-und-Antwort-Forum ## YouTube und X (ehemals Twitter) {#youtube-and-twitter} -Ethereum Foundation - Bleiben Sie auf dem Laufenden über die neuesten Entwicklungen der Ethereum Foundation @ethereum - Haupt-Ethereum-Account für die Community @ethereumfndn - Offizieller Account der Ethereum Foundation @ethdotorg - Das Portal zu Ethereum, für unsere wachsende globale Community entwickelt +Ethereum Foundation - Bleiben Sie auf dem Laufenden über die neuesten Entwicklungen der Ethereum Foundation +@ethereum - Haupt-Ethereum-Account für die Community +@ethereumfndn - Offizieller Account der Ethereum Foundation +@ethdotorg - Das Portal zu Ethereum, für unsere wachsende globale Community entwickelt diff --git a/public/content/translations/de/community/research/index.md b/public/content/translations/de/community/research/index.md index e39761d27cd..1185d2f5619 100644 --- a/public/content/translations/de/community/research/index.md +++ b/public/content/translations/de/community/research/index.md @@ -362,7 +362,7 @@ Orakel importieren Offchain-Daten genehmigungsfrei und dezentral auf die Blockch #### Hintergrundlektüre {#background-reading-18} -- [Einführung in Oracles](/Entwickler/Dok/Orakel/) +- [Einführung in Oracles](/developers/docs/oracles/) #### Aktuelle Forschung {#recent-research-18} diff --git a/public/content/translations/de/contributing/translation-program/translatathon/details/index.md b/public/content/translations/de/contributing/translation-program/translatathon/details/index.md index 20868de51c0..ad2725e9a81 100644 --- a/public/content/translations/de/contributing/translation-program/translatathon/details/index.md +++ b/public/content/translations/de/contributing/translation-program/translatathon/details/index.md @@ -1,7 +1,7 @@ --- title: Details und Regeln lang: de -template: "Übersetzungsmarathon" +template: translatathon --- ![](./participate.png) diff --git a/public/content/translations/de/contributing/translation-program/translatathon/index.md b/public/content/translations/de/contributing/translation-program/translatathon/index.md index 80e88842b7e..0b7db17fb07 100644 --- a/public/content/translations/de/contributing/translation-program/translatathon/index.md +++ b/public/content/translations/de/contributing/translation-program/translatathon/index.md @@ -1,7 +1,7 @@ --- title: 2025 ethereum.org Translatathon lang: de -template: Translatathon +template: translatathon --- diff --git a/public/content/translations/de/dao/index.md b/public/content/translations/de/dao/index.md index 976af4f1437..decc0d22742 100644 --- a/public/content/translations/de/dao/index.md +++ b/public/content/translations/de/dao/index.md @@ -70,9 +70,7 @@ Um DAOs zu verwalten, sind vorher zahlreiche Überlegungen notwendig – etwa wi Die Delegation ist die DAO-Variante repräsentativer Demokratie. Tokenbesitzer delegieren Stimmen an Benutzer, die sich selbst nominieren und sich verpflichten, auf dem aktuellen Stand zu bleiben und das Protokoll zu verwalten. -#### Ein berühmtes Beispiel {#governance-example} - -[ENS](https://claim.ens.domains/delegate-ranking) – ENS-Inhaber können ihre Stimmen an engagierte Community-Mitglieder delegieren, damit diese sie vertreten. +#### Ein berühmtes Beispiel {#governance-example}[ENS](https://claim.ens.domains/delegate-ranking) – ENS-Inhaber können ihre Stimmen an engagierte Community-Mitglieder delegieren, damit diese sie vertreten. ### Automatische Transaktions-Governance {#governance-example} diff --git a/public/content/translations/de/decentralized-identity/index.md b/public/content/translations/de/decentralized-identity/index.md index c66aaa25964..c8de03d1581 100644 --- a/public/content/translations/de/decentralized-identity/index.md +++ b/public/content/translations/de/decentralized-identity/index.md @@ -108,6 +108,7 @@ Eine Attestierung ist ein Anspruch einer Entität gegenüber einer anderen Entit Attestierungen unterscheiden sich von Identifikatoren. Eine Attestierung _enthält_ Identifikatoren, um auf eine bestimmte Identität zu verweisen, und macht eine Aussage über ein Attribut, das mit dieser Identität zusammenhängt. Ihr Führerschein hat also Identifikatoren (Name, Geburtsdatum, Adresse), ist aber zugleich auch die Attestierung Ihres gesetzlichen Fahrrechts. ### Was sind dezentralisierte Identifikatoren? {#what-are-decentralized-identifiers} + Klassische Identifikatoren, wie beispielsweise Ihr bürgerlicher Name oder Ihre E-Mail-Adresse, sind von Dritten abhängig - von Regierungen und E-Mail-Anbietern. Dezentralisierte Identifikatoren (DIDs) sind anders - sie werden nicht von einer zentralen Stelle ausgegeben, verwaltet oder kontrolliert. Dezentralisierte Identifikatoren werden von Individuen ausgegeben, gehalten und kontrolliert. Ein [Ethereum-Konto](/glossary/#account) ist ein Beispiel für einen dezentralisierten Identifikator. Sie haben die Möglichkeit, so viele Konten zu erstellen, wie Sie möchten, ohne dass Sie eine Erlaubnis von Dritten benötigen und ohne dass diese Konten in einem zentralen Register gespeichert werden müssen. @@ -115,6 +116,7 @@ Dezentralisierte Identifikatoren werden von Individuen ausgegeben, gehalten und Dezentralisierte Identifikatoren werden auf Distributed Ledgers ([Blockchains](/glossary/#blockchain)) oder in [Peer-to-Peer-Netzwerken](/glossary/#peer-to-peer-network) gespeichert. Dies macht DIDs [weltweit einzigartig, mit hoher Verfügbarkeit auflösbar und kryptografisch verifizierbar](https://w3c-ccg.github.io/did-primer/). Ein dezentralisierter Identifikator kann mit verschiedenen Entitäten verknüpft werden, darunter Personen, Organisationen oder staatliche Einrichtungen. ## Was ermöglicht dezentralisierte Identifikatoren? {#what-makes-decentralized-identifiers-possible} + ### 1. Public-Key-Kryptografie {#public-key-cryptography} Public-Key-Kryptografie ist eine Informationssicherheitsmaßnahme, die einen [öffentlichen Schlüssel](/glossary/#public-key) und einen [privaten Schlüssel](/glossary/#private-key) für eine Entität generiert. Public-Key-[Kryptografie](/glossary/#cryptography) wird in Blockchain-Netzwerken verwendet, um Benutzeridentitäten zu authentifizieren und den Besitz von digitalen Vermögenswerten nachzuweisen. diff --git a/public/content/translations/de/defi/index.md b/public/content/translations/de/defi/index.md index 5756747de70..6c1586e8d37 100644 --- a/public/content/translations/de/defi/index.md +++ b/public/content/translations/de/defi/index.md @@ -67,8 +67,7 @@ Das klingt seltsam ... „Warum sollte ich mein Geld programmieren wollen?“ Da -
    Machen Sie sich mit unseren Vorschlägen für DeFi-Anwendungen vertraut und testen sie, wenn Sie neu bei Ethereum sind. -
    +
    Machen Sie sich mit unseren Vorschlägen für DeFi-Anwendungen vertraut und testen sie, wenn Sie neu bei Ethereum sind.
    DeFi-Apps entdecken diff --git a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md index dd5e61e6053..10b3ae1f287 100644 --- a/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md +++ b/public/content/translations/de/developers/docs/consensus-mechanisms/pos/block-proposal/index.md @@ -11,6 +11,7 @@ Blöcke sind die grundlegenden Einheiten der Blockchain. Blöcke sind diskrete I Block-Proposals sind Teil des Proof-of-Stake-Protokolls. Um diese Seite besser zu verstehen, empfehlen wir dir, die Artikel über [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) und [Blockarchitektur](/developers/docs/blocks/) zu lesen. ## Wer produziert Blöcke? {#who-produces-blocks} + Konten von Validatoren schlagen Blöcke vor. Die Konten von Validatoren werden von Node-Operatoren verwaltet, die Validatorensoftware als Teil ihrer Ausführungs- und Konsens-Clients betreiben und mindestens 32 ETH in den Einzahlungsvertrag transferiert haben. Allerdings ist jeder Validator nur gelegentlich für das Vorschlagen eines Blocks zuständig. Ethereum misst die Zeit in Slots und Epochen. Jeder Slot ist zwölf Sekunden lang und 32 Slots (6,4 Minuten) ergeben eine Epoche. Jeder Slot bietet eine Möglichkeit, Ethereum einen neuen Block hinzuzufügen. ### Zufällige Auswahl {#random-selection} diff --git a/public/content/translations/de/developers/docs/intro-to-ethereum/index.md b/public/content/translations/de/developers/docs/intro-to-ethereum/index.md index ff4d3f77c59..082c190e097 100644 --- a/public/content/translations/de/developers/docs/intro-to-ethereum/index.md +++ b/public/content/translations/de/developers/docs/intro-to-ethereum/index.md @@ -43,6 +43,7 @@ Die Höhe der gezahlten ETH entspricht den für die Berechnung benötigten Resso ETH wird auch verwendet, um dem Netzwerk auf drei Arten kryptoökonomische Sicherheit zu geben: 1) Es wird als Mittel zur Belohnung von Validierern verwendet, die Blöcke vorschlagen oder unehrliches Verhalten anderer Validierer aufdecken; 2) Es wird von Validierern als Sicherheit gegen unehrliches Verhalten eingesetzt – wenn Validierer versuchen, sich falsch zu verhalten, kann das die Zerstörung ihrer ETH zur Folge haben; 3) Es wird verwendet, um "Stimmen" für neu vorgeschlagene Blöcke abzuwägen, was in die Fork-Auswahl des Konsensmechanismus einfließt. ## Was sind Smart Contracts? {#what-are-smart-contracts} + In der Praxis schreiben die Teilnehmenden nicht jedes Mal einen neuen Code, wenn sie eine Berechnung auf der EVM anfordern wollen. Vielmehr laden Anwendungsentwickler Programme (wiederverwendbare Codeschnipsel) in den EVM-Speicher hoch, und die Nutzer stellen Anfragen, um diese Codeschnipsel mit unterschiedlichen Parametern auszuführen. Wir nennen die Programme, die in das Netzwerk hochgeladen und von diesem ausgeführt werden, "Smart Contracts". Ganz grundsätzlich können Sie sich einen Smart Contract wie eine Art Verkaufsautomat vorstellen: ein Skript, das, wenn es mit bestimmten Parametern aufgerufen wird, bestimmte Aktionen oder Berechnungen durchführt, wenn bestimmte Bedingungen erfüllt sind. Zum Beispiel könnte ein einfacher Verkäufer-Smart-Contract das Eigentum an einem digitalen Vermögenswert schaffen und zuweisen, wenn der Aufrufer ("caller") ETH an einen bestimmten Empfänger sendet. diff --git a/public/content/translations/de/developers/docs/nodes-and-clients/index.md b/public/content/translations/de/developers/docs/nodes-and-clients/index.md index 7187ec44729..0e1b31e02bd 100644 --- a/public/content/translations/de/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/de/developers/docs/nodes-and-clients/index.md @@ -85,6 +85,7 @@ Es gibt auch potenzielle Wege, um Light-Client-Daten über das [Gossip-Netzwerk] Ethereum unterstützt noch keine große Population von leichten Nodes, jedoch ist die Unterstützung von leichten Nodes ein Bereich, der sich in naher Zukunft voraussichtlich schnell entwickeln wird. Insbesondere Clients wie [Nimbus](https://nimbus.team/), [Helios](https://github.com/a16z/helios) und [LodeStar](https://lodestar.chainsafe.io/) konzentrieren sich derzeit stark auf Light Nodes. ## Warum sollte ich einen Ethereum-Node betreiben? {#why-should-i-run-an-ethereum-node} + Der Betrieb eines eigenen Knotens ermöglicht es Ihnen, Ethereum auf private, autarke und vertrauenswürdige Weise zu nutzen und gleichzeitig das Netz zu unterstützen, da es so robuster und dezentraler wird. ### Ihre Vorteile {#benefits-to-you} diff --git a/public/content/translations/de/developers/docs/scaling/plasma/index.md b/public/content/translations/de/developers/docs/scaling/plasma/index.md index 7990cb7ffb8..328c77873e6 100644 --- a/public/content/translations/de/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/de/developers/docs/scaling/plasma/index.md @@ -120,7 +120,7 @@ Obwohl Plasma einst als nützliche Skalierungslösung für Ethereum galt, wurde ### Effizienz {#efficiency} -[Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups/) erzeugen kryptografische Beweise für die Gültigkeit jedes Transaktionsstapels, der off-chain verarbeitet wird. Dies verhindert, dass Benutzer (und Betreiber) ungültige Zustandsübergänge vorantreiben, was die Notwendigkeit von Challengeperioden und Exit-Games beseitigt. Damit müssen Benutzer ihre Guthaben nicht mehr regelmäßig über die Chain überwachen, um sie zu schützen. +[Zero-Knowledge Rollups](/developers/docs/scaling/zk-rollups) erzeugen kryptografische Beweise für die Gültigkeit jedes Transaktionsstapels, der off-chain verarbeitet wird. Dies verhindert, dass Benutzer (und Betreiber) ungültige Zustandsübergänge vorantreiben, was die Notwendigkeit von Challengeperioden und Exit-Games beseitigt. Damit müssen Benutzer ihre Guthaben nicht mehr regelmäßig über die Chain überwachen, um sie zu schützen. ### Unterstützung für Smart Contracts {#support-for-smart-contracts} diff --git a/public/content/translations/de/developers/docs/scaling/validium/index.md b/public/content/translations/de/developers/docs/scaling/validium/index.md index eaa4347f30c..4aead5d522a 100644 --- a/public/content/translations/de/developers/docs/scaling/validium/index.md +++ b/public/content/translations/de/developers/docs/scaling/validium/index.md @@ -24,6 +24,7 @@ Allerdings können die Gelder der Validium-Nutzer eingefroren und Auszahlungen e Dies ist der Hauptunterschied zwischen Validiums und ZK-Rollups – ihre Positionen im Datenverfügbarkeitsspektrum. Beide Lösungen gehen unterschiedlich mit der Datenspeicherung um, was Auswirkungen auf Sicherheit und Vertrauenswürdigkeit hat. ## Wie interagieren Validiums mit Ethereum? {#how-do-validiums-interact-with-ethereum} + Validiums sind Skalierungsprotokolle, die auf der bestehenden Ethereum-Blockchain aufgebaut sind. Obwohl die Transaktionen Off-Chain ausgeführt werden, wird eine Validium-Chain von mehreren Smart Contracts verwaltet, die im Mainnet eingesetzt sind, darunter: 1. **Verifier-Vertrag**: Der Verifier-Vertrag überprüft die Gültigkeit der vom Validium-Operator eingereichten Nachweise bei der Durchführung von Statusaktualisierungen. Das umfasst Gültigkeitsnachweise, die die Korrektheit der Offchain-Transaktionen belegen, sowie Datenverfügbarkeitsnachweise, die bestätigen, dass die Offchain-Transaktionsdaten vorhanden sind. diff --git a/public/content/translations/de/developers/docs/smart-contracts/index.md b/public/content/translations/de/developers/docs/smart-contracts/index.md index 64e1af8b3e9..c88869f1b8c 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/index.md @@ -5,6 +5,7 @@ lang: de --- ## Was ist ein Smart Contract? {#what-is-a-smart-contract} + Ein "Smart Contract" oder intelligenter Vertrag ist einfach ein Programm, das auf der Ethereum-Blockchain läuft. Es ist eine Sammlung von Anweisungen (seinen Funktionen) und Daten (seinem Zustand), die sich an einer bestimmten Adresse in der Ethereum-Blockchain befindet. Smart Contracts sind eine Art [Ethereum-Konto](/developers/docs/accounts/). Das bedeutet, dass sie über ein Guthaben verfügen und Ziel von Transaktionen werden können. Allerdings werden sie nicht von einem Benutzer gesteuert, sondern im Netzwerk bereitgestellt und wie programmiert ausgeführt. Benutzerkonten können dann mit einem Smart Contract interagieren, indem sie Transaktionen übermitteln, die eine im Smart Contract definierte Funktion ausführt. Smart Contracts können, wie auch herkömmliche Verträge, Regeln definieren und diese mittels Programmierung automatisch durchsetzen. Standardmäßig können Smart Contracts nicht gelöscht werden und Interaktionen mit ihnen sind irreversibel. diff --git a/public/content/translations/de/developers/docs/smart-contracts/languages/index.md b/public/content/translations/de/developers/docs/smart-contracts/languages/index.md index ea2f2498dde..a8d929f9fee 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/languages/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/languages/index.md @@ -123,24 +123,32 @@ Für weitere Informationen [lesen Sie die Begründung für Vyper](https://vyper. # Offene Auktion # Auktionsparameter + # Der Begünstigte erhält Geld vom Höchstbietenden + beneficiary: public(address) auctionStart: public(uint256) auctionEnd: public(uint256) # Aktueller Stand der Auktion + highestBidder: public(address) highestBid: public(uint256) # Wird am Ende auf „true“ gesetzt, verbietet jede Änderung + ended: public(bool) # Nachverfolgung der zurückgezahlten Gebote, damit wir dem Auszahlungsmuster folgen können + pendingReturns: public(HashMap[address, uint256]) # Erstellt eine einfache Auktion mit `_bidding_time` + # Sekunden Bietzeit im Namen der + # Begünstigten-Adresse `_beneficiary`. + @external def __init__(_beneficiary: address, _bidding_time: uint256): self.beneficiary = _beneficiary @@ -148,9 +156,13 @@ def __init__(_beneficiary: address, _bidding_time: uint256): self.auctionEnd = self.auctionStart + _bidding_time # Mit dem Wert, der zusammen mit dieser Transaktion + # gesendet wird, auf die Auktion bieten. + # Der Wert wird nur dann zurückerstattet, + # wenn die Auktion nicht gewonnen wird. + @external @payable def bid(): @@ -165,9 +177,13 @@ def bid(): self.highestBid = msg.value # Ein zuvor erstattetes Gebot abheben. Das Auszahlungsmuster wird + # hier verwendet, um ein Sicherheitsproblem zu vermeiden. Wenn Rückerstattungen direkt + # als Teil von bid() gesendet würden, könnte ein bösartiger Bietvertrag + # diese Rückerstattungen blockieren und somit das Eingehen neuer, höherer Gebote verhindern. + @external def withdraw(): pending_amount: uint256 = self.pendingReturns[msg.sender] @@ -175,7 +191,9 @@ def withdraw(): send(msg.sender, pending_amount) # Die Auktion beenden und das höchste Gebot an + # den Begünstigten senden. + @external def endAuction(): # Es ist eine gute Richtlinie, Funktionen, die mit anderen Verträgen interagieren diff --git a/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md b/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md index 95653458f11..2d43ed1a166 100644 --- a/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md +++ b/public/content/translations/de/developers/docs/smart-contracts/upgrading/index.md @@ -15,6 +15,7 @@ Die zunehmende Forschung zur Verbesserung von Smart Contracts hat jedoch zur Ein Sie sollten ein gutes Verständnis von [Smart Contracts](/developers/docs/smart-contracts/), der [Anatomie von Smart Contracts](/developers/docs/smart-contracts/anatomy/) und der [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) haben. In diesem Leitfaden wird außerdem davon ausgegangen, dass die Leser über Kenntnisse in der Programmierung von Smart Contracts verfügen. ## Was ist ein Smart-Contract-Upgrade? {#what-is-a-smart-contract-upgrade} + Bei einem Smart-Contract-Upgrade wird die Geschäftslogik eines Smart Contracts geändert, wobei der Zustand des Vertrags erhalten bleibt. Es ist wichtig, klarzustellen, dass Aktualisierbarkeit und Veränderbarkeit nicht dasselbe sind, insbesondere im Zusammenhang mit Smart Contracts. Sie können ein Programm, das auf einer Adresse im Ethereum-Netzwerk veröffentlicht wird, trotzdem nicht ändern. Aber Sie können den Code ändern, der ausgeführt wird, wenn Benutzer mit einem Smart Contract interagieren. diff --git a/public/content/translations/de/developers/docs/wrapped-eth/index.md b/public/content/translations/de/developers/docs/wrapped-eth/index.md index 2b6099003a0..90a0439dc4e 100644 --- a/public/content/translations/de/developers/docs/wrapped-eth/index.md +++ b/public/content/translations/de/developers/docs/wrapped-eth/index.md @@ -1,6 +1,6 @@ --- -title: Was ist „Wrapped Ether“ (WETH) -description: Eine Einführung in Wrapped Ether (WETH) – ein ERC20-kompatibler Wrapper für Ether (ETH). +title: "Was ist „Wrapped Ether“ (WETH)" +description: "Eine Einführung in Wrapped Ether (WETH) – ein ERC20-kompatibler Wrapper für Ether (ETH)." lang: de --- @@ -35,19 +35,16 @@ Sie können WETH in ETH umwandeln, indem Sie den WETH-Smart Contract verwenden. Sie zahlen Gasgebühren, um ETH mit dem WETH-Vertrag zu verpacken oder zu entpacken. - WETH gilt allgemein als sicher, da es auf einem einfachen, bewährten Smart Contract basiert. Der WETH-Vertrag wurde zudem formal verifiziert, was den höchsten Sicherheitsstandard für Smart Contracts auf Ethereum darstellt. - Neben der [kanonischen Implementierung von WETH](https://etherscan.io/token/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2), die auf dieser Seite beschrieben ist, gibt es auch andere Varianten. Diese können benutzerdefinierte Token sein, die von App-Entwicklern erstellt wurden, oder Versionen, die auf anderen Blockchains herausgegeben wurden, und sich unterschiedlich verhalten oder unterschiedliche Sicherheitseigenschaften haben. **Überprüfen Sie immer die Token-Informationen, um zu erfahren, mit welcher WETH-Implementierung Sie interagieren.** - @@ -55,7 +52,6 @@ Neben der [kanonischen Implementierung von WETH](https://etherscan.io/token/0xc0 - [Ethereum-Mainnet](https://etherscan.io/token/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) - [Arbitrum](https://arbiscan.io/token/0x82af49447d8a07e3bd95bd0d56f35241523fbab1) - [Optimism](https://optimistic.etherscan.io/token/0x4200000000000000000000000000000000000006) - ## Weiterführende Lektüre {#further-reading} diff --git a/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 49f625b86b3..3c6106303de 100644 --- a/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/de/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -5,7 +5,7 @@ author: Marc Garreau lang: de tags: [ "Python", "web3.py" ] skill: beginner -published: 08.09.2020 +published: 2020-09-08 source: Snake charmers sourceUrl: https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/ --- diff --git a/public/content/translations/de/developers/tutorials/all-you-can-cache/index.md b/public/content/translations/de/developers/tutorials/all-you-can-cache/index.md index cb8dd2ab921..d24759b06a8 100644 --- a/public/content/translations/de/developers/tutorials/all-you-can-cache/index.md +++ b/public/content/translations/de/developers/tutorials/all-you-can-cache/index.md @@ -1,7 +1,7 @@ --- title: "Alles, was Sie cachen können" description: "Erfahren Sie, wie Sie einen Caching-Vertrag für günstigere Rollup-Transaktionen erstellen und verwenden." -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz tags: [ "Layer 2", "Caching", "Speicher" ] skill: intermediate published: 2022-09-15 @@ -252,7 +252,7 @@ Ein großer Vorteil von Foundry ist, dass Tests in Solidity geschrieben werden k return bytes.concat(INTO_CACHE, bytes32(_val)); ``` -In der [EVM](/entwickler/docs/evm/) wird davon ausgegangen, dass jeder nicht initialisierte Speicher Null ist. Wenn wir also nach dem Schlüssel für einen nicht vorhandenen Wert suchen, erhalten wir eine Null. In diesem Fall sind die Bytes, die ihn kodieren, `INTO_CACHE` (damit er beim nächsten Mal zwischengespeichert wird), gefolgt von dem tatsächlichen Wert. +In der [EVM](/developers/docs/evm/) wird davon ausgegangen, dass jeder nicht initialisierte Speicher Null ist. Wenn wir also nach dem Schlüssel für einen nicht vorhandenen Wert suchen, erhalten wir eine Null. In diesem Fall sind die Bytes, die ihn kodieren, `INTO_CACHE` (damit er beim nächsten Mal zwischengespeichert wird), gefolgt von dem tatsächlichen Wert. ```solidity // Wenn der Schlüssel <0x10 ist, geben Sie ihn als einzelnes Byte zurück diff --git a/public/content/translations/de/developers/tutorials/app-plasma/index.md b/public/content/translations/de/developers/tutorials/app-plasma/index.md index 21a1c8014c0..e3f86fa1768 100644 --- a/public/content/translations/de/developers/tutorials/app-plasma/index.md +++ b/public/content/translations/de/developers/tutorials/app-plasma/index.md @@ -1,7 +1,7 @@ --- title: "Schreiben Sie ein App-spezifisches Plasma, das die Privatsphäre wahrt" description: "In diesem Tutorial bauen wir eine halbgeheime Bank für Einlagen. Die Bank ist eine zentralisierte Komponente; sie kennt das Guthaben jedes Benutzers. Diese Informationen werden jedoch nicht onchain gespeichert. Stattdessen veröffentlicht die Bank einen Hash des Zustands. Jedes Mal, wenn eine Transaktion stattfindet, veröffentlicht die Bank den neuen Hash, zusammen mit einem Zero-Knowledge-Proof, dass sie eine signierte Transaktion hat, die den Hash-Zustand in den neuen ändert. Nach der Lektüre dieses Tutorials werden Sie nicht nur verstehen, wie man Zero-Knowledge-Proofs verwendet, sondern auch, warum man sie verwendet und wie man dies sicher tut." -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz tags: [ "Zero-Knowledge", diff --git a/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md b/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md index e676e0a61f6..3f6f5e8c336 100644 --- a/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md +++ b/public/content/translations/de/developers/tutorials/calling-a-smart-contract-from-javascript/index.md @@ -5,7 +5,7 @@ author: jdourlens tags: [ "Transaktionen", "Frontend", "JavaScript", "web3.js" ] skill: beginner lang: de -published: 19.04.2020 +published: 2020-04-19 source: EthereumDev sourceUrl: https://ethereumdev.io/calling-a-smart-contract-from-javascript/ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" diff --git a/public/content/translations/de/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md b/public/content/translations/de/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md index 40cd770e5c5..6005c7e4797 100644 --- a/public/content/translations/de/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md +++ b/public/content/translations/de/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md @@ -1,10 +1,10 @@ --- title: "Erstellen einer Benutzeroberfläche für Ihren Vertrag" description: "Mithilfe moderner Komponenten wie TypeScript, React, Vite und Wagmi werden wir eine moderne, aber minimalistische Benutzeroberfläche durchgehen und lernen, wie man eine Wallet mit der Benutzeroberfläche verbindet, einen Smart Contract aufruft, um Informationen auszulesen, eine Transaktion an einen Smart Contract zu senden und Ereignisse von einem Smart Contract zu überwachen, um Änderungen zu erkennen." -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz tags: [ "typescript", "react", "vite", "wagmi", "Frontend" ] skill: beginner -published: 01.11.2023 +published: 2023-11-01 lang: de sidebarDepth: 3 --- diff --git a/public/content/translations/de/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/de/developers/tutorials/erc-721-vyper-annotated-code/index.md index abffe7281ad..d627213ef79 100644 --- a/public/content/translations/de/developers/tutorials/erc-721-vyper-annotated-code/index.md +++ b/public/content/translations/de/developers/tutorials/erc-721-vyper-annotated-code/index.md @@ -1,7 +1,7 @@ --- title: "Vyper ERC-721 Vertrags-Komplettlösung" description: Ryuya Nakamuras ERC-721-Vertrag und wie er funktioniert -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz lang: de tags: [ "vyper", "erc-721", "Python" ] skill: beginner @@ -294,6 +294,7 @@ Gibt den Wert aus der `self.supportedInterfaces`-HashMap zurück, der im Konstru ```python ### VIEW-FUNKTIONEN ### + ``` Dies sind die View-Funktionen, die Informationen über die Token für Benutzer und andere Verträge verfügbar machen. diff --git a/public/content/translations/de/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/de/developers/tutorials/erc20-annotated-code/index.md index ec47cfb8494..df0c88271ed 100644 --- a/public/content/translations/de/developers/tutorials/erc20-annotated-code/index.md +++ b/public/content/translations/de/developers/tutorials/erc20-annotated-code/index.md @@ -1,7 +1,7 @@ --- title: "ERC-20-Vertrag – exemplarische Vorgehensweise" description: Was beinhaltet der OpenZeppelin ERC-20-Vertrag und warum ist er da? -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz lang: de tags: [ "solidity", "Erc-20" ] skill: beginner diff --git a/public/content/translations/de/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/de/developers/tutorials/erc20-with-safety-rails/index.md index 1f76a93c690..cf7d6e742e6 100644 --- a/public/content/translations/de/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/translations/de/developers/tutorials/erc20-with-safety-rails/index.md @@ -1,7 +1,7 @@ --- title: ERC-20 mit Sicherheitsvorkehrungen description: Wie man Leuten helfen kann, dumme Fehler zu vermeiden -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz lang: de tags: [ "Erc-20" ] skill: beginner diff --git a/public/content/translations/de/developers/tutorials/ethereum-for-web2-auth/index.md b/public/content/translations/de/developers/tutorials/ethereum-for-web2-auth/index.md index 946b991e134..6d4b98cb917 100644 --- a/public/content/translations/de/developers/tutorials/ethereum-for-web2-auth/index.md +++ b/public/content/translations/de/developers/tutorials/ethereum-for-web2-auth/index.md @@ -1,7 +1,7 @@ --- title: "Verwendung von Ethereum für die Web2-Authentifizierung" description: "Nach der Lektüre dieses Tutorials kann ein Entwickler die Ethereum-Anmeldung (Web3) in die SAML-Anmeldung integrieren, einen in Web2 verwendeten Standard zur Bereitstellung von Single Sign-On und anderen damit verbundenen Diensten. Dies ermöglicht die Authentifizierung des Zugriffs auf Web2-Ressourcen durch Ethereum-Signaturen, wobei die Benutzerattribute aus Attestierungen stammen." -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz tags: [ "web2", "authentifizierung", "eas" ] skill: beginner lang: de diff --git a/public/content/translations/de/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md b/public/content/translations/de/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md index 8396f5b36e0..1f097052b0a 100644 --- a/public/content/translations/de/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md +++ b/public/content/translations/de/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md @@ -13,7 +13,7 @@ tags: skill: beginner lang: de published: 2020-10-30 -source: Mittel +source: Medium sourceUrl: https://medium.com/alchemy-api/getting-started-with-ethereum-development-using-alchemy-c3d6a45c567f --- diff --git a/public/content/translations/de/developers/tutorials/guide-to-smart-contract-security-tools/index.md b/public/content/translations/de/developers/tutorials/guide-to-smart-contract-security-tools/index.md index 0b90d99a2a5..f934e8e1cbe 100644 --- a/public/content/translations/de/developers/tutorials/guide-to-smart-contract-security-tools/index.md +++ b/public/content/translations/de/developers/tutorials/guide-to-smart-contract-security-tools/index.md @@ -1,12 +1,12 @@ --- title: "Ein Leitfaden für Smart-Contract-Sicherheitstools" description: "Ein Überblick über drei verschiedene Test- und Programmanalysetechniken" -author: "Spuren von bits" +author: "Trailofbits" lang: de tags: [ "solidity", "intelligente Verträge", "Sicherheit" ] skill: intermediate -published: 07.09.2020 -source: "Aufbau sicherer Verträge" +published: 2020-09-07 +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis --- diff --git a/public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md b/public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md index 4c06bc4de5c..ef0fa6f99d5 100644 --- a/public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-implement-an-erc721-market/index.md @@ -1,7 +1,7 @@ --- title: Wie man einen ERC-721 Markt implementiert description: Wie man tokenisierte Assets auf einer dezentralen Pinnwand zum Verkauf anbietet -author: "Alberto Cuesta Cañada" +author: "Alberto Cuesta Cañada" tags: [ "Smart Contracts", "erc-721", "Solidity", "Token" ] skill: intermediate lang: de diff --git a/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md index 896d8de3017..743d24952dc 100644 --- a/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md @@ -1,7 +1,7 @@ --- title: So verwenden Sie Echidna zum Testen von Smart Contracts description: So verwenden Sie Echidna zum automatischen Testen von Smart Contracts -author: "Spuren von bits" +author: "Trailofbits" lang: de tags: [ @@ -13,7 +13,7 @@ tags: ] skill: advanced published: 2020-04-10 -source: "Aufbau sicherer Verträge" +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna --- diff --git a/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md index 8b0e2a7c02c..cb078e6f8d4 100644 --- a/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md @@ -1,7 +1,7 @@ --- title: So nutzt du Manticore, um Fehler in Smart Contracts zu finden description: So nutzt du Manticore, um automatisiert Fehler in Smart Contracts zu finden -author: Spuren von bits +author: Trailofbits lang: de tags: [ @@ -12,8 +12,8 @@ tags: "Formale Verifizierung" ] skill: advanced -published: 13.01.2020 -source: "Aufbau sicherer Verträge" +published: 2020-01-13 +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore --- @@ -399,6 +399,7 @@ symbolic_var = m.make_symbolic_value() contract_account.f(symbolic_var) ## Prüfen, ob eine Ausführung mit REVERT oder INVALID endet + for state in m.terminated_states: last_tx = state.platform.transactions[-1] if last_tx.result in ['REVERT', 'INVALID']: @@ -506,6 +507,7 @@ contract_account.f(symbolic_var) no_bug_found = True ## Prüfen, ob eine Ausführung mit REVERT oder INVALID endet + for state in m.terminated_states: last_tx = state.platform.transactions[-1] if last_tx.result in ['REVERT', 'INVALID']: diff --git a/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md index fa79c810ead..fa6362e934b 100644 --- a/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md +++ b/public/content/translations/de/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md @@ -1,7 +1,7 @@ --- title: So verwenden Sie Slither, um Bugs in Smart Contracts zu finden description: So verwenden Sie Slither, um automatisch Fehler in Smart Contracts zu finden -author: Spuren von bits +author: Trailofbits lang: de tags: [ @@ -12,7 +12,7 @@ tags: ] skill: advanced published: 2020-06-09 -source: "Aufbau sicherer Verträge" +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither --- diff --git a/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md b/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md index 5a4a3c04c34..c75b1125099 100644 --- a/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md +++ b/public/content/translations/de/developers/tutorials/ipfs-decentralized-ui/index.md @@ -1,7 +1,7 @@ --- title: "IPFS für dezentralisierte Benutzeroberflächen" description: "Dieses Tutorial zeigt dem Leser, wie man IPFS nutzt, um die Benutzeroberfläche für eine Dapp zu speichern. Obwohl die Daten und die Geschäftslogik der Anwendung dezentralisiert sind, könnten Benutzer ohne eine zensurresistente Benutzeroberfläche trotzdem den Zugriff darauf verlieren." -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz tags: [ "ipfs" ] skill: beginner lang: de diff --git a/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md b/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md index cfaebd49b30..f1dc71ae15d 100644 --- a/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md +++ b/public/content/translations/de/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md @@ -1,7 +1,7 @@ --- title: "Merkle-Beweise für Offline Datenintegrität" description: "Sicherstellung der Datenintegrität onchain für Daten, die größtenteils offchain gespeichert sind" -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz tags: [ "Speicher" ] skill: advanced lang: de diff --git a/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md index 55f5ac6afc7..32ba13de8b4 100644 --- a/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/de/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1,7 +1,7 @@ --- title: "Walkthrough zum Vertrag der Optimism-Standard-Brücke" description: "Wie funktioniert die Standard-Brücke für Optimism? Warum funktioniert sie auf diese Weise?" -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz tags: [ "solidity", "Brücke", "Layer 2" ] skill: intermediate published: 2022-03-30 diff --git a/public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md index 1309b7bf0a5..b77583efd22 100644 --- a/public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/de/developers/tutorials/reverse-engineering-a-contract/index.md @@ -1,7 +1,7 @@ --- title: "Reverse Engineering eines Contracts" description: Wie Sie einen Contract verstehen, wenn Sie den Quellcode nicht haben -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz lang: de tags: [ "evm", "Opcodes" ] skill: advanced diff --git a/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md b/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md index 7b7f86f44f4..0980bcb0830 100644 --- a/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md +++ b/public/content/translations/de/developers/tutorials/scam-token-tricks/index.md @@ -1,7 +1,7 @@ --- title: "Einige Tricks, die von Betrugs-Tokens verwendet werden, und wie man sie erkennt" description: "In diesem Tutorial analysieren wir einen Betrugs-Token, um einige der Tricks zu sehen, die Betrüger anwenden, wie sie sie implementieren und wie wir sie erkennen können." -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz tags: [ "Betrug", @@ -11,7 +11,7 @@ tags: "typescript" ] skill: intermediate -published: 15.09.2023 +published: 2023-09-15 lang: de --- diff --git a/public/content/translations/de/developers/tutorials/secret-state/index.md b/public/content/translations/de/developers/tutorials/secret-state/index.md index 78414174214..7749c29c967 100644 --- a/public/content/translations/de/developers/tutorials/secret-state/index.md +++ b/public/content/translations/de/developers/tutorials/secret-state/index.md @@ -1,7 +1,7 @@ --- title: "Verwendung von Zero-Knowledge für einen geheimen Zustand" description: "Onchain-Spiele sind begrenzt, da sie keine versteckten Informationen enthalten können. Nach der Lektüre dieses Tutorials ist der Leser in der Lage, Zero-Knowledge-Beweise und Serverkomponenten zu kombinieren, um verifizierbare Spiele mit einer geheimen Offchain-Zustandskomponente zu erstellen. Die Technik dafür wird durch die Erstellung eines Minesweeper-Spiels demonstriert." -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz tags: [ "Server", diff --git a/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md index b54fa5d3820..7306aadedf0 100644 --- a/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/de/developers/tutorials/secure-development-workflow/index.md @@ -1,12 +1,12 @@ --- title: Smart-Contract-Sicherheitscheckliste description: Ein empfohlener Workflow zum Schreiben sicherer Smart Contracts -author: "Spuren von bits" +author: "Trailofbits" tags: [ "Smart Contracts", "Sicherheit", "Solidity" ] skill: intermediate lang: de -published: 07.09.2020 -source: "Aufbau sicherer Verträge" +published: 2020-09-07 +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md --- diff --git a/public/content/translations/de/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/de/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md index 79f858b6f76..006218d9701 100644 --- a/public/content/translations/de/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md +++ b/public/content/translations/de/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md @@ -6,7 +6,7 @@ tags: [ "Transaktionen", "web3.js", "Alchemy" ] skill: beginner lang: de published: 2020-11-04 -source: Alchemie Dokumente +source: Alchemy docs sourceUrl: https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum --- diff --git a/public/content/translations/de/developers/tutorials/server-components/index.md b/public/content/translations/de/developers/tutorials/server-components/index.md index b3784445bc1..b427cad4c49 100644 --- a/public/content/translations/de/developers/tutorials/server-components/index.md +++ b/public/content/translations/de/developers/tutorials/server-components/index.md @@ -2,7 +2,7 @@ title: "Server-Komponenten und Agenten für Web3-Apps" description: "Nach dem Lesen dieses Tutorials können Sie TypeScript-Server schreiben, die auf Ereignisse auf einer Blockchain lauschen und entsprechend mit ihren eigenen Transaktionen reagieren. Dies ermöglicht es Ihnen, zentralisierte Anwendungen zu schreiben (da der Server ein Single Point of Failure ist), die jedoch mit Web3-Entitäten interagieren können. Die gleichen Techniken können auch verwendet werden, um einen Agenten zu schreiben, der auf On-Chain-Ereignisse ohne menschliches Eingreifen reagiert." -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz lang: de tags: [ "Agent", "Server", "Off-Chain" ] skill: beginner diff --git a/public/content/translations/de/developers/tutorials/short-abi/index.md b/public/content/translations/de/developers/tutorials/short-abi/index.md index b1a8bc3c69f..763f9c307d5 100644 --- a/public/content/translations/de/developers/tutorials/short-abi/index.md +++ b/public/content/translations/de/developers/tutorials/short-abi/index.md @@ -1,7 +1,7 @@ --- title: "Kurze ABIs zur Calldata-Optimierung" description: "Optimierung von Smart Contracts für Optimistic Rollups" -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz lang: de tags: [ "Layer 2" ] skill: intermediate diff --git a/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md index 56c9bcb29e3..5955ef6837e 100644 --- a/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md +++ b/public/content/translations/de/developers/tutorials/smart-contract-security-guidelines/index.md @@ -1,12 +1,12 @@ --- title: Smart-Contract-Sicherheitsrichtlinien description: "Eine Checkliste der Sicherheitsrichtlinien, die beim Erstellen Ihrer dapp berücksichtigt werden sollen" -author: "Spuren von bits" +author: "Trailofbits" tags: [ "solidity", "Smart Contracts", "Sicherheit" ] skill: intermediate lang: de -published: 06.09.2020 -source: "Aufbau sicherer Verträge" +published: 2020-09-06 +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md --- diff --git a/public/content/translations/de/developers/tutorials/stealth-addr/index.md b/public/content/translations/de/developers/tutorials/stealth-addr/index.md index 6eea3375006..3e2f48d7ed8 100644 --- a/public/content/translations/de/developers/tutorials/stealth-addr/index.md +++ b/public/content/translations/de/developers/tutorials/stealth-addr/index.md @@ -1,7 +1,7 @@ --- title: "Verwendung von Stealth-Adressen" description: "Stealth-Adressen ermöglichen es Benutzern, Vermögenswerte anonym zu übertragen. Nach der Lektüre dieses Artikels werden Sie in der Lage sein: zu erklären, was Stealth-Adressen sind und wie sie funktionieren, zu verstehen, wie man Stealth-Adressen so verwendet, dass die Anonymität gewahrt bleibt, und eine webbasierte Anwendung zu schreiben, die Stealth-Adressen verwendet." -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz tags: [ "Stealth-Adresse", diff --git a/public/content/translations/de/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/de/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index aa78539e4f7..ad2a5d452da 100644 --- a/public/content/translations/de/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/de/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -12,7 +12,7 @@ tags: "react" ] skill: intermediate -published: 06.09.2020 +published: 2020-09-06 source: soliditydeveloper.com sourceUrl: https://soliditydeveloper.com/thegraph --- diff --git a/public/content/translations/de/developers/tutorials/token-integration-checklist/index.md b/public/content/translations/de/developers/tutorials/token-integration-checklist/index.md index c264f614f86..c45a5b68987 100644 --- a/public/content/translations/de/developers/tutorials/token-integration-checklist/index.md +++ b/public/content/translations/de/developers/tutorials/token-integration-checklist/index.md @@ -1,7 +1,7 @@ --- title: "Checkliste für die Token-Integration" description: Eine Checkliste mit Punkten, die bei der Interaktion mit Token zu beachten sind -author: "Spuren von bits" +author: "Trailofbits" lang: de tags: [ @@ -11,8 +11,8 @@ tags: "Token" ] skill: intermediate -published: 13.08.2020 -source: "Aufbau sicherer Verträge" +published: 2020-08-13 +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/token_integration.md --- diff --git a/public/content/translations/de/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/de/developers/tutorials/uniswap-v2-annotated-code/index.md index ed39bd07196..cd023cafd38 100644 --- a/public/content/translations/de/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/translations/de/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -1,7 +1,7 @@ --- title: "Uniswap-v2-Vertrag Walk-Through" description: Wie funktioniert der Uniswap-v2-Vertrag? Warum ist er so geschrieben? -author: Ori Pomerantz ist der Autor des Linux Kernel Module Programming Guide +author: Ori Pomerantz tags: [ "solidity" ] skill: intermediate published: 2021-05-01 @@ -56,9 +56,8 @@ Dies ist der häufigste Ablauf, der von Händlern verwendet wird: 4. Iteriert über den Pfad. Für jede Börse auf dem Weg sendet es den Input-Token und ruft dann die `swap`-Funktion der Börse auf. In den meisten Fällen ist die Zieladresse für die Tokens die nächste Tauschbörse im Pfad. Bei der letzten Börse ist es die vom Händler angegebene Adresse. -#### Im Kernvertrag (UniswapV2Pair.sol) {#in-the-core-contract-uniswapv2pairsol-2} +#### Im Kernvertrag (UniswapV2Pair.sol) {#in-the-core-contract-uniswapv2pairsol-2}5. Überprüfen Sie, ob der Kernvertrag nicht betrogen wird und nach dem Tausch eine ausreichende Liquidität aufrechterhalten kann. -5. Überprüfen Sie, ob der Kernvertrag nicht betrogen wird und nach dem Tausch eine ausreichende Liquidität aufrechterhalten kann. 6. Sehen Sie, wie viele zusätzliche Tokens wir zusätzlich zu den bekannten Reserven haben. Dieser Betrag ist die Anzahl der Input-Tokens, die wir zum Tausch erhalten haben. 7. Senden Sie die Output-Tokens an das Ziel. 8. Rufen Sie `_update` auf, um die Reservebeträge zu aktualisieren diff --git a/public/content/translations/de/developers/tutorials/using-websockets/index.md b/public/content/translations/de/developers/tutorials/using-websockets/index.md index 3e789dabc44..6266a89d9e5 100644 --- a/public/content/translations/de/developers/tutorials/using-websockets/index.md +++ b/public/content/translations/de/developers/tutorials/using-websockets/index.md @@ -5,7 +5,7 @@ author: "Elan Halpern" lang: de tags: [ "Alchemy", "WebSocket", "Abfragen", "javascript" ] skill: beginner -source: Alchemie Dokumente +source: Alchemy docs sourceUrl: https://www.alchemy.com/docs/reference/best-practices-for-using-websockets-in-web3 published: 2020-12-01 --- diff --git a/public/content/translations/de/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/de/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 441b683f043..d57ac383c7d 100644 --- a/public/content/translations/de/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/de/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -12,7 +12,7 @@ tags: ] skill: intermediate lang: de -published: 14.11.2020 +published: 2020-11-14 --- ## Worum geht es in diesem Tutorial? {#what-is-this-tutorial-about} diff --git a/public/content/translations/de/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md b/public/content/translations/de/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md index 2bae3c0e375..eec5396f6cd 100644 --- a/public/content/translations/de/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md +++ b/public/content/translations/de/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md @@ -13,7 +13,7 @@ tags: ] skill: beginner lang: de -published: 16.10.2020 +published: 2020-10-16 --- In diesem [Waffle](https://ethereum-waffle.readthedocs.io)-Tutorial lernen wir, wie man ein einfaches „Hallo Welt“-Smart-Contract-Projekt mit [Hardhat](https://hardhat.org/) und [ethers.js](https://docs.ethers.io/v5/) einrichtet. Dann werden wir lernen, wie wir eine neue Funktionalität zu unserem Smart Contract hinzufügen und wie wir sie mit Waffle testen können. diff --git a/public/content/translations/de/ethereum-forks/index.md b/public/content/translations/de/ethereum-forks/index.md index bb9f5fa75b6..f4056ef4d20 100644 --- a/public/content/translations/de/ethereum-forks/index.md +++ b/public/content/translations/de/ethereum-forks/index.md @@ -11,7 +11,7 @@ Ein Zeitstrang aller wichtigsten Meilensteine, Forks und Aktualisierungen der Et -Forks entstehen, wenn wichtige technische Neuerungen oder Änderungen am Netzwerk vorgenommen werden müssen. Sie stammen in der Regel von den [Ethereum-Verbesserungsvorschlägen (EIPs)](/eips) ab und verändern die "Richtlinien" des Protokolls. +Forks entstehen, wenn wichtige technische Neuerungen oder Änderungen am Netzwerk vorgenommen werden müssen. Sie stammen in der Regel von den [Ethereum-Verbesserungsvorschlägen (EIPs)](/eips/) ab und verändern die "Richtlinien" des Protokolls. Wenn für eine Standardsoftware eine Aktualisierung benötigt wird, veröffentlicht der Hersteller lediglich eine neue Version für den Endbenutzer. Blockchains arbeiten anders, da es keinen alleinigen Besitzer gibt. [Ethereum Anwendungen](/developers/docs/nodes-and-clients/) müssen die Software aktualisieren um neue Regeln zu implementieren. Plus Block Ersteller (Miner in einer Proof-of-Work Umgebung, Validatoren in einer Proof-of-Stake Umgebung) und Nodes erstellen neue Blöcke und müssen diese, entsprechend der neuen Richtlinien, validieren. [Mehr zu Konsensmechanismen](/developers/docs/consensus-mechanisms/) diff --git a/public/content/translations/de/guides/how-to-create-an-ethereum-account/index.md b/public/content/translations/de/guides/how-to-create-an-ethereum-account/index.md index c4d6753e1ce..8ee638f609e 100644 --- a/public/content/translations/de/guides/how-to-create-an-ethereum-account/index.md +++ b/public/content/translations/de/guides/how-to-create-an-ethereum-account/index.md @@ -42,8 +42,7 @@ Einige Apps werden Sie auffordern, eine geheime „Wiederherstellungsphrase“ ( -
    Wallet installiert?
    Erfahren Sie, wie Sie sie verwenden. -
    +
    Wallet installiert?
    Erfahren Sie, wie Sie sie verwenden.
    So verwenden Sie eine Wallet diff --git a/public/content/translations/de/guides/how-to-revoke-token-access/index.md b/public/content/translations/de/guides/how-to-revoke-token-access/index.md index 59bf6b53032..70587dbc321 100644 --- a/public/content/translations/de/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/de/guides/how-to-revoke-token-access/index.md @@ -49,8 +49,7 @@ Wir empfehlen Ihnen, das Widerrufs-Tool nach einigen Minuten zu aktualisieren un -
    Möchten Sie mehr erfahren? -
    +
    Möchten Sie mehr erfahren?
    Sehen Sie unsere anderen Anleitungen diff --git a/public/content/translations/de/guides/how-to-swap-tokens/index.md b/public/content/translations/de/guides/how-to-swap-tokens/index.md index 69b481ac259..7ee9ebedcf2 100644 --- a/public/content/translations/de/guides/how-to-swap-tokens/index.md +++ b/public/content/translations/de/guides/how-to-swap-tokens/index.md @@ -52,8 +52,7 @@ Sie werden die getauschten Token automatisch in Ihrer Krypto-Wallet erhalten, we -
    Möchten Sie mehr erfahren? -
    +
    Möchten Sie mehr erfahren?
    Sehen Sie unsere anderen Anleitungen diff --git a/public/content/translations/de/guides/how-to-use-a-bridge/index.md b/public/content/translations/de/guides/how-to-use-a-bridge/index.md index aa4fd9914cc..5bc108e71c0 100644 --- a/public/content/translations/de/guides/how-to-use-a-bridge/index.md +++ b/public/content/translations/de/guides/how-to-use-a-bridge/index.md @@ -54,8 +54,7 @@ Sie können [chainlist.org](http://chainlist.org) verwenden, um die RPC-Details -
    Möchten Sie mehr erfahren? -
    +
    Möchten Sie mehr erfahren?
    Sehen Sie unsere anderen Anleitungen diff --git a/public/content/translations/de/guides/how-to-use-a-wallet/index.md b/public/content/translations/de/guides/how-to-use-a-wallet/index.md index 4919ad467eb..0832ba7639a 100644 --- a/public/content/translations/de/guides/how-to-use-a-wallet/index.md +++ b/public/content/translations/de/guides/how-to-use-a-wallet/index.md @@ -65,8 +65,7 @@ Ihre Adresse wird auf allen Ethereum Projekten dieselbe sein. Sie brauchen sich -
    Möchten Sie mehr erfahren? -
    +
    Möchten Sie mehr erfahren?
    Sehen Sie unsere anderen Anleitungen diff --git a/public/content/translations/de/nft/index.md b/public/content/translations/de/nft/index.md index cdc97c65d59..a774f649ec7 100644 --- a/public/content/translations/de/nft/index.md +++ b/public/content/translations/de/nft/index.md @@ -58,8 +58,7 @@ Vielleicht sind Sie ein Künstler, der seine Werke mithilfe von NFTs verbreiten -
    Entdecken, kaufen oder erstellen Sie Ihre eigene(n) NFT-Kunst/Sammelgegenstände ... -
    +
    Entdecken, kaufen oder erstellen Sie Ihre eigene(n) NFT-Kunst/Sammelgegenstände ...
    NFT-Kunst entdecken diff --git a/public/content/translations/de/payments/index.md b/public/content/translations/de/payments/index.md index 3bf21207194..54f6f7c8204 100644 --- a/public/content/translations/de/payments/index.md +++ b/public/content/translations/de/payments/index.md @@ -60,12 +60,12 @@ In Ländern, in denen ihre Zahlungsmittel vom Rest der Welt abgekoppelt wurden, -
    Erstellen Sie noch heute Ihr Ethereum-Konto mit einer Wallet-App. -
    +
    Erstellen Sie noch heute Ihr Ethereum-Konto mit einer Wallet-App.
    Jetzt loslegen
    +
    ## Bezahlen mit selbstverwalteten Krypto-Karten {#pay-with-self-custodial-crypto-cards} @@ -198,10 +198,10 @@ Von der Erleichterung der schnellen Katastrophenhilfe bis zur Stärkung globaler -
    Zeit, Ihr eigenes Ethereum-Konto zu erstellen. -
    +
    Zeit, Ihr eigenes Ethereum-Konto zu erstellen.
    Jetzt loslegen!
    +
    diff --git a/public/content/translations/de/prediction-markets/index.md b/public/content/translations/de/prediction-markets/index.md index fce64fa499a..552054a2f8d 100644 --- a/public/content/translations/de/prediction-markets/index.md +++ b/public/content/translations/de/prediction-markets/index.md @@ -56,7 +56,9 @@ Es sind mehrere auf Ethereum basierende Prognosemärkte verfügbar. Dies sind ei

    Achten Sie auf die Risiken

    Wetten Sie nur, was Sie sich leisten können, und seien Sie sich des potenziellen Suchtverhaltens bewusst.

    +
    +
    ## Herausforderungen und Risiken {#challenges-and-risks} diff --git a/public/content/translations/de/roadmap/beacon-chain/index.md b/public/content/translations/de/roadmap/beacon-chain/index.md index 20c2f249734..c63afdc0641 100644 --- a/public/content/translations/de/roadmap/beacon-chain/index.md +++ b/public/content/translations/de/roadmap/beacon-chain/index.md @@ -19,6 +19,7 @@ summaryPoint3: "Mit der Beacon Chain wurde die Konsenslogik und das Block-Gossip Die Beacon Chain ist der Name der ursprünglichen Proof-of-Stake (Anteilsnachweis) Blockchain, die im Jahr 2020 eingeführt wurde. Sie wurde geschaffen, um sicherzustellen, dass die Proof-of-Stake Konsenslogik sicher und nachhaltig ist, bevor sie auf dem Ethereum Mainnet eingeführt wurde. Sie wurde daher neben dem ursprünglichen Proof-of-Work Konsens für Ethereum betrieben. Die Beacon Chain bestand aus 'leeren' Blöcken. Die Umstellung von Proof-of-Work (Arbeitsnachweis) auf den Proof-of-Stake (Anteilsnachweis) Mechanismus auf Ethereum erforderte jedoch, dass die Beacon Chain angewiesen wurde, Transaktionsdaten von Ausführungsklienten anzunehmen, sie zu Blockbündeln zusammenzuführen und sie dann mithilfe eines auf dem Proof-of-Stake-Mechanismus basierenden Konsensverfahrens in eine Blockchain zu organisieren. Zur gleichen Zeit haben die ursprünglichen Ethereum Clients ihr Mining, die Blockausbreitung und die Konsenslogik abgeschaltet und alles an die Beacon Chain übergeben. Dieses Ereignis war als [The Merge](/roadmap/merge/) bekannt. Nachdem das Merge (Fusion)-Ereignis erfolgreich abgeschlossen war, existierten keine zwei Blockchains mehr. Stattdessen existierte nur noch ein Proof-of-Stake Ethereum, für das nun pro Knoten zwei verschiedene Klienten erforderlich waren. Die Beacon Chain ist nun die Konsensus-Ebene, ein Peer-to-Peer-Netzwerk von Konsens-Clients, das für den Block-Tratsch und die Konsensus-Logik zuständig ist, während die ursprünglichen Clients die Ausführungs-Ebene bilden, die für den Tratsch und die Ausführung von Transaktionen sowie die Verwaltung des Ethereum-Status verantwortlich ist. Die beiden Schichten können über die Engine-API miteinander kommunizieren. ## Welche Funktion hat die Beacon Chain? {#what-does-the-beacon-chain-do} + Die Beacon Chain ist die Bezeichnung für ein Hauptbuch von Konten, das das Netzwerk der Ethereum-[Staker](/staking/) betrieb und koordinierte, bevor diese Staker mit der Validierung echter Ethereum-Blöcke begannen. Es werden jedoch keine Transaktionen verarbeitet oder Smart-Contract-Interaktionen abgewickelt, da dies in der Ausführungs-Ebene geschieht. Die Beacon Chain ist verantwortlich für Dinge wie die Handhabung von Blöcken und Bescheinigungen, die Ausführung des Fork-Choice-Algorithmus und die Verwaltung von Belohnungen und Strafen. Lesen Sie mehr auf unserer [Seite zur Node-Architektur](/developers/docs/nodes-and-clients/node-architecture/#node-comparison). diff --git a/public/content/translations/de/roadmap/dencun/index.md b/public/content/translations/de/roadmap/dencun/index.md index 64087ab051d..200c87061cf 100644 --- a/public/content/translations/de/roadmap/dencun/index.md +++ b/public/content/translations/de/roadmap/dencun/index.md @@ -6,9 +6,9 @@ lang: de # Cancun-Deneb (Dencun) {#dencun} -Cancun-Deneb (Dencun) ist ein Upgrade des Ethereum-Netzwerks, bei dem **Proto-Danksharding (EIP-4844)** aktiviert wird. Im Zuge dessen werden temporäre Daten **Blobs** für günstigere [Layer 2 (L2)](/Glossar/#layer-2)-Rollup-Speicherung einführt. +Cancun-Deneb (Dencun) ist ein Upgrade des Ethereum-Netzwerks, bei dem **Proto-Danksharding (EIP-4844)** aktiviert wird. Im Zuge dessen werden temporäre Daten **Blobs** für günstigere [Layer 2 (L2)](/glossary/#layer-2)-Rollup-Speicherung einführt. -Ein neuer Transaktionstyp ermöglicht es Rollup-Anbietern, Daten kostengünstiger in sogenannten „Blobs“ zu speichern. Diese Blobs stehen dem Netzwerk etwa 18 Tage lang garantiert zur Verfügung (genauer gesagt 4096 [Epochen](/Glossar/#epoch)). Nach Ablauf dieser Zeit werden die Blobs aus dem Netzwerk entfernt, aber die Anwendungen können die Gültigkeit ihrer Daten immer noch mithilfe von Nachweisen verifizieren. +Ein neuer Transaktionstyp ermöglicht es Rollup-Anbietern, Daten kostengünstiger in sogenannten „Blobs“ zu speichern. Diese Blobs stehen dem Netzwerk etwa 18 Tage lang garantiert zur Verfügung (genauer gesagt 4096 [Epochen](/glossary/#epoch)). Nach Ablauf dieser Zeit werden die Blobs aus dem Netzwerk entfernt, aber die Anwendungen können die Gültigkeit ihrer Daten immer noch mithilfe von Nachweisen verifizieren. Dies senkt die Kosten für Rollups erheblich, begrenzt das Wachstum der Chain und sorgt dafür, dass mehr Nutzer unterstützt werden. Gleichzeitig bleibt die Sicherheit und eine dezentralisierte Gruppe von Knotenpunktbetreibern erhalten. @@ -23,7 +23,7 @@ Dies senkt die Kosten für Rollups erheblich, begrenzt das Wachstum der Chain un - **Kein Handlungsbedarf für Ihre ETH**: Nach dem Upgrade Ethereum Dencun besteht keine Notwendigkeit, Ihre ETH umzuwandeln oder zu aktualisieren. Ihre Kontoguthaben bleiben unverändert und die ETH, die Sie derzeit besitzen, bleiben auch nach der harten Abspaltung in der bestehenden Form zugänglich. - **Vorsicht vor Betrug!** **Jeder, der Sie anweist, Ihre ETH zu „aktualisieren“, versucht, Sie zu betrügen.** Es gibt nichts, was Sie in Bezug auf dieses Upgrade tun müssen. Ihre Assets bleiben davon völlig unberührt. Denken Sie daran: Informiert zu sein ist der beste Schutz vor Betrug. -[Mehr zur Erkennung und Vermeidung von Betrug](/Sicherheit/) +[Mehr zur Erkennung und Vermeidung von Betrug](/security/) ## Welches Problem wird durch das Update des Dencun-Netzwerks gelöst? {#network-impact} @@ -31,7 +31,7 @@ Dencun zielt in erster Linie auf **Skalierbarkeit** (Handhabung von mehr Nutzern Die Ethereum-Community hat sich für ihr Wachstum für einen „Rollup-zentrierten“ Ansatz entschlossen, bei dem Layer-2-Rollups das wichtigste Mittel für die sichere Unterstützung von mehr Nutzern sind. -Rollup-Netzwerke wickeln die _Verarbeitung_ (oder „Ausführung“) von Transaktionen getrennt vom Mainnet ab und veröffentlichen dann zur Aufbewahrung einen kryptografischen Beweis und/oder komprimierte Transaktionsdaten der Ergebnisse zurück im Mainnet. Die Speicherung dieser Nachweise ist mit Kosten verbunden (in Form von [Gas](/Glossar/#gas)). Diese mussten vor dem Proto-Danksharding von allen Betreibern von Netzwerkknoten dauerhaft gespeichert werden, was eine teure Angelegenheit ist. +Rollup-Netzwerke wickeln die _Verarbeitung_ (oder „Ausführung“) von Transaktionen getrennt vom Mainnet ab und veröffentlichen dann zur Aufbewahrung einen kryptografischen Beweis und/oder komprimierte Transaktionsdaten der Ergebnisse zurück im Mainnet. Die Speicherung dieser Nachweise ist mit Kosten verbunden (in Form von [Gas](/glossary/#gas)). Diese mussten vor dem Proto-Danksharding von allen Betreibern von Netzwerkknoten dauerhaft gespeichert werden, was eine teure Angelegenheit ist. Durch die Einführung von Proto-Danksharding im Dencun-Upgrade wird die Datenspeicherung für diese Nachweise kostengünstiger, da die Betreiber der Knoten diese Daten nur noch etwa 18 Tage lang speichern müssen. Nach diesem Zeitraum können die Daten sicher entfernt werden, um eine Ausweitung der Hardwareanforderungen zu verhindern. Da Rollups in der Regel eine Abhebungsfrist von 7 Tagen haben, bleibt ihr Sicherheitsmodell unverändert, solange Blobs für diesen Zeitraum auf L1 verfügbar sind. Das 18-tägige Zeitfenster für die Löschung bietet einen erheblichen Puffer für diesen Zeitraum. diff --git a/public/content/translations/de/roadmap/fusaka/index.md b/public/content/translations/de/roadmap/fusaka/index.md index ea4d90f7205..aa15c94eb83 100644 --- a/public/content/translations/de/roadmap/fusaka/index.md +++ b/public/content/translations/de/roadmap/fusaka/index.md @@ -194,7 +194,7 @@ Ja, das Fusaka-Upgrade erfordert Updates für [Execution Clients und Consensus C - **Keine Aktion für Ihre ETH erforderlich**: Nach dem Ethereum-Fusaka-Upgrade müssen Sie Ihre ETH nicht umwandeln oder upgraden. Ihre Kontoguthaben bleiben unverändert und die ETH, die Sie derzeit besitzen, bleiben auch nach der harten Abspaltung in der bestehenden Form zugänglich. - **Vorsicht vor Betrug!** **Jeder, der Sie anweist, Ihre ETH zu „aktualisieren“, versucht, Sie zu betrügen.** Es gibt nichts, was Sie in Bezug auf dieses Upgrade tun müssen. Ihre Assets bleiben davon völlig unberührt. Denken Sie daran: Informiert zu sein ist der beste Schutz vor Betrug. -[Mehr zur Erkennung und Vermeidung von Betrug](/Sicherheit/) +[Mehr zur Erkennung und Vermeidung von Betrug](/security/) ### Was hat es mit den Zebras auf sich? {#whats-with-the-zebras} diff --git a/public/content/translations/de/roadmap/merge/issuance/index.md b/public/content/translations/de/roadmap/merge/issuance/index.md index b5562115967..5d8db352395 100644 --- a/public/content/translations/de/roadmap/merge/issuance/index.md +++ b/public/content/translations/de/roadmap/merge/issuance/index.md @@ -62,7 +62,9 @@ Gesamtes ETH-Angebot: **~120.520.000 ETH** (zum Zeitpunkt von The Merge im Septe **~11,3 %** wurden an Staker auf der Konsensebene emittiert (0,52 / 4,61 \* 100) +
    +
    ## Nach dem Merge (heute) {#post-merge} @@ -96,7 +98,9 @@ Gesamte annualisierte Emissionsrate: **~0,52 %** Nettorückgang der jährlichen ETH-Emission: **~88,7 %** ((4,61 % - 0,52 %) / 4,61 % \* 100) +
    +
    ## Die Verbrennung {#the-burn} @@ -109,7 +113,9 @@ Die Gegenkraft zur ETH-Ausgabe ist die Geschwindigkeit, mit der die ETH verbrann Das Verbrennen von Gebühren wurde mit dem [London-Upgrade](/ethereum-forks/#london) im August 2021 eingeführt und ist seit The Merge unverändert. +
    +
    Zusätzlich zu den Gebühren, die durch das London Upgrade verbrannt werden, können Validatoren auch mit Strafen belegt werden, wenn sie offline sind, oder schlimmer noch, ihr Stake kann gekürzt werden, wenn sie gegen bestimmte Regeln verstoßen, die die Netzsicherheit gefährden. Diese Strafen führen zu einer Verringerung des ETH-Guthabens dieses Validators, das nicht auf ein anderes Konto überwiesen wird, sondern effektiv verbrannt/aus dem Verkehr gezogen wird. diff --git a/public/content/translations/de/roadmap/pectra/index.md b/public/content/translations/de/roadmap/pectra/index.md index f8401707961..2ce0db16fa2 100644 --- a/public/content/translations/de/roadmap/pectra/index.md +++ b/public/content/translations/de/roadmap/pectra/index.md @@ -105,7 +105,7 @@ Ja, das Pectra-Upgrade erfordert Updates sowohl für [Ausführungs-Clients als a - **Keine Aktion für deine ETH erforderlich**: Nach dem Ethereum-Pectra-Upgrade ist es nicht notwendig, deine ETH umzuwandeln oder zu aktualisieren. Ihre Kontoguthaben bleiben unverändert und die ETH, die Sie derzeit besitzen, bleiben auch nach der harten Abspaltung in der bestehenden Form zugänglich. - **Vorsicht vor Betrug!** **Jeder, der Sie anweist, Ihre ETH zu „aktualisieren“, versucht, Sie zu betrügen.** Es gibt nichts, was Sie in Bezug auf dieses Upgrade tun müssen. Ihre Assets bleiben davon völlig unberührt. Denken Sie daran: Informiert zu sein ist der beste Schutz vor Betrug. -[Mehr zur Erkennung und Vermeidung von Betrug](/Sicherheit/) +[Mehr zur Erkennung und Vermeidung von Betrug](/security/) ## Eher der visuelle Lernende? {#visual-learner} diff --git a/public/content/translations/de/staking/pools/index.md b/public/content/translations/de/staking/pools/index.md index cdf8d71f63e..9559d5db6c9 100644 --- a/public/content/translations/de/staking/pools/index.md +++ b/public/content/translations/de/staking/pools/index.md @@ -14,6 +14,7 @@ summaryPoints: --- ## Was sind Staking-Pools? {#what-are-staking-pools} + Staking-Pools sind ein kollaborativer Ansatz, um es vielen Menschen mit kleineren ETH-Beträgen zu ermöglichen, die 32 ETH zu erhalten, die zur Aktivierung eines Satzes von Validator-Schlüsseln erforderlich sind. Die Pooling-Funktionalität wird innerhalb des Protokolls nicht nativ unterstützt, daher wurden separate Lösungen entwickelt, um diesen Bedarf zu decken. Einige Pools arbeiten mit Smart Contracts, bei denen Gelder in einen Vertrag eingezahlt werden können, der Ihren Einsatz (Stake) vertrauenswürdig verwaltet und verfolgt und Ihnen einen Token ausstellt, der diesen Wert widerspiegelt. Andere Pools beinhalten möglicherweise keine Smart-Contracts und werden stattdessen off-chain vermittelt. diff --git a/public/content/translations/de/staking/solo/index.md b/public/content/translations/de/staking/solo/index.md index 0770029cc61..b1b97634da7 100644 --- a/public/content/translations/de/staking/solo/index.md +++ b/public/content/translations/de/staking/solo/index.md @@ -71,6 +71,7 @@ Im Gegensatz zu Inaktivitätsstrafen für das Offline-Sein ist Slashing Mehr über Slashing und den Lebenszyklus von Validatoren
    + diff --git a/public/content/translations/de/web3/index.md b/public/content/translations/de/web3/index.md index dbac1da16ba..c1d8efa8b4d 100644 --- a/public/content/translations/de/web3/index.md +++ b/public/content/translations/de/web3/index.md @@ -69,8 +69,7 @@ Web3 ermöglicht direktes Eigentum durch [nicht-fungible Token (NFTs)](/glossary -
    Mehr über NFTs erfahren -
    +
    Mehr über NFTs erfahren
    Mehr zu NFTs @@ -98,8 +97,7 @@ Allerdings definieren Menschen viele Web3-Communities als DAOs. Diese Gemeinscha -
    Erfahren Sie mehr über DAOs -
    +
    Erfahren Sie mehr über DAOs
    Mehr über DAOs diff --git a/public/content/translations/de/wrapped-eth/index.md b/public/content/translations/de/wrapped-eth/index.md index 43f942a8cf0..2d6bcc72169 100644 --- a/public/content/translations/de/wrapped-eth/index.md +++ b/public/content/translations/de/wrapped-eth/index.md @@ -8,8 +8,7 @@ lang: de -
    Verbinden Sie Ihr Wallet, um ETH auf einer beliebigen Chain auf [WrapETH.com](https://www.wrapeth.com/) zu wrappen oder zu unwrappen. -
    +
    Verbinden Sie Ihr Wallet, um ETH auf einer beliebigen Chain auf [WrapETH.com](https://www.wrapeth.com/) zu wrappen oder zu unwrappen.
    Ether (ETH) ist die Hauptwährung von Ethereum. Es wird für verschiedene Zwecke verwendet, wie Staking, als Währung und zur Bezahlung von Gasgebühren für Berechnungen. **WETH ist im Grunde eine erweiterte Form von ETH mit gewisser zusätzlicher Funktionalität, die von vielen Anwendungen und [ERC-20-Token](/glossary/#erc-20)** benötigt wird, welche andere Arten von digitalen Assets auf Ethereum darstellen. Um mit diesen Token arbeiten zu können, muss ETH dieselben Regeln befolgen, auch als ERC-20-Standard bekannt. From a793004b8e7fc34c11e37867cff01cd53c32470f Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 13 Feb 2026 17:23:39 +0000 Subject: [PATCH 5/9] chore: trigger rebuild From bd96fa22f184641173c51a31c4b8fb15bcf5cb55 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 13 Feb 2026 19:29:29 +0000 Subject: [PATCH 6/9] fix(i18n): remove escaped quotes in de/zero-knowledge-proofs --- .../content/translations/de/zero-knowledge-proofs/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/content/translations/de/zero-knowledge-proofs/index.md b/public/content/translations/de/zero-knowledge-proofs/index.md index b1b799bf0f4..b7abcd5e676 100644 --- a/public/content/translations/de/zero-knowledge-proofs/index.md +++ b/public/content/translations/de/zero-knowledge-proofs/index.md @@ -54,10 +54,10 @@ Zero-Knowledge-Beweise sind besonders nützlich im Kontext der [dezentralen Iden

    - Ein reales Beispiel für die Verwendung von ZKP für Identitätsmanagementsysteme ist das National Digital ID (NDI)-System des Königreichs Bhutan, das auf Ethereum aufbaut. Bhutans NDI verwendet ZKPs, um es den Bürgern zu ermöglichen, Fakten über sich selbst kryptografisch zu beweisen, wie z. B. \"Ich bin Staatsbürger\" oder \"Ich bin über 18\", ohne die sensiblen persönlichen Daten auf ihrem Ausweis preiszugeben. + Ein reales Beispiel für die Verwendung von ZKP für Identitätsmanagementsysteme ist das National Digital ID (NDI)-System des Königreichs Bhutan, das auf Ethereum aufbaut. Bhutans NDI verwendet ZKPs, um es den Bürgern zu ermöglichen, Fakten über sich selbst kryptografisch zu beweisen, wie z. B. "Ich bin Staatsbürger" oder "Ich bin über 18", ohne die sensiblen persönlichen Daten auf ihrem Ausweis preiszugeben.

    - Erfahre mehr über Bhutan NDI in der Fallstudie zur dezentralen Identität. + Erfahre mehr über Bhutan NDI in der Fallstudie zur dezentralen Identität.

    @@ -111,7 +111,7 @@ Zum Beispiel stützen sich [quadratische Finanzierungsmechanismen](https://www.r Durch die Verwendung von Offchain Voting ist die quadratische Finanzierung anfällig für Absprachen: Blockchain-Transaktionen sind öffentlich, sodass bestecher die Offchain Aktivitäten eines Bestechlichen überprüfen können, um zu sehen, wie dieser „abgestimmt“ hat. Auf diese Weise ist die quadratische Finanzierung kein effektives Mittel mehr, um Gelder auf der Grundlage der aggregierten Präferenzen der Gemeinschaft zuzuweisen. -Glücklicherweise verwenden neuere Lösungen wie MACI (Minimum Anti-Collusion Infrastructure) Zero-Knowledge-Beweise, um On-Chain-Abstimmungen (z. B. quadratische Finanzierungsmechanismen) resistent gegen Bestechung und Kollusion zu machen. MACI ist ein Satz von Smart Contracts und Skripten, die es einem zentralen Administrator (genannt \"Koordinator\") ermöglichen, Stimmen zu sammeln und Ergebnisse zusammenzuzählen, _ohne_ Details darüber preiszugeben, wie jede einzelne Person abgestimmt hat. Trotzdem ist es immer noch möglich zu überprüfen, ob die Stimmen korrekt gezählt wurden, oder zu bestätigen, dass eine bestimmte Person an der Abstimmungsrunde teilgenommen hat. +Glücklicherweise verwenden neuere Lösungen wie MACI (Minimum Anti-Collusion Infrastructure) Zero-Knowledge-Beweise, um On-Chain-Abstimmungen (z. B. quadratische Finanzierungsmechanismen) resistent gegen Bestechung und Kollusion zu machen. MACI ist ein Satz von Smart Contracts und Skripten, die es einem zentralen Administrator (genannt "Koordinator") ermöglichen, Stimmen zu sammeln und Ergebnisse zusammenzuzählen, _ohne_ Details darüber preiszugeben, wie jede einzelne Person abgestimmt hat. Trotzdem ist es immer noch möglich zu überprüfen, ob die Stimmen korrekt gezählt wurden, oder zu bestätigen, dass eine bestimmte Person an der Abstimmungsrunde teilgenommen hat. #### Wie arbeitet MACI mit Null-Wissen-Beweisen? {#how-maci-works-with-zk-proofs} From 112855d8b5aa7bbd2a0fc19c961acc3a47c564e9 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 13 Feb 2026 19:43:49 +0000 Subject: [PATCH 7/9] chore: trigger rebuild From 2cc9f07f2372cb35f31d837c53197df8e4be0ef5 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 13 Feb 2026 21:52:49 +0000 Subject: [PATCH 8/9] chore: trigger rebuild (batched) From 5df69404dc1ac6fffd3ced2845fdac2f4d62e465 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 13 Feb 2026 22:22:19 +0000 Subject: [PATCH 9/9] chore: trigger rebuild